Skip to content

Conversation

@sjk4618
Copy link
Member

@sjk4618 sjk4618 commented Oct 23, 2025

🔥Pull requests

⛳️ 작업한 브랜치

👷 작업한 내용

  • feat: 도어용 유저 티켓 유효성 검증 API

🚨 참고 사항

@sjk4618 sjk4618 self-assigned this Oct 23, 2025
@coderabbitai
Copy link

coderabbitai bot commented Oct 23, 2025

📝 Walkthrough

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 문 직원용 티켓 검증 엔드포인트 추가 (티켓 코드 기반 검증)
    • 티켓 정보 조회 응답 개선 (행사명, 티켓명, 유효기간 포함)
  • Refactor

    • 티켓 확인 프로세스 개선 및 통일

Walkthrough

도어에서 사용자 티켓 유효성을 검증하기 위한 새로운 API 엔드포인트를 추가. 기존 스태프 티켓 확인 메서드를 리네이밍하고, 새로운 검증 로직 및 DTO를 도입. 공개 API 엔드포인트로 보안 화이트리스트에 등록.

Changes

관련 기능 / 파일(들) 변경 요약
도어 검증 API 엔드포인트
src/main/java/com/permitseoul/permitserver/domain/ticket/api/controller/TicketController.java
GET /door/validation/{ticketCode} 엔드포인트 추가 (validateUserTicketAtDoor). POST 핸들러 메서드명 getUserBuyTicketInfoconfirmUserTicketByStaffAtDoor로 리네이밍. 서비스 호출 업데이트: confirmTicketconfirmTicketByStaff.
도어 검증 응답 DTO
src/main/java/com/permitseoul/permitserver/domain/ticket/api/dto/res/DoorValidateUserTicket.java
새로운 레코드 타입 추가: eventName, ticketName, ticketStartDate, ticketEndDate 필드 포함. LocalDateTime 필드에 @JsonFormat 어노테이션 적용.
티켓 서비스 검증 로직
src/main/java/com/permitseoul/permitserver/domain/ticket/api/service/TicketService.java
공개 메서드 confirmTicketconfirmTicketByStaff로 리네이밍. 새로운 공개 메서드 validateUserTicket(String ticketCode) 추가 (DoorValidateUserTicket 반환). 헬퍼 메서드 추가: findEventById, findTicketTypeAndVerifyTicketDate, findTicketTypeById.
티켓 조회 유틸리티
src/main/java/com/permitseoul/permitserver/domain/ticket/core/component/TicketRetriever.java
새로운 공개 메서드 findTicketByTicketCode(String) 추가. @Transactional(readOnly = true) 적용.
보안 설정
src/main/java/com/permitseoul/permitserver/global/config/SecurityConfig.java
공개 접근 허용 경로에 "/api/tickets/door/validation/*" 추가.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 23.08% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed 제목 "feat: 도어용 유저 티켓 유효성 검증 API - #162"는 풀 리퀘스트의 주요 변경사항을 명확하게 설명하고 있습니다. 새로운 GET 엔드포인트 /door/validation/{ticketCode}validateUserTicketAtDoor 메서드 추가, DoorValidateUserTicket DTO 생성, TicketServicevalidateUserTicket 메서드 추가 등의 변경사항이 모두 제목의 도어용 티켓 유효성 검증 API 구현과 일치합니다. 제목은 간결하고 구체적이며 불필요한 요소가 없습니다.
Out of Scope Changes Check ✅ Passed 대부분의 변경사항은 도어용 티켓 검증 API 기능 범위 내에 있습니다. 새로운 엔드포인트, DTO, 서비스 메서드, 헬퍼 메서드 및 보안 설정 변경은 모두 구현된 기능을 직접 지원합니다. 다만 기존 메서드 이름 변경(getUserBuyTicketInfoconfirmUserTicketByStaffAtDoor, confirmTicketconfirmTicketByStaff)은 메서드의 목적을 명확히 하기 위한 리팩토링으로 보이며, 스태프 확인 흐름과 도어 검증 흐름을 구분하는 데 필요한 변경으로 판단됩니다.
Description Check ✅ Passed 풀 리퀘스트 설명은 이슈 #162를 명시적으로 참조하고 "도어용 유저 티켓 유효성 검증 API" 기능 구현에 대해 설명하고 있습니다. 설명이 실제 코드 변경사항과 일치하며 변경 내용과 직접적인 관련이 있습니다. 형식적이고 구성된 방식으로 작업 내용을 정리하고 있어 이슈와의 관계가 명확합니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/#162

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
src/main/java/com/permitseoul/permitserver/domain/ticket/api/service/TicketService.java (1)

133-150: 중복 코드 리팩토링 고려

새로운 검증 메서드가 잘 구현되었으나, confirmTicketByStaff 메서드와 예외 처리 로직이 매우 유사합니다 (lines 124-130과 143-149).

공통 예외 처리 로직을 별도 메서드로 추출하는 것을 고려해 보세요. 예를 들어:

private <T> T executeWithTicketExceptionHandling(Supplier<T> operation) {
    try {
        return operation.get();
    } catch (TicketNotFoundException e) {
        throw new NotFoundTicketException(ErrorCode.NOT_FOUND_TICKET);
    } catch (TicketTypeNotfoundException e) {
        throw new NotFoundTicketException(ErrorCode.NOT_FOUND_TICKET_TYPE);
    } catch (EventNotfoundException e) {
        throw new NotFoundTicketException(ErrorCode.NOT_FOUND_EVENT);
    }
}

다만 현재 구조도 충분히 이해하기 쉬우므로, 이는 선택적 개선사항입니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 088ef82 and 6017023.

📒 Files selected for processing (5)
  • src/main/java/com/permitseoul/permitserver/domain/ticket/api/controller/TicketController.java (1 hunks)
  • src/main/java/com/permitseoul/permitserver/domain/ticket/api/dto/res/DoorValidateUserTicket.java (1 hunks)
  • src/main/java/com/permitseoul/permitserver/domain/ticket/api/service/TicketService.java (3 hunks)
  • src/main/java/com/permitseoul/permitserver/domain/ticket/core/component/TicketRetriever.java (1 hunks)
  • src/main/java/com/permitseoul/permitserver/global/config/SecurityConfig.java (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
src/main/java/com/permitseoul/permitserver/domain/ticket/core/component/TicketRetriever.java (1)
src/main/java/com/permitseoul/permitserver/domain/ticket/core/exception/TicketNotFoundException.java (1)
  • TicketNotFoundException (3-4)
src/main/java/com/permitseoul/permitserver/domain/ticket/api/controller/TicketController.java (1)
src/main/java/com/permitseoul/permitserver/global/response/ApiResponseUtil.java (1)
  • ApiResponseUtil (7-29)
🔇 Additional comments (7)
src/main/java/com/permitseoul/permitserver/domain/ticket/core/component/TicketRetriever.java (1)

53-56: LGTM!

기존 findTicketEntityByTicketCode를 보완하는 도메인 레벨 조회 메서드가 잘 추가되었습니다. 트랜잭션 설정과 예외 처리도 적절합니다.

src/main/java/com/permitseoul/permitserver/domain/ticket/api/dto/res/DoorValidateUserTicket.java (1)

7-22: LGTM!

DTO 설계가 적절합니다. Record 사용과 정적 팩토리 메서드 패턴이 잘 적용되었으며, 날짜 포맷팅도 일관성 있게 처리되었습니다.

src/main/java/com/permitseoul/permitserver/domain/ticket/api/controller/TicketController.java (2)

39-46: LGTM!

메서드명 변경(confirmUserTicketByStaffAtDoor)으로 의도가 더 명확해졌고, 서비스 메서드 호출도 적절하게 업데이트되었습니다.


48-54: 체크 코드 검증 누락 확인 필요

새로운 검증 엔드포인트가 티켓 상태와 날짜만 확인하고 체크 코드는 검증하지 않습니다. 이는 스태프 확인 엔드포인트(confirmUserTicketByStaffAtDoor)와 차이가 있습니다.

검증 단계에서는 체크 코드 없이 티켓 유효성만 확인하고, 실제 사용 시에만 체크 코드를 검증하는 것이 의도된 설계인지 확인해 주세요.

src/main/java/com/permitseoul/permitserver/domain/ticket/api/service/TicketService.java (2)

114-131: LGTM!

메서드명 변경과 헬퍼 메서드 활용으로 코드가 더 명확해졌습니다. 트랜잭션 경계와 예외 처리도 적절합니다.


152-164: LGTM!

헬퍼 메서드들이 코드 중복을 효과적으로 제거하고 가독성을 향상시켰습니다. 특히 findTicketTypeAndVerifyTicketDate는 날짜 검증 로직을 재사용 가능하게 만들었습니다.

src/main/java/com/permitseoul/permitserver/global/config/SecurityConfig.java (1)

40-41: 티켓 코드 생성 로직 검증 완료 - 보안 우려 부당함

검토 후 원본 의견이 부당함을 확인했습니다.

주요 발견:

  1. 티켓 코드는 예측 불가능함: UUID.randomUUID() + SHA-256 해시를 사용하며, 해시의 처음 5바이트(10자 16진수)를 대문자로 변환하는 방식으로 생성됩니다. 이는 암호학적으로 안전하며 열거 불가능합니다.

  2. 공개 엔드포인트는 의도적이고 설계가 적절함:

    • GET /api/tickets/door/validation/{ticketCode}: 행사명, 티켓타입명, 시간정보만 반환 (모두 공개 정보)
    • POST /api/tickets/door/staff/confirm: 티켓코드 + checkCode(행사별 고유값) 필수 검증
  3. 데이터 노출 최소화: 반환 정보는 이미 공개된 행사/티켓 정보이며 개인정보나 민감 데이터 미포함

도어 디바이스 인증용으로 의도적으로 공개된 엔드포인트이며, 구현된 티켓 코드 생성 방식은 충분히 안전합니다.

Likely an incorrect or invalid review comment.

@sjk4618 sjk4618 merged commit 10a28c3 into dev Oct 23, 2025
2 checks passed
@sjk4618 sjk4618 deleted the feat/#162 branch October 23, 2025 15:46
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.

feat: 도어용 유저 티켓 유효성 검증 API

2 participants