56417bd
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<GitContext, GitError> {
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),
})
}
}