코드 검토 및 문서 반영

This commit is contained in:
2026-07-02 22:13:38 +09:00
parent 2d9b8d0624
commit 854a3e2bfb
9 changed files with 115 additions and 97 deletions
+42 -5
View File
@@ -162,7 +162,11 @@ chocoadmin/
│ │ ├── maestros/
│ │ │ ├── page.tsx # 마에스트로 전체 목록
│ │ │ └── [maestroId]/
│ │ │ ── page.tsx # 마에스트로 상세 정보
│ │ │ ── page.tsx # 마에스트로 상세 정보 (server)
│ │ │ ├── MaestroEditForm.tsx # 기본 정보 수정 폼 (client)
│ │ │ ├── StudentsSection.tsx # 학생 목록 + 검색/페이지네이션 (client)
│ │ │ ├── ExtensionRequestsSection.tsx # 연장 신청 이력 + [연장] 버튼 (client)
│ │ │ └── UpgradeRequestsSection.tsx # 업그레이드 신청 이력 + 신청 UI (client)
│ │ ├── extension-requests/
│ │ │ └── page.tsx # 연장 신청 목록 + 승인/취소
│ │ └── upgrade-requests/
@@ -172,8 +176,10 @@ chocoadmin/
│ ├── maestros/
│ │ ├── route.ts # GET: 목록
│ │ └── [id]/
│ │ ├── route.ts # GET: 상세, PATCH: 정보 수정
│ │ ── students/route.ts # GET: 학생 목록
│ │ ├── route.ts # GET: 상세, PATCH: 정보 수정
│ │ ── students/route.ts # GET: 학생 목록
│ │ ├── extension-requests/route.ts # POST: 연장 신청 등록 (관리자 직접)
│ │ └── upgrade-requests/route.ts # POST: 업그레이드 신청 등록 (관리자 직접)
│ ├── extension-requests/
│ │ └── [id]/route.ts # PATCH: 승인/취소
│ └── upgrade-requests/
@@ -237,8 +243,15 @@ chocoadmin/
- 플레이어(학생) 전체 목록
- 서버 사이드 페이지네이션
- 이름 검색
- 연장 신청 이력
- 업그레이드 신청 이력
- 연장 신청 이력 + [연장] 버튼
- 유료 요금제 계정에서만 버튼 활성화 (체험 계정 비활성)
- 클릭 시 현재 `AccountType`으로 `maestro_extension` INSERT (서버에서 DB 조회)
- 등록 후 이력 목록 즉시 갱신 (`router.refresh()`)
- 업그레이드 신청 이력 + 요금제 콤보박스 + [업그레이드] 버튼
- 콤보박스: 현재 요금제 이하 항목 비활성화, 상위 요금제만 선택 가능
- 클릭 시 선택한 `requestedAccountType`으로 `maestro_upgrade` INSERT (트랜잭션 내 서버 조회)
- 서버에서 `requestedAccountType > maestro.AccountType` 검증 (다운그레이드 차단)
- 등록 후 이력 목록 즉시 갱신 (`router.refresh()`)
- 관리자 처리 로그 (`maestro_log`)
### 7-4. 연장 신청 목록 (`/extension-requests`)
@@ -498,6 +511,30 @@ chocoadmin/
- [ ] 업그레이드 승인 후 유료→유료 케이스: `{prev_price}원` 본문 확인
- [x] SMTP 오류 시 승인 API 200 응답 + `error: send failed` 로그 확인
### Phase 12. 관리자 직접 연장/업그레이드 신청 등록
> 마에스트로 상세 화면에서 관리자가 직접 연장·업그레이드 신청을 DB에 등록할 수 있도록 한다. 메일 발송은 하지 않는다.
- [x] 연장 신청 등록 API 구현 (`POST /api/maestros/[id]/extension-requests`)
- [x] 서버에서 `maestro.AccountType` 직접 조회 — 클라이언트 값 신뢰 안 함
- [x] 유료 요금제 계정이 아닌 경우 400 반환 (체험 계정 차단)
- [x] `maestro_extension` INSERT (`AccountType`, `RequestedDateTime`, `Status=1`)
- [x] 업그레이드 신청 등록 API 구현 (`POST /api/maestros/[id]/upgrade-requests`)
- [x] 트랜잭션 내에서 `maestro` SELECT → `maestro_upgrade` INSERT (원자성 보장)
- [x] `requestedAccountType > maestro.AccountType` 검증 (다운그레이드 차단, 400 반환)
- [x] `RegisteredActivateStatus`, `RegisteredAccountType` 서버 DB 조회값으로 저장
- [x] 연장 신청 이력 클라이언트 컴포넌트 (`ExtensionRequestsSection.tsx`)
- [x] 섹션 우상단 [연장] 버튼
- [x] 체험 계정 (`AccountType``PAID_ACCOUNT_TYPE_VALUES`) 시 버튼 비활성화
- [x] 등록 성공 후 `router.refresh()`로 이력 테이블 즉시 갱신
- [x] 업그레이드 신청 이력 클라이언트 컴포넌트 (`UpgradeRequestsSection.tsx`)
- [x] 섹션 우상단 요금제 콤보박스 + [업그레이드] 버튼
- [x] 현재 요금제 이하 옵션 `disabled`, 상위 요금제만 선택 가능
- [x] 선택 후 등록 성공 시 콤보박스 초기화 + `router.refresh()`
- [x] `PAID_ACCOUNT_TYPE_VALUES` 공용 상수로 추출 (`lib/constants.ts`)
- [x] 기존 `lib/maestros.ts`의 로컬 정의 제거 및 import로 교체
- [x] 두 신규 API route의 로컬 정의 제거 및 import로 교체
---
## 10. MVP 범위