Skip to content
Clone
194c44c
64 lines 1.9 KB Rust
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<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 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(),
repo_root: PathBuf::from(&git.repo_root),
objects_root: PathBuf::from(&git.objects_root),
})
}
}