Skip to content

feat: [NDGL-133] 어드민 페이지 사용자 요청 컨텐츠 목록 조회#75

Merged
WooJJam merged 4 commits into
developfrom
feature/NDGL-133-Server-어드민-페이지-사용자-요청-컨텐츠-목록-조회
May 14, 2026

Hidden character warning

The head ref may contain hidden characters: "feature/NDGL-133-Server-\uc5b4\ub4dc\ubbfc-\ud398\uc774\uc9c0-\uc0ac\uc6a9\uc790-\uc694\uccad-\ucee8\ud150\uce20-\ubaa9\ub85d-\uc870\ud68c"
Merged

feat: [NDGL-133] 어드민 페이지 사용자 요청 컨텐츠 목록 조회#75
WooJJam merged 4 commits into
developfrom
feature/NDGL-133-Server-어드민-페이지-사용자-요청-컨텐츠-목록-조회

Conversation

@WooJJam
Copy link
Copy Markdown
Member

@WooJJam WooJJam commented May 13, 2026

🤖 이 PR은 AI를 사용하여 자동 생성되었습니다.

요약

관리자에서 사용자 제안 영상 템플릿을 조회·필터링·페이징할 수 있는 목록 페이지와 관련 백엔드 흐름을 추가합니다.

변경 내용

  • 관리자용 사용자 제안 템플릿 목록 페이지와 네비게이션 링크를 추가
  • 어드민용 목록 조회 API 및 응답 DTO(PageResponse 포함)를 추가
  • 상태 기반 조회·페이징 지원을 위한 레포지토리 커스텀 쿼리와 페이징 구현을 추가
  • 서비스·패사드에서 어드민 조회 흐름을 노출하도록 변경
  • 빌드 의존성(spring-data-commons, thymeleaf)과 .gitignore 항목을 추가

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 관리자 대시보드에 사용자 제안 템플릿 관리 페이지 추가
    • 상태별 필터링 및 페이지네이션 지원
  • Chores

    • 환경 설정 파일 및 의존성 업데이트

Review Change Stack

@WooJJam WooJJam self-assigned this May 13, 2026
@WooJJam WooJJam added feat 새로운 기능 추가 ai-generated AI로 생성한 PR labels May 13, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 13, 2026

개요

이 PR은 관리자가 상태별로 필터링하고 페이지네이션을 사용하여 사용자가 제안한 템플릿을 조회할 수 있는 기능을 추가합니다. 공통 페이지 응답 DTO, QueryDSL 저장소 구현, 도메인 및 애플리케이션 계층의 조회 메서드, 관리자 MVC 컨트롤러, 그리고 Thymeleaf UI 템플릿을 포함합니다.

변경 사항

Admin User-Suggested Template Listing

