Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
148ba5e
MSG-500 docs: 관리자 심사와 승인 반영, 노출 관리 스펙을 작성한다
s13121312 Aug 29, 2026
f7bf219
MSG-500 feat: 심사 흔적과 숨김 컬럼을 담는 V51 스키마와 엔티티를 확장한다
s13121312 Aug 30, 2026
ddc7402
MSG-500 feat: 심사·노출 중지용 에러 코드 7종을 event 대역에 신설한다
s13121312 Aug 30, 2026
cbcf2d4
MSG-500 refactor: 위치 응답 조립을 공용 뷰로 추출한다
s13121312 Aug 30, 2026
61eea77
MSG-500 feat: 관리자가 심사 큐와 신청 상세를 조회한다
s13121312 Aug 30, 2026
eb41d9e
MSG-500 docs: 스펙 에러 코드 표를 코드 현실에 동기화한다
s13121312 Aug 30, 2026
26d38fe
MSG-500 docs: 노출 중지와 승인 행사 목록 요구를 SRS에 선등재한다
s13121312 Aug 30, 2026
b548764
MSG-500 feat: 승인 미션 등재 계약과 커밋 후 스냅숏 무효화를 만든다
s13121312 Aug 30, 2026
23a7ab9
MSG-500 feat: 승인 재료를 만든다 - 셀 산술 공용화, 이미지 공개 복사, 원자 전이 쿼리
s13121312 Aug 30, 2026
e668c1a
MSG-500 feat: 관리자가 신청을 승인해 미션으로 등재하거나 반려한다
s13121312 Aug 30, 2026
78762f8
MSG-500 feat: 미션 숨김을 단일 컬럼 갱신과 커밋 후 무효화로 만든다
s13121312 Aug 30, 2026
4617f8a
MSG-500 feat: 중지된 미션을 상세·업로드·영상 피드에서 막는다
s13121312 Aug 30, 2026
533eb5e
MSG-500 feat: 관리자가 승인 행사를 상태별로 보고 노출을 중지한다
s13121312 Aug 30, 2026
2fe4243
MSG-500 test: 승인 산출물 생성이 실패하면 전이와 이력이 함께 롤백됨을 검증한다
s13121312 Aug 30, 2026
af0b519
MSG-500 test: 중지 커밋 후 스냅숏 무효화로 TTL 전에 목록에서 빠짐을 검증한다
s13121312 Aug 30, 2026
a4d2b94
MSG-500 refactor: 승인 행사 탭 파생 규칙을 컴파일 상수 한 벌로 접는다
s13121312 Aug 30, 2026
8216945
MSG-500 feat: 아이디 변경 심사용 에러 코드 3종을 신설한다
s13121312 Aug 30, 2026
f56e517
MSG-500 feat: 아이디 변경 심사의 원자 전이와 이메일 단일 컬럼 교체 쿼리를 만든다
s13121312 Aug 30, 2026
c7d253f
MSG-500 feat: 관리자가 아이디 변경 요청을 검토해 승인하거나 반려한다
s13121312 Aug 30, 2026
6eb097f
MSG-500 test: 아이디 변경 심사 검증 17건을 더한다
s13121312 Aug 30, 2026
b76b644
MSG-500 fix: 아이디 변경 승인이 사용자 행을 먼저 잠가 계정 삭제와 잠금 순서를 통일한다
s13121312 Aug 30, 2026
b79e03b
MSG-500 docs: 구현 현황과 작업 로그를 남긴다
s13121312 Aug 30, 2026
4466aa1
MSG-500 docs: 요구사항 상태를 구현 결과로 갱신하고 추적 매트릭스를 재생성한다
s13121312 Aug 30, 2026
183b772
MSG-500 fix: 같은 요청의 동시 재승인이 이메일 충돌이 아니라 이미 처리됨으로 수렴한다
s13121312 Aug 30, 2026
33fef30
MSG-500 docs: 선검사 순서 계약을 작업 로그에 기록한다
s13121312 Aug 30, 2026
75f412c
MSG-500 chore: develop을 병합해 참여형 접수를 들여온다
s13121312 Aug 30, 2026
c4541d8
MSG-500 feat: 행사 위치에 참여 속성과 숨김 컬럼을 매핑하고 조회·잠금 쿼리를 만든다
s13121312 Aug 30, 2026
efa217c
MSG-500 feat: 노출 영역 산술을 한 곳으로 모으고 재시드가 승인 확장을 보존한다
s13121312 Aug 30, 2026
80061d4
MSG-500 feat: 참여형 신청을 승인해 부모 회차 아래 행사 위치로 전개한다
s13121312 Aug 30, 2026
74c0db9
MSG-500 feat: 참여형 행사 중지가 위치를 숨기고 노출 영역을 되돌린다
s13121312 Aug 30, 2026
e589de0
MSG-500 feat: 숨긴 위치를 조회·업로드·영상·반응 전 경로에서 막고 참여 속성을 위치 응답에 싣는다
s13121312 Aug 30, 2026
f28e507
MSG-500 test: 참여형 승인·중지 검증 13건을 더한다
s13121312 Aug 30, 2026
eb3e218
MSG-500 docs: 참여형 완결로 작업 로그와 구현 현황을 현행화하고 버킷 정책 런북을 더한다
s13121312 Aug 30, 2026
e929bdf
MSG-500 docs: 참여형 완결로 요구사항 두 건을 구현됨으로 올린다
s13121312 Aug 30, 2026
1d65959
MSG-500 fix: 시더도 회차 잠금을 잡아 승인·중지와 상호 배제를 성립시킨다
s13121312 Aug 30, 2026
f9ff635
MSG-500 docs: 시더 검증 마커 반영으로 추적 매트릭스를 재생성한다
s13121312 Aug 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .claude/docs/deploy.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,13 @@ UPDATE users SET role = 'ADMIN' WHERE id = {대상 id};
200이 아니면 시더를 돌리지 않는다. 403인 채로 적재하면 전량을 나중에 다시 손봐야 한다.
dev 버킷은 2026-08-14 적용을 마쳤다(`PublicReadProfileOriginal`과 나란히 두 번째 Statement).
prod 버킷은 아직이다.
4. **`event-locations/org-submission/*` 공개 읽기 버킷 정책** (MSG-500) — 이벤트 참여형 승인이
커버 이미지를 이 프리픽스로 복사해 위치 목록 응답에 완성 공개 URL로 싣는다. 승인 미션
이미지가 쓰는 `missions/org-submission/`은 위 3번의 `missions/*` 정책이 이미 덮으므로 별도
조치가 없지만, 이 프리픽스는 **새 Statement가 필요하다**(3번과 같은 형태, Resource만
`event-locations/org-submission/*`). 열어 두지 않으면 참여형 승인 위치의 imageUrl이 403이다.
dev·prod 모두 미적용(2026-08-30 기준) — MSG-500 배포 전에 dev부터 적용하고 3번과 같은
curl 검증을 거친다.

### ⚠️ AWS 프로파일 — 로컬에 계정이 둘이고 기본값이 남의 계정이다

Expand Down
3 changes: 3 additions & 0 deletions .claude/docs/status.md

Large diffs are not rendered by default.

9 changes: 5 additions & 4 deletions docs/rtm.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
**병합 충돌이 나면 손으로 합치지 말고 재생성한다.** 어느 쪽이든 골라 충돌만 없앤 뒤(`git checkout --ours docs/rtm.md` 등)
스크립트를 다시 돌려 그 결과를 커밋한다. 이 표는 두 원천에서 계산되는 값이라 양쪽 diff를 섞으면 어느 쪽과도 다른 상태가 된다.

요약: FR 289건 중 테스트 연결 257건, 검증 공백 0건 (계획·폐기라 테스트 부재가 정상인 25건, 성격상 테스트 비대상 7건 별도)
요약: FR 291건 중 테스트 연결 260건, 검증 공백 0건 (계획·폐기라 테스트 부재가 정상인 24건, 성격상 테스트 비대상 7건 별도)

| 요구사항 ID | SRS 상태 | 검증 테스트 |
|---|---|---|
Expand Down Expand Up @@ -201,9 +201,11 @@
| FR-EVENT-12 | 구현됨 | MissionAwardQueryTest, MissionProgressQueryTest, MissionVideoCountQueryTest, MissionVideoListQueryTest, MissionVisitedGridQueryTest |
| FR-EVENT-13 | 구현됨 | EventSubmissionCommitBoundaryTest, EventSubmissionControllerTest, EventSubmissionImageStoreTest, EventSubmissionValidationTest |
| FR-EVENT-14 | 구현됨 | EventSubmissionCommitBoundaryTest, EventSubmissionControllerTest |
| FR-EVENT-15 | 계획 | (없음) |
| FR-EVENT-15 | 구현됨 | AdminEventParticipationApprovalTest, AdminEventSubmissionControllerTest, AdminEventSubmissionReviewTest, EventParticipationApprovalConcurrencyTest, EventSeederTest, EventSubmissionApprovalConcurrencyTest, EventSubmissionImageStoreTest, EventSubmissionReviewSchemaTest, MissionQueryServiceCacheTest |
| FR-EVENT-16 | 구현됨 | EventOccurrenceRepositoryTest, OrgEventControllerTest, OrgEventQueryServiceTest |
| FR-EVENT-17 | 구현됨 | EventSubmissionControllerTest, EventSubmissionValidationTest |
| FR-EVENT-18 | 구현됨 | AdminEventParticipationApprovalTest, AdminEventUnpublishTest, EventSubmissionApprovalConcurrencyTest |
| FR-EVENT-19 | 구현됨 | AdminApprovedEventListTest |
| FR-ROUTE-01 | 진행 중 | AnonymousReadAccessHttpTest, RouteCandidateCollectorTest, RouteControllerTest, RouteIntentClientTest, RouteRecommendServiceTest |
| FR-ROUTE-02 | 진행 중 | RouteCandidateCollectorTest, RouteRecommendServiceTest |
| FR-ROUTE-03 | 구현됨 | EventQueryServiceTest, PlaceSearchServiceTest, RouteCandidateCollectorTest, RouteOrderPlannerTest |
Expand Down Expand Up @@ -297,7 +299,7 @@
| FR-USER-13 | 진행 중 | UserProfileControllerTest, UserProfileImageIntegrationTest |
| FR-USER-14 | 구현됨 | UserLocationConsentIntegrationTest, UserProfileControllerTest |
| FR-USER-15 | 구현됨 | UserConsentControllerTest, UserConsentIntegrationTest |
| FR-USER-16 | 진행 중 | OrgAccountControllerTest, OrgAccountSecurityPersistenceTest, OrgEmailChangeConcurrencyTest |
| FR-USER-16 | 구현됨 | AdminEmailChangeReviewTest, EmailChangeApprovalConcurrencyTest, EventSubmissionReviewSchemaTest, OrgAccountControllerTest, OrgAccountSecurityPersistenceTest, OrgEmailChangeConcurrencyTest |

