use db::conn::sea_orm::*; use db::repo::repos as repo_entity; use time::OffsetDateTime; use uuid::Uuid; use crate::error::{RepoError, RepoResult}; use crate::features::RepoService; use crate::path::validate_repo_name; use super::super::types::{GenerateRepoOption, RepoView}; use super::helpers::require_authenticated; pub async fn generate_repo( svc: &RepoService, actor: Uuid, repo_id: Uuid, input: GenerateRepoOption, ) -> RepoResult { require_authenticated(actor)?; let source = repo_entity::Entity::find_by_id(repo_id) .one(&svc.db.reader()) .await? .ok_or_else(|| RepoError::NotFound(format!("source repo {repo_id}")))?; let new_name = validate_repo_name(&input.name, svc.config.max_repo_name_len)?; let db = svc.db.writer(); let now = OffsetDateTime::now_utc(); let new_id = Uuid::new_v4(); let active: repo_entity::ActiveModel = repo_entity::ActiveModel { id: Set(new_id), channel_id: Set(input.to_channel_id), lower_name: Set(new_name.clone()), name: Set(new_name), description: Set(input.description.or(source.description)), website: Set(source.website), default_branch: Set(source.default_branch.clone()), nums_watch: Set(0), nums_star: Set(0), nums_pr: Set(0), nums_commits: Set(0), nums_branches: Set(0), nums_tags: Set(0), enable_lfs: Set(source.enable_lfs), is_private: Set(input.is_private.unwrap_or(source.is_private)), is_archived: Set(false), storage_limit_size: Set(source.storage_limit_size), size: Set(0), git_size: Set(0), lfs_size: Set(0), avatar_url: Set(source.avatar_url), primary_language: Set(source.primary_language), license_name: Set(source.license_name), created_at: Set(now), last_pushed_at: Set(None), archived_at: Set(None), readme_raw: Set(source.readme_raw), allow_rebase: Set(source.allow_rebase), allow_rebase_explicit: Set(source.allow_rebase_explicit), allow_squash_merge: Set(source.allow_squash_merge), allow_merge_commits: Set(source.allow_merge_commits), object_format: Set(source.object_format.clone()), }; let saved = active.insert(&db).await?; Ok(RepoView::from(saved)) }