use models::repo::repos; use sea_orm::{ColumnTrait, EntityTrait, QueryFilter}; use crate::context::facade::GitContext; use crate::service::GitService; use crate::share::access; use crate::share::errors::GitError; impl GitService { pub async fn context( &self, space_name: String, repo_name: String, ) -> Result { let space_lower = space_name.trim().to_lowercase(); if space_lower.is_empty() { return Err(GitError::NotFound); } let space = self.access.by_slug(&space_lower).await?; let repo_lower = repo_name.trim().to_lowercase(); if repo_lower.is_empty() { return Err(GitError::NotFound); } let candidates = repos::Entity::find() .filter(repos::Column::LowerName.eq(&repo_lower)) .all(self.db_read()) .await?; let repo = { let mut found = None; for candidate in candidates { if access::space_for_dir(&self.access, candidate.dir_id) .await? .is_some_and(|s| s.id() == space.id()) { found = Some(candidate); break; } } found.ok_or(GitError::NotFound)? }; Ok(self .state .context(self.database.clone(), repo, space.slug().to_owned())) } }