## 관련 명세 - `docs/s1-api-spec.md` 17번 `DELETE /api/v1/trash/templates/{templateId}` (BIN-06, 정책표 7) - `docs/s1-api-spec.md` 18번 `DELETE /api/v1/trash/templates` (BIN-02, BIN-03, 정책표 7) - `TRASH200_3` 템플릿을 영구 삭제했습니다. - `TRASH200_4` 휴지통을 비웠습니다. - `TRASH404_1` 휴지통에서 템플릿을 찾을 수 없어요. ## 작업 내용 휴지통 템플릿을 하나씩 또는 한꺼번에 영구 삭제한다. 복구할 수 없다. - `TrashController`: `DELETE /api/v1/trash/templates/{templateId}` → `TrashPurgeResponse`(`templateId`), `DELETE /api/v1/trash/templates` → `TrashEmptyResponse`(`deletedCount`) - `TrashCommandService`: 개별 영구 삭제·비우기 쓰기 메서드 - `TemplateRepository`: 본인 소유 + 휴지통 조건의 `@Modifying` 삭제 쿼리 (00:10 정리 배치가 같은 모양을 쓸 수 있게 작게) ### 동작 규칙 | 구분 | 내용 | | --- | --- | | 삭제 방식 | 엔티티를 읽지 않고 삭제 쿼리로 지운다. 본문 복호화에 실패하는 행도 지울 수 있어야 한다 (#55 리뷰 합의) | | 17번 | `id`·`user_id`·`deleted_at is not null` 조건 삭제. 지운 행이 0이면 `TRASH404_1` (없는 ID, 다른 회원, 활성 템플릿, 이미 영구 삭제) | | 18번 | `user_id`·`deleted_at is not null` 조건 삭제. 지운 행 수를 `deletedCount`로. 비어 있어도 성공(0) | | 외래키 | `templates`를 참조하는 외래키 없음 (ERD v0.8) | ## 완료 조건 - [ ] 17번: 성공 후 행 삭제, 응답·`no-store`, 없는 ID·다른 회원·활성·두 번째 삭제 `TRASH404_1`, 다른 행 유지, 숫자가 아닌 ID `COMMON400_1`, 토큰 없음 `COMMON401_1` - [ ] 18번: 내 휴지통만 삭제·`deletedCount`, 비어 있으면 0, 활성·다른 회원 휴지통 유지, 토큰 없음 `COMMON401_1` - [ ] 복호화가 실패하는 행도 17·18번으로 삭제 - [ ] 삭제 후 휴지통 목록 `totalCount`·항목, 지운 단축어로 새 템플릿 생성 - [ ] 동시 요청: 같은 템플릿 영구 삭제 2건, 복구 + 영구 삭제 - [ ] 서비스·레포지토리 테스트 - [ ] `./gradlew build` 통과 ## 참고 - #69(휴지통 복구) 위에 쌓는다. #69 병합 후 기준을 `develop`으로 바꾼다 - #66(내 템플릿 목록)과 겹치지 않게 `TemplateRepository`에는 메서드 추가만 한다 - 00:10 정리 배치는 구현하지 않는다
Activity