use std::path::PathBuf; use std::sync::Arc; use cache::CacheClient; use models::dir::dirs; 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::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 repo = repos::Entity::find() .filter(repos::Column::LowerName.eq(&repo_lower)) .one(self.db_read()) .await? .ok_or(GitError::NotFound)?; let mut dir_id = repo.dir_id; let owned_by_space = loop { let dir = dirs::Entity::find_by_id(dir_id) .one(self.db_read()) .await? .ok_or(GitError::NotFound)?; if dir.space_id == Some(space.id) { break true; } match dir.parent_dir_id { Some(parent) => dir_id = parent, None => break false, } }; if !owned_by_space { return Err(GitError::NotFound); } let cache = Arc::new(CacheClient::new(&self.state.config.cache).await?); let git = &self.state.config.git; Ok(GitContext { model: repo, cache, database: self.state.database.clone(), repo_root: PathBuf::from(&git.repo_root), objects_root: PathBuf::from(&git.objects_root), }) } }