feat: 저장소 생성 시 설명 필수화 + 템플릿 복제 생성

- 프로젝트 설명을 생성 필수 항목으로 변경(CreateRepoDto.description required + 프론트 검증)
- 템플릿 복제: useTemplate=true 면 Gitea generate API 로 GITEA_TEMPLATE_OWNER/REPO
  (기본 TtiPo/project-base) 저장소를 복제 생성(브랜치는 템플릿을 따름)
- GET /repos/owner → /repos/meta 로 확장({ owner, template }) — 생성폼 메타 일괄 제공
- 프론트 생성폼: 가짜 템플릿 목록 제거 → 실제 템플릿 옵션, 설명 필수 UI
- env.example/ api-contract/ 진행현황 문서 갱신

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-17 00:20:21 +09:00
parent 6652e79768
commit 7f432a0013
13 changed files with 173 additions and 51 deletions
+10 -6
View File
@@ -1,5 +1,10 @@
import { useApi } from './useApi'
import type { ApiRepo, CreateRepoPayload, UpdateRepoPayload } from '@/types/repo'
import type {
ApiRepo,
CreateRepoPayload,
RepoCreateMeta,
UpdateRepoPayload,
} from '@/types/repo'
// 저장소 도메인 API Composable — 인터셉터가 success/data 를 언래핑
export function useRepo() {
@@ -9,10 +14,9 @@ export function useRepo() {
return (await api.get('/repos')) as unknown as ApiRepo[]
}
// 현재 조직(소유자) — 생성 폼의 "소유자 고정" 표시용
async function owner(): Promise<string> {
const res = (await api.get('/repos/owner')) as unknown as { owner: string }
return res.owner
// 저장소 생성 폼 메타(소유자/템플릿) — 생성 전 미리 조회
async function meta(): Promise<RepoCreateMeta> {
return (await api.get('/repos/meta')) as unknown as RepoCreateMeta
}
async function get(id: string): Promise<ApiRepo> {
@@ -31,5 +35,5 @@ export function useRepo() {
await api.delete(`/repos/${id}`)
}
return { list, owner, get, create, update, remove }
return { list, meta, get, create, update, remove }
}