Skip to content

T-37 게임 관리자 CRUD - #108

Open
ff1451 wants to merge 1 commit into
feat/t36-game-schema-public-apifrom
feat/t37-game-admin-crud
Open

T-37 게임 관리자 CRUD#108
ff1451 wants to merge 1 commit into
feat/t36-game-schema-public-apifrom
feat/t37-game-admin-crud

Conversation

@ff1451

@ff1451 ff1451 commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

요약

게임 기본정보·설명의 관리자 CRUD. T-36 PR(#106) 위에 스택한다 — T-36이 아직 머지되지 않았으므로 base를 feat/t36-game-schema-public-api로 잡았다. T-36이 머지되면 base가 자동으로 main으로 재조정된다.

변경 사항

  • POST/GET/PUT /v1/admin/games, PATCH .../slug, .../publish, .../order, DELETE(soft delete)
  • slug는 name에서 자동 파생, 중복이면 409(AC-9.1, AC-9.2)
  • description은 저장 시 ActivityContentSanitizer로 정제(ADR-008 재사용 — 활동 본문과 같은 jsoup 규칙)
  • ContentChangedPublishergameChanged/gameAndListChanged/gameListChanged 추가 — AdminTrackPageService(T-07)가 자기 태그 메서드를 그 자리에서 추가했던 것과 동일한 방식. HomepageSyncService의 강제 재검증 목록에도 게임 태그 포함.
  • SlugGeneratortrack/utilglobal/util로 승격 — 트랙·게임 둘 다 쓰는 도메인 무관 순수 함수라 DisplayOrders와 같은 자리로 옮겼다.

계획 변경

당초 docs/07-task-breakdown.md는 웹훅 태그 추가를 별도 T-42로 분리했었는데, 구현 중 재검토했다. T-07이 이미 그 자리에서 자기 태그를 추가한 전례가 있어, 별도 태스크로 미루면 이 PR이 ADR-010(저장 시 웹훅) 없이 머지되는 중간 상태가 생긴다. T-42는 폐기하고 이 PR에 흡수했다(문서에 기록).

테스트

AdminGameIntegrationTest(신규 9개) —

  • 토큰 없음 401 / MEMBER 권한 403
  • AC-9.1 slug 자동 생성, AC-9.2 중복 slug 409
  • AC-9.4 순서 변경 즉시 반영, AC-9.5 id 집합 불일치 시 400 + 무변경
  • AC-9.12/9.13 설명의 script·외부 이미지 정제
  • AC-9.11 소프트 삭제 후 공개·관리자 조회 모두 404
  • INV-7 게임 행을 실제로 DELETE하면 cascade 발동 (soft delete는 UPDATE라 cascade가 안 걸린다는 점을 확인하고, 이를 혼동했던 AC-9.11 문구도 함께 정정)

수동 검증

./gradlew test 전체 통과. 신규 마이그레이션 없음(T-36에서 이미 검증).

Refs #107

게임 기본정보·설명의 관리자 CRUD. 트랙 페이지(T-07)와 같은 패턴 — 스크린샷·
등급정보·참여멤버는 이 태스크가 다루지 않는다(T-38).

- POST/GET/PUT /v1/admin/games, PATCH .../slug, .../publish, .../order,
  DELETE(soft delete)
- slug는 name에서 자동 파생, 중복이면 409(AC-9.1, AC-9.2)
- description은 저장 시 ActivityContentSanitizer로 정제(ADR-008 재사용, INV-9, INV-10)
- ContentChangedPublisher에 gameChanged/gameAndListChanged/gameListChanged 추가 —
  AdminTrackPageService가 T-07에서 자기 태그 메서드를 그 자리에서 추가했던 것과
  동일한 방식. HomepageSyncService의 강제 재검증 목록에도 게임 태그를 포함시켰다.
  (당초 계획했던 별도 T-42 "웹훅 태그 추가" 태스크는 흡수 — docs/07 참고)
- SlugGenerator를 track/util → global/util로 승격 — 트랙과 게임 둘 다 쓰는
  도메인 무관 순수 함수라 DisplayOrders와 같은 자리로 옮겼다.

테스트: AdminGameIntegrationTest(신규 9개) —
- 토큰 없음 401 / MEMBER 권한 403
- AC-9.1 slug 자동 생성, AC-9.2 중복 slug 409
- AC-9.4 순서 변경이 공개 목록에 즉시 반영, AC-9.5 id 집합 불일치 시 400 + 무변경
- AC-9.12 설명의 script 태그 제거, AC-9.13 외부 호스트 이미지 제거
- AC-9.11 소프트 삭제 후 공개·관리자 조회 모두 404
- INV-7 게임 행을 실제로 DELETE하면 하위 데이터가 cascade로 삭제됨을 별도 검증
  (soft delete는 UPDATE라 cascade가 발동하지 않는다 — 애초 AC-9.11 문구가 이 둘을
  혼동해서 docs/02-acceptance-criteria.md도 함께 정정)

./gradlew test 전체 통과. 로컬 마이그레이션은 T-36에서 이미 검증됨(신규 마이그레이션 없음).

Refs #105
@coderabbitai

coderabbitai Bot commented Aug 30, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 16237f4f-5901-40db-8fd3-114aa367c431

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant