Skip to content

feat: 업무카드 담당자 지정·변경 API 구현 - #143

Merged
BcKmini merged 5 commits into
mainfrom
feat/142-task-assignee
Aug 12, 2026
Merged

feat: 업무카드 담당자 지정·변경 API 구현#143
BcKmini merged 5 commits into
mainfrom
feat/142-task-assignee

Conversation

@hywznn

@hywznn hywznn commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

왜 필요한가요?

Case 상세 화면의 담당자 변경 기능은 후보 목록만 조회할 수 있고, 선택한 담당자를 Server에 저장할 API와 컬럼이 없었습니다.

무엇이 바뀌나요?

  • API·도메인·DB 변경:
    • task.assignee_id와 tenant-aware 복합 FK를 V42로 추가했습니다.
    • Task 생성자는 기본 담당자가 되며, 기존 Task는 created_by로 보정합니다.
    • PATCH /api/v1/tasks/{taskId}/assignee를 추가했습니다.
    • 담당자 변경 응답과 Task 상세 조회에 담당자 ID·표시명을 반환합니다.
  • 권한·Workflow 변경:
    • 같은 사업장의 ACTIVE 상태인 ADMIN·HR만 담당자로 지정할 수 있습니다.
    • 변경 요청자는 ADMIN·HR이어야 하며 expected_version으로 동시 수정을 막습니다.
    • 완료·취소된 Task의 담당자는 변경하지 않습니다.
    • 변경 시 TASK_ASSIGNEE_CHANGED 감사로그를 남깁니다.
  • AI·외부 연동 변경: 없습니다.
  • 문서·배포 변경: OpenAPI 요청·오류 설명을 코드에 추가했습니다.

어떻게 검증했나요?

  • ./gradlew clean test
  • ./gradlew build
  • /health와 Swagger UI 확인
  • 정상 요청
  • 잘못된 입력
  • 권한 부족
  • 다른 사업장 접근 차단
  • 필요한 상태 전이·Idempotency

검증 결과:

  • 전체 테스트: BUILD SUCCESSFUL
  • PostgreSQL 16 전용 Migration·tenant context·RLS 테스트: BUILD SUCCESSFUL
  • GitHub Server CI 재실행: Test and build 성공
  • 담당자 변경 후 Task 상세 재조회와 감사로그를 통합 테스트로 확인했습니다.
  • 다른 사업장 사용자, 비활성 HR, VIEWER 지정, 오래된 version, VIEWER 요청을 각각 거부하는지 확인했습니다.
  • DB 복합 FK가 다른 사업장의 담당자 연결을 거부하는지 확인했습니다.

보안·개인정보

  • DTO·로그·AI 입력에 불필요한 개인정보가 없습니다.
  • JWT, Worker Link 원본 토큰, API Key, 비밀번호가 없습니다.
  • 모든 사업장 데이터 접근에 company_id 범위를 검사합니다.
  • AI 결과가 자동 승인·발송되지 않습니다.
  • 중요한 변경이 AuditLog와 request_id로 추적됩니다.
  • 관련 Accepted ADR을 지켰거나 필요한 새 ADR을 이 PR에서 Proposed로 작성했습니다.
  • Server에 Prompt Builder·Provider SDK·모델 routing을 추가하지 않았습니다.

감사로그에는 이메일이나 표시명이 아니라 변경 전·후 사용자 ID만 기록합니다.

API·DB·운영 영향

  • Swagger/OpenAPI 계약을 갱신했습니다.
  • Client에 알려야 할 호환성 변경을 적었습니다.
  • DB 변경에 Flyway migration이 있습니다.
  • migration 번호와 소유 Issue를 확인했고 다른 기능의 테이블을 미리 만들지 않았습니다.
  • 환경변수 변경이 없습니다.
  • 배포 후 Smoke Test와 롤백 방법을 적었습니다.

병합 전 필수 확인

  • 이 PR의 공통 V42를 먼저 병합합니다.
  • PR #135는 PostgreSQL 전용 Migration을 V43으로 변경하고 최신 main을 반영합니다.
  • Case 화면의 담당자 변경이 Case 전체가 아니라 current_task.task_id 한 건을 변경하는 방식인지 확인합니다.

V43이 먼저 배포되면 뒤늦은 V42가 정상 적용되지 않을 수 있으므로, 이 PR을 먼저 병합한 뒤 #135의 V43을 병합합니다. 롤백이 필요하면 기존 코드를 되돌리되 컬럼은 유지하고 후속 migration으로 정리합니다.

화면 또는 응답 예시

PATCH /api/v1/tasks/{taskId}/assignee
Authorization: Bearer <access-token>
Content-Type: application/json
{
  "assignee_id": "7e2722bb-3c72-4aa0-b37c-28931c4f8e53",
  "expected_version": 3
}

응답의 Task 상세에는 다음 값이 포함됩니다.

{
  "assignee": {
    "user_id": "7e2722bb-3c72-4aa0-b37c-28931c4f8e53",
    "display_name": "담당자 B"
  },
  "version": 4
}

@hywznn
hywznn requested review from BcKmini and krestar August 12, 2026 02:27
@hywznn
hywznn marked this pull request as ready for review August 12, 2026 02:27
@hywznn

hywznn commented Aug 12, 2026

Copy link
Copy Markdown
Contributor Author

#143 #145 두 PR 모두 확인하시고 머지해서 사용하십셔 @BcKmini

@BcKmini

BcKmini commented Aug 12, 2026

Copy link
Copy Markdown
Member

굳굳

@BcKmini
BcKmini merged commit 9f23277 into main Aug 12, 2026
4 checks passed
@BcKmini
BcKmini deleted the feat/142-task-assignee branch August 12, 2026 07:15
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.

[Task][P2] Case 상세 담당자 지정·변경 API 구현

2 participants