Skip to content

[✨Feat] 자기소개서 기본 정보 저장 API 구현 #32

Description

@yong203

목표

사용자가 자기소개서 등록 step1에서 입력한 기본 정보를 임시저장할 수 있도록 API-009 PUT /cover-letters/{coverLetterId}/basic-info를 구현한다.

기본 정보 저장은 현재 cover_letters 루트 테이블만으로 독립 구현 가능하며, 이후 step2/step3 저장 API가 재사용할 owner 검증, deletedAt 제외, DRAFT 상태 검증, validation 응답 패턴을 먼저 확정한다.

작업 범위

  • 관련 요구사항/API:

    • REQ-004 자기소개서 등록 step 저장
    • API-009 PUT /cover-letters/{coverLetterId}/basic-info
  • 포함할 것:

    • title, companyName, positionTitle, jobPostingUrl 요청 DTO 추가
    • 기본 정보 저장 응답 DTO 추가
    • 현재 사용자 소유이면서 삭제되지 않은 자기소개서만 수정 가능하도록 검증
    • 존재하지 않거나, 다른 사용자 소유이거나, 삭제된 자기소개서는 NOT_FOUND
    • DRAFT 상태에서만 수정 가능하도록 검증
    • DRAFT가 아니면 COVER_LETTER_NOT_DRAFT를 409로 반환
    • 문자열 trim 후 저장
    • jobPostingUrl 누락 또는 blank는 null로 저장
    • jobPostingUrl 값이 있으면 URL 형식과 최대 500자 검증
    • updatedAt 갱신
    • controller/service/repository 또는 필요한 테스트 갱신
    • docs/api/README.md, docs/status.md 상태 갱신
    • 필요 시 docs/api/cover-letters.md의 에러 응답 형식 보강
  • 제외할 것:

    • API-010 채용 우대사항 저장
    • API-011 질문과 답변 저장
    • API-012 자기소개서 상세 조회
    • cover_letter_questions entity/repository 추가
    • 제출 API 및 LLM Job 생성

완료 기준

  • PUT /cover-letters/{coverLetterId}/basic-info 성공 시 문서 계약의 기본 정보 응답을 반환한다.
  • 저장 값은 trim된 값이며, blank jobPostingUrlnull로 저장된다.
  • title은 trim 후 1~50자만 허용한다.
  • companyName은 trim 후 1~30자만 허용한다.
  • positionTitle은 trim 후 1~30자만 허용한다.
  • jobPostingUrl은 선택값이며 값이 있으면 trim 후 최대 500자와 URL 형식을 검증한다.
  • validation 실패는 VALIDATION_ERROR와 필드별 details를 반환한다.
  • 없는 id, 다른 owner, 삭제된 자기소개서는 NOT_FOUND를 반환한다.
  • DRAFT가 아닌 자기소개서는 COVER_LETTER_NOT_DRAFT를 반환한다.
  • 저장 시 updatedAt이 갱신된다.
  • 관련 테스트가 추가되거나 갱신된다.
  • docs/api/README.md에서 API-009 상태가 Implemented로 갱신된다.
  • docs/status.md에 관련 이슈와 검증 근거가 반영된다.
  • git diff --check, ./gradlew test, ./gradlew check가 통과한다.

참고

  • 등록 step 저장 API는 docs/decisions/cover-letters.md의 Decision 023에 따라 DRAFT 상태에서만 허용한다.
  • URL은 형식만 검증하고 실제 접근 가능 여부는 검증하지 않는다.

Metadata

Metadata

Assignees

Labels

✨ Feature새로운 기능 구현

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions