Skip to content

행사 목록·상세 조회 API 추가 #27

Description

@leegain1

어떤 기능인가요?

추가하려는 기능에 대해 간결하게 설명해주세요

학생 앱에서 게시된 행사의 목록과 상세를 조회하는 API를 추가합니다.

목록은 커서 페이지네이션으로 행사 시작이 가까운 순서대로 내려주고, 상세는 행사 내용·장소·일정·이미지를 함께 내려줍니다.

두 API 모두 모집 상태와 마감까지 남은 일수(D-Day)를 저장값이 아니라 조회 시점의 신청 기간·정원·강제 마감 여부로 계산하며, 계산 규칙은 Event.calculateRecruitStatus(#23)를 그대로 재사용합니다.

운영진이 아직 공개하지 않은 행사가 노출되면 안 되므로 events 테이블에 is_published 컬럼을 추가합니다.

Method Endpoint 설명
GET /v1/app/events 행사 목록 조회 (커서 페이지네이션, 모집 상태 필터)
GET /v1/app/events/{eventId} 행사 상세 조회

명세서 초안은 엔드포인트를 /v1/users/...로 적고 있으나, config-and-auth.md 4절·architecture.md가 학생 앱을 /v1/app/**로 규정하고 SecurityConfig도 이 패턴으로 인가를 겁니다. #23의 폼 조회·신청도 /v1/app/events/**라 경로를 통일했습니다. 명세서 수정이 필요합니다.

📝 작업 상세 내용

공통 / 스키마

  • events 테이블에 is_published 컬럼 추가 (Flyway V5) 및 목록 조회용 복합 인덱스 생성
  • Event 도메인·EventJpaEntitypublished 필드 반영
  • 커서 페이지네이션 공통 처리 — CursorSliceResult/CursorSliceResponsenextCursor를 불투명 문자열로 전환하고 CursorCodec(Base64 URL-safe) 추가

목록 조회 — GET /v1/app/events

  • EventCursor(eventStartAt, eventId keyset) 추가
  • EventSummary 추가 — 대표 이미지 추출, D-Day 계산, 모집 상태는 Event.calculateRecruitStatus에 위임
  • EventRepository.findPublishedSlice 및 JPQL 구현 — keyset 조회 + 모집 상태 필터 + 신청자 수 배치 집계
  • EventService.getPublishedEvents 추가
  • 엔드포인트 추가 (cursor, size, recruitStatus 쿼리 파라미터)

상세 조회 — GET /v1/app/events/{eventId}

  • D-Day 계산을 Event.daysUntilDeadline(...) 도메인 메서드로 승격하고 EventSummary가 이를 호출하도록 정리
  • EventDetail 추가 — 상세 필드 + 계산된 모집 상태·D-Day + 이미지 id 목록
  • EventRepository.findPublishedById 추가 — 게시되고 삭제되지 않은 행사만 조회
  • EventService.getPublishedEvent 추가 — 없거나 미게시면 EVENT_NOT_FOUND
  • EventDetailResponse(중첩 Image record) 및 엔드포인트 추가

테스트

  • 도메인 단위 테스트 — 모집 상태 판정, D-Day 경계, 커서 왕복·형식 오류, 모집 상태 파싱

📁 참고 자료 (선택)

  • 행사 신청서 폼 조회/신청 API 추가 #23 (행사 신청서 폼 조회/신청 API) 위에 쌓는 작업입니다. Event·EventRepository·EventService·AppEventController 등을 공유하므로 해당 PR 머지 후 main으로 리베이스합니다.
  • 이미지 URL은 파일 업로드 도메인(파일 업로드 도메인 개발 #17)이 머지되어야 조립할 수 있어, 이번 작업에서는 응답 필드만 두고 null로 내려갑니다. (목록의 thumbnailUrl, 상세의 images[].fileUrl)
  • D-Day는 서버의 한국 시간대 날짜 기준으로 계산합니다. 코드는 LocalDateTime.now()를 쓰므로 운영 서버의 JVM 기본 타임존이 Asia/Seoul이어야 합니다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions