use std::path::PathBuf; 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 = space::authority::space_by_slug(&self.state, 0, &space_lower).await?; if !space::authority::space_is_active(&space) { return Err(GitError::NotFound); } 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.state, candidate.dir_id) .await? .is_some_and(|s| s.id == space.id) { found = Some(candidate); break; } } found.ok_or(GitError::NotFound)? }; let cache = self.state.cache.clone(); let git = &self.state.config.git; Ok(GitContext { model: repo, cache, database: self.state.database.clone(), space_name: space.slug, repo_root: PathBuf::from(&git.repo_root), ks: self.ks().clone(), }) } }