## 검증 공백: 구현됐는데 대응 테스트가 없다 (조치 대상)

Expand All @@ -323,7 +325,6 @@
- FR-EVENT-03 (폐기됨)
- FR-EVENT-04 (폐기됨)
- FR-EVENT-05 (폐기됨)
- FR-EVENT-15 (계획)
- FR-ROUTE-15 (계획)
- FR-NOTI-12 (계획)
- FR-NOTI-13 (폐기됨)
Expand Down
928 changes: 928 additions & 0 deletions docs/spec/MSG-500.md

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions docs/srs-changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,8 @@ union이 붙어 양쪽 행이 그대로 남는다. 2026-08-14에 같은 자리
| 2026-08-28 | FR-EVENT-16을 진행 중에서 구현됨으로 올렸다. 행사 운영자 콘솔의 승인 이벤트 목록 조회(`GET /api/org/events`)가 검증 테스트 25건과 같은 브랜치에 실렸다. 노출 조건은 종료 전 회차만이고 노출 시작 전 예정 회차도 콘솔에는 보인다(참여 신청 준비 기간 근거) | MSG-501 구현 (2026-08-28) |
| 2026-08-29 | FR-AUTH-13을 진행 중에서 구현됨으로 올렸다. 문안은 불변이다. 행사 운영자 계정 발급 축이 서버에 전부 들어갔다 — 관리자 직접 발급과 발급 요청 승인이 같은 발급 코어를 쓰고(계정 생성·초기 비밀번호 생성·커밋 후 발송·발송 실패 격리), 초기 비밀번호 평문은 메일 본문 한 번 외에 응답·로그·DB 어디에도 남지 않는다(로그 캡처 단언, 발송 실패 예외를 로거에 넘기지 않는 것까지 회귀 테스트로 고정). 재생성은 재발급이라 새 비밀번호로 교체하고 이전 값을 즉시 무효화하며, 대상은 아직 초기 로그인을 마치지 않은 계정으로 한정한다(사용 중 계정에 재발급하면 발급자가 다시 비밀번호를 아는 상태가 되어 FR-AUTH-15의 목적이 무너진다). 검증 테스트 48건이 같은 브랜치에 실렸다. 계정이 없는 신청자의 공개 접수 폼과 관리자 큐(PRD FR-6)도 같은 티켓이 구현했으나 대응 SRS 행이 없어 등재 여부는 별도 판단으로 남긴다. FR-USER-16은 진행 중 그대로 두고 잔여 범위를 좁혔다 — 이번에 생긴 관리자 큐는 계정 발급 요청 전용이고 아이디 변경 요청의 검토·승인은 MSG-500 몫이다 | MSG-499 구현 (2026-08-29), 스펙 `docs/spec/MSG-499.md` |
| 2026-08-29 | FR-EVENT-13·FR-EVENT-14를 계획에서 구현됨으로 올렸다. 행사 운영자 콘솔의 신청 제출(presign 포함)·내 목록·상세·반려본 재제출 API 5개가 검증 테스트와 같은 브랜치에 실렸다. 위치당 영역 상한은 사각형 합집합 기준 81칸으로 판정하고, 존재 은닉은 13430 단일 응답, 재제출 전이는 소유권 술어 포함 조건부 UPDATE로 원자화했다. 반려 행 쓰기와 승인 반영(FR-EVENT-15)은 MSG-500 몫으로 계획 유지 | MSG-498 구현 (2026-08-29) |
| 2026-08-30 | FR-EVENT-15 문장을 재작성하고 계획에서 진행 중으로 올렸다. 승인 반영이 유형별 분기로 확정되어(지역축제는 축제 미션, 팝업스토어는 팝업 미션으로 칩 등재, 이벤트 참여형만 부모 이벤트 아래 행사 위치로 반영 + 참여 속성 부가 노출) 구 "행사 도메인에 시리즈·회차·위치 생성" 서술을 대체했다. 반려 항목 코드 4종 필수도 함께 등재했다. FR-EVENT-01 근거의 "등재 기준 재정의 대상" 예고는 이 확정으로 닫았다 — 행사 칩에 새 행사가 오르는 경로는 여전히 수동 시드뿐이다 | 2026-08-29 정민 확정, PRD `docs/prd/event-submission.md` v2.2(MSG-502 브랜치 반영 중), 스펙 `docs/spec/MSG-500.md` |
| 2026-08-30 | FR-EVENT-17(관리자 노출 중지 — 사유 필수, 사용자 대면 전 경로 즉시 제외, 직접 접근 포함, 완료 기록·뱃지 비회수, 운영자 사유 통지)과 FR-EVENT-18(승인 행사 상태별 목록과 건수, 중지 식별)을 진행 중으로 등재했다. PRD FR-20·FR-25에 대응하는 SRS 행이 없어 MSG-500의 M4 테스트가 인용할 ID가 비어 있던 갭을 선등재로 닫았다(MSG-390의 소급 주석 교훈) | MSG-500 구현 중 (2026-08-30), PRD `docs/prd/event-submission.md` FR-20·25 |
| 2026-08-30 | MSG-500 구현 반영. FR-USER-16을 구현됨으로 올렸다(잔여였던 아이디 변경 요청의 관리자 검토·승인 처리 완료 — 승인은 요청 전이와 이메일 교체 한 트랜잭션, 검토 시점 가드, 새 이메일 통지). FR-EVENT-18도 구현됨(승인 행사 상태별 목록, KST 파생 탭). FR-EVENT-15·17은 진행 중 유지 — 미션 경로(심사·승인·반려·중지)는 구현됐지만 이벤트 참여형 승인 반영과 위치 숨김·노출 영역 재계산이 MSG-502(V50) 머지 후 잔여라서다. 검증 테스트는 같은 브랜치의 구현 커밋들에 동반된다 | MSG-500 구현 (2026-08-30), 브랜치 feature/MSG-500-admin-review |
| 2026-08-29 | FR-EVENT-17 등재 (구현됨). 등록 유형 "이벤트"의 참여 신청 접수를 등재했다. 신규 엔드포인트 없이 MSG-498의 신청 API 5개가 EVENT 유형을 받는 구조라 접수 뒤 흐름(심사 중·신청 번호·내 목록·상세·재제출)은 세 유형이 같은 경로를 쓴다. 위치는 대표 위치 한 곳으로 한정했는데(FR-EVENT-13의 여러 위치 허용에 대한 예외이고 PRD v2.2가 FR-8에 예외 문장으로 명문화했다) 대표 격자 한 점만 받는 안은 기각했다 — 승인 결과가 회차 아래 위치 1행 + 격자 전개라 점 하나로는 승인 시점에 영역을 지어낼 수 없다. 종료 판정은 `ends_at <= now`로 FR-EVENT-16 노출 조건의 정확한 여집합이라 종료 정각에도 목록과 신청의 경계가 갈리지 않는다. 공개 기간이 부모 회차 기간 안에 들어야 한다는 교차 검증은 두지 않았다(부모는 UTC 시각, 신청은 KST 날짜 라벨이라 경계일 단정이 애매하고 타당성은 관리자 심사가 본다). FR-EVENT-13 문장에는 세 번째 유형의 상호참조를 달았다. 승인 반영(FR-EVENT-15)은 MSG-500 그대로 계획 유지 | MSG-502 구현 (2026-08-29), 스펙 `docs/spec/MSG-502.md` |
| 2026-08-30 | FR-EVENT-15와 FR-EVENT-18을 구현됨으로 올렸다. MSG-502 머지 후 참여형 잔여(승인의 위치 전개·참여 속성 노출, 중지의 위치 숨김·노출 영역 재계산)가 같은 브랜치에서 완결돼 두 요구의 "승인 산출물 전부" 조건이 성립했다. 병합 과정에서 502가 develop에 선점한 FR-EVENT-17(참여형 접수)과 이 브랜치의 옛 17(중지)·18(목록)이 충돌해, 중지를 18로·목록을 19로 재번호하고 테스트 주석과 문서 참조를 함께 옮겼다(ID 불변 원칙은 develop 선점자 기준) | MSG-500 M6 구현 (2026-08-30), 브랜치 feature/MSG-500-admin-review |
Loading
Loading