Conversation
* feat: Workspace 생성 및 단건 조회 구현, 응답 및 예외 처리 구조 반영 * feat: 워크스페이스 생성, 조회 테스트코드 작성 및 일부 전략 수립
* feat: Document 생성 * fix: 어플리케이션 실행 오류 수정
* chore: PK 물리 컬럼명을 {도메인}_id 형식으로 변경
* feat: 문서 조회 구현
* feat: 문서 조회 테스트코드 구현 및 통과 확인
* feat: 문서(블록) 이동을 고려한 정렬 알고리즘 구현 * test: 정렬 알고리즘 테스트코드 구현 * feat: 블록 생성 구현 * test: 블록 생성 테스트코드 구현 * feat: 문서 내 블록 목록 조회 구현 * test: 문서 내 블록 목록 조회 테스트코드 구현
* feat: 문서 수정 PATCH API 초안 추가 * feat: 문서 수정 서비스 로직 구현 및 테스트 추가 * test: 문서 수정 API WebMvc 테스트 추가 * test: 문서 수정 로직 서비스 테스트와 API 통합 테스트 추가 * refactor: 문서 수정 서비스 메서드 분리 * refactor: 문서 테스트의 중복 fixture 생성 메서드 분리 * refactor: 문서 수정 API 제목 필수 검증 정리 및 테스트 수정
* refactor: Document 엔티티에 연관관계 매핑 추가 및 관련된 기존 로직 수정 (기능 동일) * refactor: Block 엔티티에 연관관계 매핑 추가 및 관련 로직 수정 (기능 동일)
* chore: [문서/블록 수정 - 문서/블록 이동] 분리 및 관련 내용 문서화 - 문서 수정 API와 문서 이동 API는 분리하여 개발하는 게 맞다고 판단했습니다. - 문서 수정 API의 경우 비에디터에서 사용될 것으로 예상됩니다. - 여러 사용자가 같은 화면을 보고 있을 때, 다른 사용자가 수정한 내용을 보기 전에 수정 요청을 하는 경우를 방지하기 위해 request에 version을 담아서 보내기로 결정했습니다. * feat: 블록 수정 구현 * test: 블록 수정 테스트코드 구현 및 통과 확인
* feat: 문서 삭제 API 스켈레톤 코드 추가 * rebase conflict 해결 # Conflicts: # documents-core/src/main/java/com/documents/service/BlockService.java # documents-infrastructure/src/main/java/com/documents/service/BlockServiceImpl.java # documents-infrastructure/src/test/java/com/documents/service/BlockServiceImplTest.java * test: 문서 삭제 WebMvcTest 추가 * test: 문서 삭제 ServiceImpl Test 추가 * test: 문서 삭제 API 통합 테스트 추가 * feat: 문서 삭제 시 하위 문서 cascade soft delete 반영
* chore: 블록 내 structured JSON 필드 추가 및 정책 회의 내용, 결정사항 문서화 * chore: 프롬프트 로그 전략 재정립 - 이제 단순한 질문이나 구현과 어긋나있는 부분까지 로그로 남기지는 않습니다. - 무분별한 로그 파일의 확장을 막기 위해서, 일련의 작업은 하나의 로그파일에서 Step을 추가하는 방식으로 기록합니다. * feat: Block 엔티티에 content 필드 추가 - 기존 text 필드를 content 필드로 변경 및 컬럼 구조 구체화 - Block 사용 로직들을 고치기 전까지, 이전 text 사용하던 로직 임시 처리를 위한 @deprecated 지정 * refactor: 블록 생성 시 text 대신 직렬화된 content 사용 * feat: 블록 content 스키마 검증기 추가 * test: 블록 생성 관련 테스트코드 변경 및 추가 - 기존 사용하던 text 대신 JsonNode인 content를 사용하도록 변경 - JsonNode 검증 테스트코드 추가 * refactor: 블록 수정 시 text 대신 직렬화된 content 사용 * test: 블록 수정 관련 테스트코드 변경 및 추가 - 기존 사용하던 text 대신 JsonNode인 content를 사용하도록 변경 * test: 블록 조회 관련 테스트코드 변경 및 추가 - 기존 사용하던 text 대신 JsonNode인 content를 사용하도록 변경 * refactor: 기존 Block.text 사용하던 부분 정리 및 text 필드 삭제 * feat: content 관련 Validation 강화 및 강화된 content 검증 테스트코드 추가 * refactor: 원격 저장소 pull 후, 남아있던 Block.text 잔재 수정 및 제거
* feat: 문서 복구 API 스켈레톤 코드 추가 * feat: 문서 복구 서비스 로직 추가 * feat: 문서 복구 시 소속 블록 복구 로직 추가 * feat: 문서 복구 API WebMvc 테스트 추가 * test: 문서 복구 서비스 단위 테스트 추가 * test: 문서 복구 API 통합 테스트 추가 * refactor: 프로젝트 정책에 맞게 문서 복구 API HTTP 메서드를 PATCH에서 POST로 변경 * docs: 문서 복구 API 구현 prompts 로그 기록
* feat: 블록 삭제 구현 * test: 블록 삭제 테스트코드 추가 * chore: 구현한 기능과 관련하여 다음 버전 고려사항 추가 문서화 - 현재 구현한 기능과 관련하여, 다음 버전에서 고려해야될 부분을 문서화하도록 설정했습니다. - 현재 v1에서는 기능 동작을 최우선순위로 둔다는 점을 명시해두었습니다. * fix: 테스트코드에서 잘못된 Http Method 수정 - 문서 복구 API의 요청 Http Method는 Post입니다. - 현재 관련 테스트코드에서 Patch로 요청하고 있어, 이 부분을 Post로 변경하였습니다. * chore: 블록 복구 API 미구현으로 정책 변경 및 관련 내용 문서화 - 일반적으로 복구 API는 문서 기준으로 사용됩니다. - 문서를 삭제하면 휴지통으로 들어가고, 휴지통에서 해당 문서 및 블록들을 복구할 수 있는 게 현재 버전의 시나리오입니다. - 여러가지를 고려한 결과, 블록 복구 API를 단독으로 사용할 일은 당장은 없을 것이라고 판단하였습니다. - 관련 회의 내용은 커밋되는 문서에서 확인하실 수 있습니다. * refactor: Agents.md에서 코드 컨벤션 일부 수정 및 기존 코드에 적용
* docs: 문서 이동 / 순서 변경 REQUIREMENTS.md 추가 * feat: 문서 move API 스켈레톤 코드 추가 * feat: 문서 move 검증 로직 추가 * refactor: update 시 사용할 새 부모 문서 조회 메서드 네이밍 변경 및 역할 명확화 * feat: 문서 move 위치 해석과 sortKey 계산 추가 * feat: 문서 move 트랜잭션 업데이트 * test: 문서 move API WebMvc 테스트 추가 * test: 문서 move 서비스 테스트 추가 * test: 문서 move API 통합 테스트 추가 * test: 문서 move 통합 테스트 정렬 기대값 보정 * docs: 문서 move API 작업 로그 추가 * refactor: 문서 sortKey 생성을 OrderedSortKeyGenerator로 통합
* feat : 블록 이동 API 엔드포인트와 요청 DTO 추가 * test: 블록 이동 WebMvc 테스트 추가 * feat: 블록 이동 서비스 로직 구현 * test: 블록 이동 서비스 테스트 코드 구현 * test: 블록 이동 통합 테스트 구현 * docs: 블록 이동 및 순서 변경 API 프롬프트 로그 기록
* chore: 에디터 단위 저장 로직 전략/정책 설계 및 구체화 * feat: 에디터 저장 - 블록 생성, 수정 기능 연동 - operation type별 요청 shape validation을 추가했습니다. - 문서 단위 transaction 저장 API와 내부 orchestration 흐름을 연결했습니다. - BLOCK_CREATE와 BLOCK_REPLACE_CONTENT를 연동했습니다. - 요청 블록 참조 필드를 blockRef로 통일하고, 응답에는 매핑용 tempId 및 blockId를 유지했습니다. * test: 에디터 저장 - 블록 생성, 수정 테스트 확인 * docs: transaction temp ref 지원 범위 확장 - temp 참조 지원 범위를 blockRef에서 parentRef, afterRef, beforeRef까지 넓혔습니다. - 연속된 부모/자식 생성과 sibling 기준 삽입을 지원하는 방향으로 문서를 정리했습니다. * feat: 에디터 transaction 저장에 temp parent/anchor ref 지원 추가 - transaction 위치 필드를 parentRef, afterRef, beforeRef로 확장했습니다. - 같은 batch 안의 temp block을 위치 ref로 해석하도록 저장 로직을 보강했습니다. * test: 에디터 transaction 저장에 블록 생성/수정 temp anchor 확장 후 테스트 추가 및 확인 - temp parent와 temp sibling anchor 시나리오를 테스트로 추가했습니다. * feat: 블록 이동 시 깊이 제한 검증 추가 및 테스트코드 추가 * feat: 에디터 저장 - 블록 삭제 기능 연동 및 테스트 확인 - 블록 삭제 기능을 연동하였습니다. - 기존 BlockService.delete() 로직에서 Block을 넘겨주어, 이를 DocumentTransactionServiceImpl에서 사용할 수 있도록 수정하였습니다. - 관련 테스트코드를 수정 및 추가하고 테스트 통과를 확인하였습니다. * feat: 에디터 저장 - 블록 이동 기능 연동 * test: 에디터 저장 - 블록 이동 테스트 확인 * feat: 에디터 저장 기능 검증 보강 및 테스트케이스 보강 - 기존 BLOCK_REPLACE_CONTENT, BLOCK_MOVE에서, 소속된 문서와 관련한 검증을 진행하는 로직이 누락되어있었습니다. - 이제 블록 수정 및 이동 시에도 소속 Document를 확인합니다. - 에디터 저장 기능 테스트코드에서 몇 가지 edge case를 추가로 검증하였습니다. * feat: 에디터 저장 응답에 NO_OP 케이스 추가 - 요청으로 인해 해당 블록 데이터의 데이터가 변경되지 않는다면 NO_OP 전용 응답을 내보내도록 변경하였습니다. * test: 에디터 저장 API 테스트코드에 edge case 추가 보강 * fix: 에디터 저장 블록 삭제 동시성 보강 및 version 정책 정비 - 프론트와 백엔드 사이의 block version 전달 정책을 다시 정리했습니다. - 기존에는 프론트가 request에 담는 version과 서버가 batch 내부에서 실제로 이어가야 하는 version 흐름이 분리되지 않아, 같은 batch 안의 연속 작업에서 충돌이 발생하기 쉬운 구조였습니다. - 프론트는 batch 생성 시점의 base version만 보내고, 서버는 base version과 current version을 분리해 동시성 검증과 후속 operation chaining을 수행하도록 수정했습니다. - 블록 삭제는 @Modifying bulk update 경로라 JPA @Version 낙관적 락이 자동 적용되지 않습니다. - soft delete query에 root block version 조건을 추가해, stale delete를 실제 삭제 시점까지 막도록 보강했습니다. - 기존에는 프론트 collapse를 전제로 create -> delete temp block 시퀀스를 서버에서 에러로 처리했습니다. - 이제는 해당 시퀀스도 서버에서 자연스럽게 처리할 수 있도록 허용했습니다. - 다만 프론트의 queue collapse 전처리 원칙은 그대로 유지합니다. * test: 에디터 저장 - 전체적인 edge case 테스트코드 검증 추가 * test: 테스트코드에서 CountDownLatch를 활용하여, 에디터 저장 기능 동시성 처리 추가 검증 * feat: 에디터 저장 API 에서 DocumentVersion 요청/응답에 사용하도록 구조 변경 - 프론트는 에디터 저장 API 호출 시, 현재 보고 있는 시점의 DocumentVersion을 추가로 넘겨줍니다. - 서버는 에디터 저장 로직 초반부에 DocumentVersion 검증을 진행합니다. - 에디터 저장 로직이 성공적으로 실행되면 DocumentVersion을 1 증가시키고, 증가된 DocumentVersion을 응답에 포함시킵니다. * test: 에디터 저장 API 초기 DocumentVersion 검증 테스트코드 추가 * test: 에디터 저장 API 경쟁형 동시성 및 retry/no-op 검증 추가 * chore: Server Port 8083으로 변경 및 Docker 포트도 변경 * fix: 에디터 저장 API 로직에서 DocumentVersion 선검증 제거 - Block 단위 동시성 제어 정책과 맞지 않던, 기존의 문서 단위 선검증 부분을 제거했습니다. - 기존 로직 중, 저장 성공 시 DocumentVersion + 1 후 응답에 반영하는 부분은 그대로 유지했습니다. - 관련 선검증 관련 테스트를 삭제하고, 동시성 테스트는 DocumentTransactionServiceImpl.apply() 기준으로 통일했습니다. * refactor: 에디터 저장 API에서 DocumentVersion을 받지 않도록 수정
* refactor: 문서 블록 조회를 DocumentController로 이동하고 admin 블록 API로 분리 * docs: admin 블록 API 경로와 리팩토링 로그 반영 * test: admin 블록 API 경로로 변경
* feat : 문서 수정 API에 Document.version 동시성 검증 로직 추가 * feat: 블록 단건 API와 트랜잭션 저장 경로의 문서 버전 증가 정책 정리 * feat: 문서 공개 상태 변경 API와 Document.version 동시성 처리 추가 * docs: 문서 전체 버전 정책과 공개 상태 변경 규칙 요구사항에 반영 * docs: 문서 전체 버전 처리 회귀 테스트와 작업 로그 정리 * refactor: 문서 수정 API에서 parentId 입력 제거하고 부모 변경 책임을 move API로 정리
* docs: 문서 hard delete 및 휴지통 엔드포인트 정책 검토 문서 추가 * docs: 문서 hard delete와 PATCH 휴지통 엔드포인트 요구사항 반영 * docs: 문서 휴지통 로드맵 갱신 * feat: 문서 기본 삭제를 hard delete 로 전환 * feat: 문서 휴지통 이동 API 구현 * feat: 문서 휴지통 복구 API 구현 * feat: 문서 휴지통 5분 경과 자동 영구 삭제 스케줄러 구현 * feat: 문서 휴지통 목록 조회 API 구현 * docs: DEBUG.md 휴지통 기능 문서화 * docs: 문서 제목 중복 검증 및 복구 실패 처리 요구사항 추가 * feat: 문서 제목 중복 검증 로직 추가 및 충돌 응답 처리 구현 * docs: 휴지통 기능 prompts 문서화 * revert: 문서 제목 중복 검증 로직 제거 * chore: discord PR 알림 GitHub Actions 제거
…리팩토링 (#42) * refactor: 단건 블록 CRUD API 에서 기존 에디터 저장 API 재사용하도록 리팩토링 * test: API 분리 및 기존 메서드 재사용 테스트 진행 * docs: admin-block-transaction-alignment 프롬프트 형식을 기존 형식과 매칭
fix: 문서 휴지통으로 이동 및 복구 작업 시 DocumentVersion이 1 증가하도록 수정
Gateway 신뢰 헤더 기반 인증 컨텍스트 주입 및 감사 로그 강화
…rvices 내부 API 경로에서 /v1 제거 및 gateway rewrite 정책 반영
도커 dev/prod 환경 분리 및 local/docker 실행 스크립트 정리
* feat: 외부 헬스체크용 URL 추가 * chore: docker-compose.prod.yml의 애플리케이션 서버 포트 8080 -> 8083 으로 수정
…policy outbound 인증 모드 분리와 서비스 토큰 정책 적용
* docs: V1에서 Workspace를 사용하지 않는 방식으로 재설계한 내용 문서화 * refactor: 기존 워크스페이스 관련 코드들 백업 * refactor: Document-Workspace 간의 연관관계 제거 및 관련 로직 수정 1. Document와 Workspace 간의 연관관계를 제거하였습니다. 2. DocumentController를 수정하였습니다. - @RequestMapping("/documents")로 path prefix를 설정하였습니다. - userId를 사용할 경우 @CurrentUserId로 받아옵니다. 3. 문서 관련 작업 시, 기존 workspaceId를 활용하던 부분을 userId를 활용하도록 수정하였습니다. - 현재 userId와 updatedBy를 쿼리에서 매칭시키고 있습니다. - updatedBy는 엄밀히 말하면, 감사용 필드입니다. - 추후 이 둘을 분리할지에 대한 고민이 필요합니다. 4. 기존 workspace 관련 에러코드들을 제거하였습니다. * refactor: 워크스페이스 관련 코드 전부 제거 1. 해당 코드들은 /backup 패키지에 보관되어있습니다. * test: 워크스페이스 관련 제거 이후 테스트코드 수정
docs: add central contract repository reference
Use standalone documents-service compose stack with msa-shared network
Hide documents mysql host port exposure
ci: add contract impact check workflow
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 025a2135c4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| return ResponseEntity.ok(GlobalResponse.ok( | ||
| SuccessCode.SUCCESS, | ||
| documentTransactionApiMapper.toResponse( | ||
| adminBlockTransactionService.applyCreate(documentId, command.batchId(), command.operations().get(0), userId) |
There was a problem hiding this comment.
Reject extra operations instead of silently discarding them
This controller always forwards only command.operations().get(0) to the service, so requests with multiple operations are accepted but only the first operation is applied and the rest are silently ignored. In practice, a client can send a batch that appears successful while losing intended updates, which violates the admin API contract that each request must contain exactly one operation. Add an explicit size check (operations.size() == 1) and return INVALID_REQUEST when it is not satisfied.
Useful? React with 👍 / 👎.
| String value = normalize(getRequestHeader(headerName)); | ||
| if (StringUtils.hasText(value)) { |
There was a problem hiding this comment.
Propagate generated request IDs from auth context
GatewayAuthInterceptor generates a request ID when X-Request-Id is missing and stores it as a request attribute, but this factory only copies request IDs from the raw inbound header. As a result, outbound calls made from requests without an incoming X-Request-Id lose trace continuity, even though the server generated one for that request. Read the ID from GatewayAuthContext.REQUEST_ID_ATTRIBUTE (fallback to header) when building outbound headers.
Useful? React with 👍 / 👎.
변경 사항\n- Block-server 요청 인터셉터를 audit-log 공통 모듈로 연결\n- auditlog 설정 블록 추가\n- 요청 허용/거부와 인증 실패를 공통 감사 이벤트로 발행\n\n## 검증\n- ./gradlew :documents-api:compileJava