From 9ca38c4d5b0139617be2cf8295d5d72655cda89e Mon Sep 17 00:00:00 2001 From: 2hyunjinn Date: Fri, 16 May 2025 18:05:35 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[feat]=20#139=20=ED=98=B8=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=EC=9A=A9=20DTO=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/festimate/team/api/admin/dto/AddHostRequest.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/java/org/festimate/team/api/admin/dto/AddHostRequest.java diff --git a/src/main/java/org/festimate/team/api/admin/dto/AddHostRequest.java b/src/main/java/org/festimate/team/api/admin/dto/AddHostRequest.java new file mode 100644 index 0000000..0f0e593 --- /dev/null +++ b/src/main/java/org/festimate/team/api/admin/dto/AddHostRequest.java @@ -0,0 +1,6 @@ +package org.festimate.team.api.admin.dto; + +public record AddHostRequest( + long participantId +) { +} From 09545ffa869aa026d19993ee77990921620d58f1 Mon Sep 17 00:00:00 2001 From: 2hyunjinn Date: Fri, 16 May 2025 18:06:01 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[chore]=20#139=20FestivalHost=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/festimate/team/domain/festival/entity/Festival.java | 1 + .../domain/{festival => festivalHost}/entity/FestivalHost.java | 3 ++- src/test/java/org/festimate/team/common/mock/MockFactory.java | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) rename src/main/java/org/festimate/team/domain/{festival => festivalHost}/entity/FestivalHost.java (94%) diff --git a/src/main/java/org/festimate/team/domain/festival/entity/Festival.java b/src/main/java/org/festimate/team/domain/festival/entity/Festival.java index f979ab7..c13359b 100644 --- a/src/main/java/org/festimate/team/domain/festival/entity/Festival.java +++ b/src/main/java/org/festimate/team/domain/festival/entity/Festival.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.festimate.team.domain.festivalHost.entity.FestivalHost; import org.festimate.team.domain.matching.entity.Matching; import org.festimate.team.domain.participant.entity.Participant; import org.festimate.team.domain.user.entity.User; diff --git a/src/main/java/org/festimate/team/domain/festival/entity/FestivalHost.java b/src/main/java/org/festimate/team/domain/festivalHost/entity/FestivalHost.java similarity index 94% rename from src/main/java/org/festimate/team/domain/festival/entity/FestivalHost.java rename to src/main/java/org/festimate/team/domain/festivalHost/entity/FestivalHost.java index 53a6acd..564cf29 100644 --- a/src/main/java/org/festimate/team/domain/festival/entity/FestivalHost.java +++ b/src/main/java/org/festimate/team/domain/festivalHost/entity/FestivalHost.java @@ -1,10 +1,11 @@ -package org.festimate.team.domain.festival.entity; +package org.festimate.team.domain.festivalHost.entity; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.festimate.team.domain.festival.entity.Festival; import org.festimate.team.domain.user.entity.User; import java.time.LocalDateTime; diff --git a/src/test/java/org/festimate/team/common/mock/MockFactory.java b/src/test/java/org/festimate/team/common/mock/MockFactory.java index dd49411..1b55eef 100644 --- a/src/test/java/org/festimate/team/common/mock/MockFactory.java +++ b/src/test/java/org/festimate/team/common/mock/MockFactory.java @@ -2,7 +2,7 @@ import org.festimate.team.domain.festival.entity.Category; import org.festimate.team.domain.festival.entity.Festival; -import org.festimate.team.domain.festival.entity.FestivalHost; +import org.festimate.team.domain.festivalHost.entity.FestivalHost; import org.festimate.team.domain.participant.entity.Participant; import org.festimate.team.domain.participant.entity.TypeResult; import org.festimate.team.domain.user.entity.*; From 4ba971c474bcce45c82580b16123cfba4f1949a2 Mon Sep 17 00:00:00 2001 From: 2hyunjinn Date: Fri, 16 May 2025 18:06:25 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[feat]=20#139=20=ED=98=B8=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20API=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team/api/admin/AdminController.java | 17 +++++++--- .../team/api/facade/FestivalHostFacade.java | 33 +++++++++++++++++++ .../repository/FestivalHostRepository.java | 8 +++++ .../service/FestivalHostService.java | 10 ++++++ .../service/impl/FestivalHostServiceImpl.java | 30 +++++++++++++++++ 5 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/festimate/team/api/facade/FestivalHostFacade.java create mode 100644 src/main/java/org/festimate/team/domain/festivalHost/repository/FestivalHostRepository.java create mode 100644 src/main/java/org/festimate/team/domain/festivalHost/service/FestivalHostService.java create mode 100644 src/main/java/org/festimate/team/domain/festivalHost/service/impl/FestivalHostServiceImpl.java diff --git a/src/main/java/org/festimate/team/api/admin/AdminController.java b/src/main/java/org/festimate/team/api/admin/AdminController.java index b733934..48db59b 100644 --- a/src/main/java/org/festimate/team/api/admin/AdminController.java +++ b/src/main/java/org/festimate/team/api/admin/AdminController.java @@ -2,10 +2,7 @@ import lombok.RequiredArgsConstructor; import org.festimate.team.api.admin.dto.*; -import org.festimate.team.api.facade.FestivalFacade; -import org.festimate.team.api.facade.MatchingFacade; -import org.festimate.team.api.facade.ParticipantFacade; -import org.festimate.team.api.facade.PointFacade; +import org.festimate.team.api.facade.*; import org.festimate.team.api.point.dto.PointHistoryResponse; import org.festimate.team.global.response.ApiResponse; import org.festimate.team.global.response.ResponseBuilder; @@ -21,6 +18,7 @@ public class AdminController { private final JwtService jwtService; private final FestivalFacade festivalFacade; + private final FestivalHostFacade festivalHostFacade; private final ParticipantFacade participantFacade; private final PointFacade pointFacade; private final MatchingFacade matchingFacade; @@ -77,6 +75,17 @@ public ResponseEntity> rechargePoints( return ResponseBuilder.ok(null); } + @PostMapping("/{festivalId}/hosts") + public ResponseEntity> addHost( + @RequestHeader("Authorization") String accessToken, + @PathVariable("festivalId") Long festivalId, + @RequestBody AddHostRequest request + ) { + Long userId = jwtService.parseTokenAndGetUserId(accessToken); + festivalHostFacade.addHost(userId, festivalId, request); + return ResponseBuilder.created(null); + } + @GetMapping("/{festivalId}/participants/{participantId}/points") public ResponseEntity> getParticipantPointHistory( @RequestHeader("Authorization") String accessToken, diff --git a/src/main/java/org/festimate/team/api/facade/FestivalHostFacade.java b/src/main/java/org/festimate/team/api/facade/FestivalHostFacade.java new file mode 100644 index 0000000..521e824 --- /dev/null +++ b/src/main/java/org/festimate/team/api/facade/FestivalHostFacade.java @@ -0,0 +1,33 @@ +package org.festimate.team.api.facade; + +import lombok.RequiredArgsConstructor; +import org.festimate.team.api.admin.dto.AddHostRequest; +import org.festimate.team.domain.festival.entity.Festival; +import org.festimate.team.domain.festival.service.FestivalService; +import org.festimate.team.domain.festivalHost.service.FestivalHostService; +import org.festimate.team.domain.participant.entity.Participant; +import org.festimate.team.domain.participant.service.ParticipantService; +import org.festimate.team.domain.user.entity.User; +import org.festimate.team.domain.user.service.UserService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +@RequiredArgsConstructor +public class FestivalHostFacade { + private final UserService userService; + private final FestivalService festivalService; + private final FestivalHostService festivalHostService; + private final ParticipantService participantService; + + @Transactional + public void addHost(Long userId, Long festivalId, AddHostRequest request) { + User host = userService.getUserByIdOrThrow(userId); + Festival festival = festivalService.getFestivalByIdOrThrow(festivalId); + festivalService.isHost(host, festival); + + Participant participant = participantService.getParticipantById(request.participantId()); + User newHost = participant.getUser(); + festivalHostService.addHost(newHost, festival); + } +} diff --git a/src/main/java/org/festimate/team/domain/festivalHost/repository/FestivalHostRepository.java b/src/main/java/org/festimate/team/domain/festivalHost/repository/FestivalHostRepository.java new file mode 100644 index 0000000..63d7953 --- /dev/null +++ b/src/main/java/org/festimate/team/domain/festivalHost/repository/FestivalHostRepository.java @@ -0,0 +1,8 @@ +package org.festimate.team.domain.festivalHost.repository; + +import org.festimate.team.domain.festivalHost.entity.FestivalHost; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface FestivalHostRepository extends JpaRepository { + +} diff --git a/src/main/java/org/festimate/team/domain/festivalHost/service/FestivalHostService.java b/src/main/java/org/festimate/team/domain/festivalHost/service/FestivalHostService.java new file mode 100644 index 0000000..e401cd6 --- /dev/null +++ b/src/main/java/org/festimate/team/domain/festivalHost/service/FestivalHostService.java @@ -0,0 +1,10 @@ +package org.festimate.team.domain.festivalHost.service; + +import org.festimate.team.domain.festival.entity.Festival; +import org.festimate.team.domain.user.entity.User; +import org.springframework.transaction.annotation.Transactional; + +public interface FestivalHostService { + @Transactional + void addHost(User newHost, Festival festival); +} diff --git a/src/main/java/org/festimate/team/domain/festivalHost/service/impl/FestivalHostServiceImpl.java b/src/main/java/org/festimate/team/domain/festivalHost/service/impl/FestivalHostServiceImpl.java new file mode 100644 index 0000000..de74d9c --- /dev/null +++ b/src/main/java/org/festimate/team/domain/festivalHost/service/impl/FestivalHostServiceImpl.java @@ -0,0 +1,30 @@ +package org.festimate.team.domain.festivalHost.service.impl; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.festimate.team.domain.festival.entity.Festival; +import org.festimate.team.domain.festivalHost.entity.FestivalHost; +import org.festimate.team.domain.festivalHost.repository.FestivalHostRepository; +import org.festimate.team.domain.festivalHost.service.FestivalHostService; +import org.festimate.team.domain.user.entity.User; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class FestivalHostServiceImpl implements FestivalHostService { + + private final FestivalHostRepository festivalHostRepository; + + @Transactional + @Override + public void addHost(User newHost, Festival festival) { + FestivalHost newFestivalHost = FestivalHost.builder() + .festival(festival) + .host(newHost) + .build(); + + festivalHostRepository.save(newFestivalHost); + } +}