Skip to content
Clone
23daab3
47 lines 1.4 KB Rust
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<GitContext, GitError> {
let space_lower = space_name.trim().to_lowercase();
if space_lower.is_empty() {
return Err(GitError::NotFound);
}
let space = self.access.by_slug(&space_lower).await?;
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.access, candidate.dir_id)
.await?
.is_some_and(|s| s.id() == space.id())
{
found = Some(candidate);
break;
}
}
found.ok_or(GitError::NotFound)?
};
Ok(self
.state
.context(self.database.clone(), repo, space.slug().to_owned()))
}
}