Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,8 @@ CODEX.md

### ENV File ###
.env

docs

### macOS ###
.DS_Store
3 changes: 3 additions & 0 deletions application/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ dependencies {
// Transaction
implementation 'org.springframework:spring-tx'

// Spring Data (Page, Pageable)
implementation 'org.springframework.data:spring-data-commons'

// Thymeleaf
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.yapp.ndgl.application.domains.admin.controller;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.yapp.ndgl.application.domains.travel.controller.dto.AdminUserSuggestedTemplateResponse;
import com.yapp.ndgl.application.domains.travel.facade.UserSuggestedTemplateFacade;
import com.yapp.ndgl.common.response.PageResponse;
import com.yapp.ndgl.common.type.SuggestionStatus;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/admin/user-suggested-templates")
@RequiredArgsConstructor
public class AdminUserSuggestedTemplateViewController {

private final UserSuggestedTemplateFacade userSuggestedTemplateFacade;

@GetMapping
public String listPage(
@RequestParam(value = "status", required = false) SuggestionStatus status,
@RequestParam(value = "page", defaultValue = "0") int page,
@RequestParam(value = "size", defaultValue = "12") int size,
Comment thread
WooJJam marked this conversation as resolved.
Model model
) {
try {
PageResponse<AdminUserSuggestedTemplateResponse> result =
userSuggestedTemplateFacade.readUserSuggestedTemplatesForAdmin(status, page, size);
model.addAttribute("templates", result.getContent());
model.addAttribute("hasNext", result.isHasNext());
model.addAttribute("hasPrevious", result.isHasPrevious());
model.addAttribute("totalElements", result.getTotalElements());
model.addAttribute("totalPages", result.getTotalPages());
model.addAttribute("currentPage", page);
model.addAttribute("size", size);
model.addAttribute("status", status);
model.addAttribute("statuses", SuggestionStatus.values());
} catch (Exception e) {
log.error("사용자 제안 템플릿 목록 조회 실패", e);
model.addAttribute("errorMessage", "목록을 불러오는 중 오류가 발생했습니다.");
model.addAttribute("templates", List.of());
model.addAttribute("hasNext", false);
model.addAttribute("hasPrevious", false);
model.addAttribute("totalElements", 0L);
model.addAttribute("totalPages", 0);
model.addAttribute("currentPage", page);
model.addAttribute("size", size);
model.addAttribute("status", status);
model.addAttribute("statuses", SuggestionStatus.values());
}
return "admin/user-suggested-template-list";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.yapp.ndgl.application.domains.travel.controller.dto;

import java.time.LocalDateTime;

import com.yapp.ndgl.common.type.DomesticRegion;
import com.yapp.ndgl.common.type.SuggestionStatus;
import com.yapp.ndgl.common.type.TravelCategory;
import com.yapp.ndgl.domain.travel.UserSuggestedTemplate;

public record AdminUserSuggestedTemplateResponse(
Long id,
String videoId,
String videoLink,
String recommendReason,
String suggesterUuid,
TravelCategory category,
DomesticRegion region,
SuggestionStatus status,
LocalDateTime createdAt
) {

public static AdminUserSuggestedTemplateResponse toResponse(final UserSuggestedTemplate domain) {
return new AdminUserSuggestedTemplateResponse(
domain.getId(),
domain.getVideoId(),
domain.getVideoLink(),
domain.getRecommendReason(),
domain.getSuggesterUuid(),
domain.getCategory(),
domain.getRegion(),
domain.getStatus(),
domain.getCreatedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package com.yapp.ndgl.application.domains.travel.facade;

import com.yapp.ndgl.application.common.annotation.Facade;
import com.yapp.ndgl.application.domains.travel.controller.dto.AdminUserSuggestedTemplateResponse;
import com.yapp.ndgl.application.domains.travel.controller.dto.CreateUserSuggestedTemplateRequest;
import com.yapp.ndgl.application.domains.travel.event.publisher.UserSuggestedTemplateEventPublisher;
import com.yapp.ndgl.application.domains.travel.service.UserSuggestedTemplateService;
import com.yapp.ndgl.application.utils.YoutubeUrlParser;
import com.yapp.ndgl.common.response.PageResponse;
import com.yapp.ndgl.common.type.SuggestionStatus;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Facade
@RequiredArgsConstructor
public class UserSuggestedTemplateFacade {
Expand All @@ -28,4 +33,11 @@ public void createUserSuggestedTemplate(
public void subscribe(final Long templateId, final String uuid) {
userSuggestedTemplateService.subscribe(templateId, uuid);
}

public PageResponse<AdminUserSuggestedTemplateResponse> readUserSuggestedTemplatesForAdmin(
final SuggestionStatus status, final int page, final int size
) {
log.info("어드민 사용자 제안 템플릿 목록을 조회합니다. status = {}, page = {}, size = {}", status, page, size);
return userSuggestedTemplateService.readUserSuggestedTemplatesForAdmin(status, page, size);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.yapp.ndgl.application.domains.travel.service;

import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.yapp.ndgl.application.domains.travel.controller.dto.AdminUserSuggestedTemplateResponse;
import com.yapp.ndgl.application.domains.travel.controller.dto.CreateUserSuggestedTemplateRequest;
import com.yapp.ndgl.common.exception.GlobalException;
import com.yapp.ndgl.common.exception.TravelErrorCode;
import com.yapp.ndgl.common.response.PageResponse;
import com.yapp.ndgl.common.type.SuggestionStatus;
import com.yapp.ndgl.domain.travel.UserSuggestedTemplate;
import com.yapp.ndgl.application.common.annotation.DistributedLock;
Expand Down Expand Up @@ -64,4 +67,19 @@ public void subscribe(final Long templateId, final String uuid) {
log.info("사용자 제안 여행 템플릿 구독을 신청합니다. templateId={}, subscriberUuid={}", templateId, uuid);
userSuggestedTemplateDomainService.subscribe(templateId, uuid);
}

public PageResponse<AdminUserSuggestedTemplateResponse> readUserSuggestedTemplatesForAdmin(
final SuggestionStatus status, final int page, final int size
) {
Page<AdminUserSuggestedTemplateResponse> result = userSuggestedTemplateDomainService
.findUserSuggestedTemplates(status, page, size)
.map(AdminUserSuggestedTemplateResponse::toResponse);

return PageResponse.of(
result.getContent(),
result.getNumber(),
result.getSize(),
result.getTotalElements()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@
<div class="header">
<h1>여행 템플릿 목록</h1>
<div class="nav-links">
<a href="/admin/user-suggested-templates" class="nav-link">사용자 제안 템플릿</a>
<a href="/admin/travel-templates/new" class="nav-link">+ 새 템플릿 등록</a>
<form action="/admin/logout" method="POST" style="margin:0;">
<button type="submit" class="logout-link" style="background:none; border:none; cursor:pointer; padding:0;">로그아웃</button>
Expand Down
Loading
Loading