계층 / 파일 설명
페이지네이션 응답 계약 및 의존성
application/build.gradle, common/src/main/java/com/yapp/ndgl/common/response/PageResponse.java
Spring Data Commons 라이브러리를 추가하고 제네릭 PageResponse<T> DTO를 정의하여 모든 계층에서 일관된 페이지 메타데이터(페이지, 크기, 총 페이지, 총 요소, 다음/이전 여부)를 반환합니다.
도메인 모델 및 엔티티-도메인 매핑
domain/domain-service/src/main/java/com/yapp/ndgl/domain/travel/UserSuggestedTemplate.java, domain/domain-service/src/main/java/com/yapp/ndgl/domain/travel/mapper/UserSuggestedTemplateMapper.java
UserSuggestedTemplate 도메인 모델에 createdAt 타임스탬프 필드를 추가하고, 매퍼를 업데이트하여 엔티티에서 도메인 객체로 생성 시간을 매핑합니다.
저장소 커스텀 쿼리 구현
domain/domain-rdb/src/main/java/com/yapp/ndgl/domain/travel/repository/UserSuggestedTemplateRepositoryCustom.java, domain/domain-rdb/src/main/java/com/yapp/ndgl/domain/travel/repository/UserSuggestedTemplateRepository.java, domain/domain-rdb/src/main/java/com/yapp/ndgl/domain/travel/repository/UserSuggestedTemplateRepositoryImpl.java
QueryDSL을 사용하여 선택적 상태 필터를 적용하고 createdAt 내림차순으로 정렬한 페이지된 템플릿 쿼리를 구현합니다. 별도의 카운트 쿼리로 총 개수를 조회하고 PageImpl로 래핑합니다.
도메인 서비스 페이지네이션 메서드
domain/domain-service/src/main/java/com/yapp/ndgl/domain/travel/service/UserSuggestedTemplateDomainService.java
PageRequest를 생성하여 저장소로부터 페이지된 엔티티를 조회한 후 도메인 모델로 매핑하는 읽기 전용 메서드를 추가합니다.
애플리케이션 서비스 및 파사드 관리자 메서드
application/src/main/java/com/yapp/ndgl/application/domains/travel/service/UserSuggestedTemplateService.java, application/src/main/java/com/yapp/ndgl/application/domains/travel/facade/UserSuggestedTemplateFacade.java
애플리케이션 서비스에 도메인 결과를 AdminUserSuggestedTemplateResponse DTO로 변환하고 PageResponse로 래핑하는 메서드를 추가합니다. 파사드는 로깅과 함께 이 메서드를 공개 인터페이스로 노출합니다.
MVC 컨트롤러 및 응답 DTO
application/src/main/java/com/yapp/ndgl/application/domains/admin/controller/AdminUserSuggestedTemplateViewController.java, application/src/main/java/com/yapp/ndgl/application/domains/travel/controller/dto/AdminUserSuggestedTemplateResponse.java
/admin/user-suggested-templates 엔드포인트를 매핑하는 컨트롤러를 추가하여 상태, 페이지, 크기 파라미터를 받고 파사드를 호출한 후 뷰 모델에 결과와 메타데이터를 채웁니다. 예외 발생 시 로깅하고 빈 목록으로 폴백합니다. AdminUserSuggestedTemplateResponse 레코드는 도메인 객체를 관리자 응답 형식으로 변환합니다.
관리자 리스트 템플릿 및 네비게이션
application/src/main/resources/templates/admin/user-suggested-template-list.html, application/src/main/resources/templates/admin/travel-template-list.html
Thymeleaf 템플릿을 추가하여 사용자 제안 템플릿을 그리드 레이아웃으로 표시하고, 상태 필터 폼, 빈 상태 배너, 각 카드에 비디오 썸네일(오류 시 폴백), 추천 이유, 포맷된 생성 시간, 조건부 클래스의 상태 배지, 제안자 UUID, 선택적 카테고리/지역 태그, 그리고 페이지네이션 컨트롤을 구현합니다. 기존 관리자 네비게이션에 "사용자 제안 템플릿" 링크를 추가합니다.
빌드 및 환경 설정
.gitignore
.env 파일, docs 디렉토리, macOS의 .DS_Store 파일을 제외합니다.

시퀀스 다이어그램

sequenceDiagram
    participant Admin as Admin User
    participant Browser as Web Browser
    participant Controller as AdminUserSuggestedTemplateViewController
    participant Facade as UserSuggestedTemplateFacade
    participant Service as UserSuggestedTemplateService
    participant DomainService as UserSuggestedTemplateDomainService
    participant Repository as UserSuggestedTemplateRepositoryImpl
    participant Template as Thymeleaf Template

    Admin->>Browser: GET /admin/user-suggested-templates?status=PENDING&page=0&size=12
    Browser->>Controller: HTTP GET request
    Controller->>Facade: readUserSuggestedTemplatesForAdmin(PENDING, 0, 12)
    Facade->>Facade: log info message
    Facade->>Service: readUserSuggestedTemplatesForAdmin(PENDING, 0, 12)
    Service->>DomainService: findUserSuggestedTemplates(PENDING, 0, 12)
    DomainService->>DomainService: create PageRequest(0, 12, createdAt DESC)
    DomainService->>Repository: findByStatus(PENDING, PageRequest)
    Repository->>Repository: build QueryDSL predicate with status filter
    Repository->>Repository: fetch page content with sort and offset/limit
    Repository->>Repository: execute separate count query
    Repository-->>DomainService: Page<UserSuggestedTemplateEntity>
    DomainService->>DomainService: map entities to UserSuggestedTemplate domain objects
    DomainService-->>Service: Page<UserSuggestedTemplate>
    Service->>Service: map domain objects to AdminUserSuggestedTemplateResponse
    Service->>Service: create PageResponse with content and metadata
    Service-->>Facade: PageResponse<AdminUserSuggestedTemplateResponse>
    Facade-->>Controller: PageResponse<AdminUserSuggestedTemplateResponse>
    Controller->>Controller: populate model with templates and pagination metadata
    Controller->>Template: render admin/user-suggested-template-list
    Template-->>Browser: rendered HTML with template grid and pagination
    Browser-->>Admin: display admin template listing page
Loading

예상 코드 리뷰 노력

🎯 3 (중간) | ⏱️ ~25분

🐰 제안 템플릿을 조회하는 길,
페이지로 나누어 깔끔하게,
QueryDSL과 함께하는 쿼리,
관리자 화면에 그려지는 아름다움,
상태 필터링으로 마무리!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 '어드민 페이지 사용자 요청 컨텐츠 목록 조회'로 변경 사항의 주요 내용을 명확하게 요약하고 있습니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/NDGL-133-Server-어드민-페이지-사용자-요청-컨텐츠-목록-조회

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
Copy Markdown

@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: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@application/src/main/java/com/yapp/ndgl/application/domains/admin/controller/AdminUserSuggestedTemplateViewController.java`:
- Around line 30-31: The controller AdminUserSuggestedTemplateViewController
accepts query params page and size without validation; add input constraints
(e.g., annotate the method parameters page and size with javax.validation
annotations like `@Min`(0) for page and `@Min`(1) plus a sensible `@Max`(100> or
configured limit for size) or explicitly clamp the values at the start of the
handler) and ensure `@Validated` is present on the controller class (or method) so
those annotations are enforced; update the signatures for the parameters named
page and size and/or add an initial normalization step to bound invalid values
to safe defaults.

In
`@application/src/main/resources/templates/admin/user-suggested-template-list.html`:
- Line 231: The template directly binds user input t.videoLink into href,
exposing stored XSS via malicious schemes; update the code so the view only
renders the anchor when the server has validated/normalized t.videoLink (accept
only https and allowlisted hostnames such as youtube.com / youtu.be) and rejects
or clears any other schemes/domains — implement validation/normalization in the
backend where t.videoLink is set (or add a helper/validator used by the
controller) and ensure the template only uses the validated field (or a boolean
like isVideoLinkValid) so that if validation fails the anchor is not rendered;
also ensure output is HTML-escaped if any fallback rendering occurs.

In `@common/src/main/java/com/yapp/ndgl/common/response/PageResponse.java`:
- Around line 41-50: PageResponse.of currently accepts negative inputs leading
to bad metadata; add input validation at the start of the PageResponse.of(...)
method to assert that size >= 0, page >= 0 and totalElements >= 0 and throw an
IllegalArgumentException (with a clear message naming the offending parameter)
if any check fails; keep size == 0 allowed (it already produces totalPages == 0)
and perform these checks before computing totalPages/hasNext/hasPrevious so
invalid values are rejected early.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 05ea173d-065e-4def-a6bb-3e7effd7a4ab

📥 Commits

Reviewing files that changed from the base of the PR and between fc3f3e5 and 66ff044.

📒 Files selected for processing (15)
  • .gitignore
  • application/build.gradle
  • application/src/main/java/com/yapp/ndgl/application/domains/admin/controller/AdminUserSuggestedTemplateViewController.java
  • application/src/main/java/com/yapp/ndgl/application/domains/travel/controller/dto/AdminUserSuggestedTemplateResponse.java
  • application/src/main/java/com/yapp/ndgl/application/domains/travel/facade/UserSuggestedTemplateFacade.java
  • application/src/main/java/com/yapp/ndgl/application/domains/travel/service/UserSuggestedTemplateService.java
  • application/src/main/resources/templates/admin/travel-template-list.html
  • application/src/main/resources/templates/admin/user-suggested-template-list.html
  • common/src/main/java/com/yapp/ndgl/common/response/PageResponse.java
  • domain/domain-rdb/src/main/java/com/yapp/ndgl/domain/travel/repository/UserSuggestedTemplateRepository.java
  • domain/domain-rdb/src/main/java/com/yapp/ndgl/domain/travel/repository/UserSuggestedTemplateRepositoryCustom.java
  • domain/domain-rdb/src/main/java/com/yapp/ndgl/domain/travel/repository/UserSuggestedTemplateRepositoryImpl.java
  • domain/domain-service/src/main/java/com/yapp/ndgl/domain/travel/UserSuggestedTemplate.java
  • domain/domain-service/src/main/java/com/yapp/ndgl/domain/travel/mapper/UserSuggestedTemplateMapper.java
  • domain/domain-service/src/main/java/com/yapp/ndgl/domain/travel/service/UserSuggestedTemplateDomainService.java

@WooJJam WooJJam merged commit 0ab3fb3 into develop May 14, 2026
12 of 13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-generated AI로 생성한 PR feat 새로운 기능 추가

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant