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/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 +) { +} 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/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/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); + } +} 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.*;