use std::path::PathBuf; use std::sync::Arc; use cache::CacheClient; use models::repo::repos; use models::space::spaces; use sea_orm::{ColumnTrait, EntityTrait, QueryFilter}; use crate::context::facade::GitContext; use crate::service::GitService; use crate::share::access::space_for_dir; 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 = spaces::Entity::find() .filter(spaces::Column::LowerName.eq(&space_lower)) .filter(spaces::Column::IsActive.eq(true)) .one(self.db_read()) .await? .ok_or(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 space_for_dir(self.db_read(), candidate.dir_id) .await? .is_some_and(|s| s.id == space.id) { found = Some(candidate); break; } } found.ok_or(GitError::NotFound)? }; let cache = Arc::new(CacheClient::new(self.state.redis.clone())); let git = &self.state.config.git; Ok(GitContext { model: repo, cache, database: self.state.database.clone(), space_name: space.lower_name, repo_root: PathBuf::from(&git.repo_root), ks: self.ks().clone(), }) } }