a06673b
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<RepoView> {
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))
}