diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminController.java b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminController.java index b8b0d7360..9beaa7816 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminController.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminController.java @@ -68,4 +68,11 @@ public ResponseEntity agendaTeamUpdate(@RequestBody @Valid AgendaTeamUpdat agendaTeamAdminService.updateAgendaTeam(agendaTeamUpdateDto); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } + + @PatchMapping("/cancel") + public ResponseEntity agendaTeamCancel(@RequestParam("team_key") UUID teamKey) { + AgendaTeam agendaTeam = agendaTeamAdminService.getAgendaTeamByTeamKey(teamKey); + agendaTeamAdminService.cancelAgendaTeam(agendaTeam); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } } diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java index 3e336c0fc..0c90a5bfe 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java @@ -91,4 +91,12 @@ public void updateAgendaTeam(AgendaTeamUpdateDto agendaTeamUpdateDto) { agendaTeamProfileAdminRepository.save(agendaTeamProfile); }); } + + @Transactional + public void cancelAgendaTeam(AgendaTeam agendaTeam) { + List agendaTeamProfiles = agendaTeamProfileAdminRepository + .findAllByAgendaTeamAndIsExistIsTrue(agendaTeam); + agendaTeamProfiles.forEach(AgendaTeamProfile::changeExistFalse); + agendaTeam.adminCancelTeam(); + } } diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/user/agenda/controller/AgendaController.java b/gg-agenda-api/src/main/java/gg/agenda/api/user/agenda/controller/AgendaController.java index d8bb4ad13..d2efc4b12 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/user/agenda/controller/AgendaController.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/user/agenda/controller/AgendaController.java @@ -32,13 +32,14 @@ import gg.agenda.api.user.agenda.controller.response.AgendaSimpleResDto; import gg.agenda.api.user.agenda.service.AgendaService; import gg.agenda.api.user.agendaannouncement.service.AgendaAnnouncementService; +import gg.agenda.api.utils.AgendaSlackService; import gg.auth.UserDto; import gg.auth.argumentresolver.Login; import gg.data.agenda.Agenda; +import gg.data.agenda.AgendaTeam; import gg.utils.dto.PageRequestDto; import gg.utils.dto.PageResponseDto; import gg.utils.exception.custom.InvalidParameterException; -import gg.utils.exception.user.UserImageLargeException; import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; @@ -48,7 +49,7 @@ public class AgendaController { private final AgendaService agendaService; - + private final AgendaSlackService agendaSlackService; private final AgendaAnnouncementService agendaAnnouncementService; @GetMapping @@ -73,7 +74,7 @@ public ResponseEntity> agendaListCurrent() { public ResponseEntity agendaAdd(@Login @Parameter(hidden = true) UserDto user, @ModelAttribute @Valid AgendaCreateReqDto agendaCreateReqDto, @RequestParam(required = false) MultipartFile agendaPoster) { - if (Objects.nonNull(agendaPoster) && agendaPoster.getSize() > 1024 * 1024) { // 1MB + if (Objects.nonNull(agendaPoster) && agendaPoster.getSize() > 1024 * 1024) { // 1MB throw new InvalidParameterException(AGENDA_POSTER_SIZE_TOO_LARGE); } UUID agendaKey = agendaService.addAgenda(agendaCreateReqDto, agendaPoster, user).getAgendaKey(); @@ -107,6 +108,7 @@ public ResponseEntity agendaEndWithAwards(@RequestParam("agenda_key") UUID agendaService.awardAgenda(agendaAwardsReqDto, agenda); } agendaService.finishAgenda(agenda); + agendaSlackService.slackFinishAgenda(agenda); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @@ -115,7 +117,9 @@ public ResponseEntity agendaConfirm(@RequestParam("agenda_key") UUID agend @Login @Parameter(hidden = true) UserDto user) { Agenda agenda = agendaService.findAgendaByAgendaKey(agendaKey); agenda.mustModifiedByHost(user.getIntraId()); - agendaService.confirmAgendaAndRefundTicketForOpenTeam(agenda); + List failTeam = agendaService.confirmAgendaAndRefundTicketForOpenTeam(agenda); + agendaSlackService.slackConfirmAgenda(agenda); + agendaSlackService.slackCancelByAgendaConfirm(agenda, failTeam); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @@ -125,6 +129,7 @@ public ResponseEntity agendaCancel(@RequestParam("agenda_key") UUID agenda Agenda agenda = agendaService.findAgendaByAgendaKey(agendaKey); agenda.mustModifiedByHost(user.getIntraId()); agendaService.cancelAgenda(agenda); + agendaSlackService.slackCancelAgenda(agenda); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } } diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/user/agenda/service/AgendaService.java b/gg-agenda-api/src/main/java/gg/agenda/api/user/agenda/service/AgendaService.java index 46cbfe25e..1ceeb7494 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/user/agenda/service/AgendaService.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/user/agenda/service/AgendaService.java @@ -20,7 +20,7 @@ import gg.agenda.api.user.agenda.controller.request.AgendaCreateReqDto; import gg.agenda.api.user.agenda.controller.request.AgendaTeamAward; import gg.agenda.api.user.agendateam.service.AgendaTeamService; -import gg.agenda.api.user.ticket.service.TicketService; +import gg.agenda.api.utils.SnsMessageUtil; import gg.auth.UserDto; import gg.data.agenda.Agenda; import gg.data.agenda.AgendaTeam; @@ -33,6 +33,7 @@ import gg.utils.exception.custom.ForbiddenException; import gg.utils.exception.custom.NotExistException; import gg.utils.file.handler.ImageHandler; +import gg.utils.sns.MessageSender; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -47,12 +48,14 @@ public class AgendaService { private final AgendaTeamProfileRepository agendaTeamProfileRepository; - private final TicketService ticketService; - private final AgendaTeamService agendaTeamService; private final ImageHandler imageHandler; + private final MessageSender messageSender; + + private final SnsMessageUtil snsMessageUtil; + @Value("${info.image.defaultUrl}") private String defaultUri; @@ -110,7 +113,7 @@ public void awardAgenda(AgendaAwardsReqDto agendaAwardsReqDto, Agenda agenda) { } @Transactional - public void confirmAgendaAndRefundTicketForOpenTeam(Agenda agenda) { + public List confirmAgendaAndRefundTicketForOpenTeam(Agenda agenda) { if (agenda.getCurrentTeam() < agenda.getMinTeam()) { throw new ForbiddenException("팀이 모두 구성되지 않았습니다."); } @@ -120,6 +123,7 @@ public void confirmAgendaAndRefundTicketForOpenTeam(Agenda agenda) { agendaTeamService.leaveTeamAll(openTeam); } agenda.confirmAgenda(); + return openTeams; } @Transactional diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaannouncement/controller/AgendaAnnouncementController.java b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaannouncement/controller/AgendaAnnouncementController.java index 0d043718c..c67941230 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaannouncement/controller/AgendaAnnouncementController.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaannouncement/controller/AgendaAnnouncementController.java @@ -24,6 +24,7 @@ import gg.agenda.api.user.agendaannouncement.controller.request.AgendaAnnouncementCreateReqDto; import gg.agenda.api.user.agendaannouncement.controller.response.AgendaAnnouncementResDto; import gg.agenda.api.user.agendaannouncement.service.AgendaAnnouncementService; +import gg.agenda.api.utils.AgendaSlackService; import gg.auth.UserDto; import gg.auth.argumentresolver.Login; import gg.data.agenda.Agenda; @@ -38,7 +39,7 @@ public class AgendaAnnouncementController { private final AgendaService agendaService; - + private final AgendaSlackService agendaSlackService; private final AgendaAnnouncementService agendaAnnouncementService; @PostMapping @@ -46,7 +47,9 @@ public ResponseEntity agendaAnnouncementAdd(@Login UserDto user, @RequestP @RequestBody @Valid AgendaAnnouncementCreateReqDto agendaAnnouncementCreateReqDto) { Agenda agenda = agendaService.findAgendaByAgendaKey(agendaKey); agenda.mustModifiedByHost(user.getIntraId()); - agendaAnnouncementService.addAgendaAnnouncement(agendaAnnouncementCreateReqDto, agenda); + AgendaAnnouncement newAnnounce = agendaAnnouncementService + .addAgendaAnnouncement(agendaAnnouncementCreateReqDto, agenda); + agendaSlackService.slackAddAgendaAnnouncement(agenda, newAnnounce); return ResponseEntity.status(HttpStatus.CREATED).build(); } diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaannouncement/service/AgendaAnnouncementService.java b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaannouncement/service/AgendaAnnouncementService.java index bd17cc9cb..e34e789d1 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaannouncement/service/AgendaAnnouncementService.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaannouncement/service/AgendaAnnouncementService.java @@ -1,6 +1,5 @@ package gg.agenda.api.user.agendaannouncement.service; -import java.util.List; import java.util.Optional; import org.springframework.data.domain.Page; @@ -9,22 +8,28 @@ import org.springframework.transaction.annotation.Transactional; import gg.agenda.api.user.agendaannouncement.controller.request.AgendaAnnouncementCreateReqDto; +import gg.agenda.api.utils.SnsMessageUtil; import gg.data.agenda.Agenda; import gg.data.agenda.AgendaAnnouncement; import gg.repo.agenda.AgendaAnnouncementRepository; +import gg.repo.agenda.AgendaTeamProfileRepository; +import gg.utils.sns.MessageSender; import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor public class AgendaAnnouncementService { + private final MessageSender messageSender; + private final SnsMessageUtil snsMessageUtil; + private final AgendaTeamProfileRepository agendaTeamProfileRepository; private final AgendaAnnouncementRepository agendaAnnouncementRepository; @Transactional - public void addAgendaAnnouncement(AgendaAnnouncementCreateReqDto announceCreateDto, Agenda agenda) { + public AgendaAnnouncement addAgendaAnnouncement(AgendaAnnouncementCreateReqDto announceCreateDto, Agenda agenda) { AgendaAnnouncement newAnnounce = AgendaAnnouncementCreateReqDto .MapStruct.INSTANCE.toEntity(announceCreateDto, agenda); - agendaAnnouncementRepository.save(newAnnounce); + return agendaAnnouncementRepository.save(newAnnounce); } @Transactional(readOnly = true) diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaprofile/controller/AgendaProfileController.java b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaprofile/controller/AgendaProfileController.java index 0e5755efe..4f3abac15 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaprofile/controller/AgendaProfileController.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaprofile/controller/AgendaProfileController.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import org.springframework.data.domain.Page; @@ -73,10 +74,10 @@ public ResponseEntity myAgendaProfileInfoDetails */ @GetMapping public ResponseEntity myAgendaProfileDetails( - @Login @Parameter(hidden = true) UserDto user) { + @Login @Parameter(hidden = true) UserDto user, HttpServletResponse response) { AgendaProfile profile = agendaProfileFindService.findAgendaProfileByIntraId(user.getIntraId()); int ticketCount = ticketService.findTicketList(profile).size(); - IntraProfile intraProfile = intraProfileUtils.getIntraProfile(); + IntraProfile intraProfile = intraProfileUtils.getIntraProfile(response); MyAgendaProfileDetailsResDto agendaProfileDetails = MyAgendaProfileDetailsResDto.toDto( profile, ticketCount, intraProfile); return ResponseEntity.ok(agendaProfileDetails); @@ -109,9 +110,10 @@ public ResponseEntity> getCurrentAttendAgend } @GetMapping("/{intraId}") - public ResponseEntity agendaProfileDetails(@PathVariable String intraId) { + public ResponseEntity agendaProfileDetails(@PathVariable String intraId, + HttpServletResponse response) { AgendaProfile profile = agendaProfileFindService.findAgendaProfileByIntraId(intraId); - IntraProfile intraProfile = intraProfileUtils.getIntraProfile(intraId); + IntraProfile intraProfile = intraProfileUtils.getIntraProfile(intraId, response); AgendaProfileDetailsResDto resDto = AgendaProfileDetailsResDto.toDto(profile, intraProfile); return ResponseEntity.ok(resDto); } diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaprofile/service/IntraProfileUtils.java b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaprofile/service/IntraProfileUtils.java index 6e7c39e95..610c16db5 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaprofile/service/IntraProfileUtils.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendaprofile/service/IntraProfileUtils.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Objects; +import javax.servlet.http.HttpServletResponse; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; @@ -14,6 +16,7 @@ import gg.agenda.api.user.agendaprofile.service.intraprofile.IntraProfile; import gg.agenda.api.user.agendaprofile.service.intraprofile.IntraProfileResponse; import gg.auth.FortyTwoAuthUtil; +import gg.utils.cookie.CookieUtil; import gg.utils.exception.custom.AuthenticationException; import gg.utils.external.ApiUtil; import lombok.RequiredArgsConstructor; @@ -31,7 +34,9 @@ public class IntraProfileUtils { private final ApiUtil apiUtil; - public IntraProfile getIntraProfile() { + private final CookieUtil cookieUtil; + + public IntraProfile getIntraProfile(HttpServletResponse response) { try { IntraProfileResponse intraProfileResponse = requestIntraProfile(INTRA_PROFILE_URL); intraProfileResponseValidation(intraProfileResponse); @@ -40,11 +45,12 @@ public IntraProfile getIntraProfile() { return new IntraProfile(intraImage.getLink(), intraAchievements); } catch (Exception e) { log.error("42 Intra Profile API 호출 실패", e); + cookieUtil.deleteCookie(response, "refresh_token"); throw new AuthenticationException(AUTH_NOT_FOUND); } } - public IntraProfile getIntraProfile(String intraId) { + public IntraProfile getIntraProfile(String intraId, HttpServletResponse response) { try { IntraProfileResponse intraProfileResponse = requestIntraProfile(INTRA_USERS_URL + intraId); intraProfileResponseValidation(intraProfileResponse); @@ -53,6 +59,7 @@ public IntraProfile getIntraProfile(String intraId) { return new IntraProfile(intraImage.getLink(), intraAchievements); } catch (Exception e) { log.error("42 Intra Profile API 호출 실패", e); + cookieUtil.deleteCookie(response, "refresh_token"); throw new AuthenticationException(AUTH_NOT_FOUND); } } @@ -71,7 +78,6 @@ private IntraProfileResponse requestIntraProfile(String requestUrl) { } } - private void intraProfileResponseValidation(IntraProfileResponse intraProfileResponse) { if (Objects.isNull(intraProfileResponse)) { throw new AuthenticationException(AUTH_NOT_FOUND); diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendateam/controller/AgendaTeamController.java b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendateam/controller/AgendaTeamController.java index 35bd35fdd..6cea4f418 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendateam/controller/AgendaTeamController.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendateam/controller/AgendaTeamController.java @@ -24,6 +24,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import gg.agenda.api.user.agenda.service.AgendaService; import gg.agenda.api.user.agendateam.controller.request.TeamCreateReqDto; import gg.agenda.api.user.agendateam.controller.request.TeamKeyReqDto; import gg.agenda.api.user.agendateam.controller.request.TeamUpdateReqDto; @@ -33,8 +34,10 @@ import gg.agenda.api.user.agendateam.controller.response.TeamDetailsResDto; import gg.agenda.api.user.agendateam.controller.response.TeamKeyResDto; import gg.agenda.api.user.agendateam.service.AgendaTeamService; +import gg.agenda.api.utils.AgendaSlackService; import gg.auth.UserDto; import gg.auth.argumentresolver.Login; +import gg.data.agenda.Agenda; import gg.data.agenda.AgendaTeam; import gg.data.agenda.type.Coalition; import gg.utils.dto.PageRequestDto; @@ -46,7 +49,9 @@ @RequiredArgsConstructor @RequestMapping("/agenda/team") public class AgendaTeamController { + private final AgendaService agendaService; private final AgendaTeamService agendaTeamService; + private final AgendaSlackService agendaSlackService; /** * 내 팀 간단 정보 조회 @@ -94,7 +99,9 @@ public ResponseEntity agendaTeamAdd(@Parameter(hidden = true) @Lo @PatchMapping("/confirm") public ResponseEntity confirmTeam(@Parameter(hidden = true) @Login UserDto user, @ModelAttribute @Valid TeamKeyReqDto teamKeyReqDto, @RequestParam("agenda_key") UUID agendaKey) { - agendaTeamService.confirmTeam(user, agendaKey, teamKeyReqDto.getTeamKey()); + Agenda agenda = agendaService.findAgendaByAgendaKey(agendaKey); + AgendaTeam agendaTeam = agendaTeamService.confirmTeam(user, agenda, teamKeyReqDto.getTeamKey()); + agendaSlackService.slackConfirmAgendaTeam(agenda, agendaTeam); return ResponseEntity.ok().build(); } @@ -110,9 +117,11 @@ public ResponseEntity leaveAgendaTeam(@Parameter(hidden = true) @Login Use if (agendaTeam.getLeaderIntraId().equals(user.getIntraId())) { agendaTeam.agendaTeamStatusMustBeOpenAndConfirm(); agendaTeamService.leaveTeamAll(agendaTeam); + agendaSlackService.slackCancelAgendaTeam(agendaTeam.getAgenda(), agendaTeam); } else { agendaTeam.agendaTeamStatusMustBeOpen(); agendaTeamService.leaveTeamMate(agendaTeam, user); + agendaSlackService.slackLeaveTeamMate(agendaTeam.getAgenda(), agendaTeam, user.getIntraId()); } return ResponseEntity.noContent().build(); } @@ -174,7 +183,10 @@ public ResponseEntity> confirmTeamList( @PostMapping("/join") public ResponseEntity attendTeamModify(@Parameter(hidden = true) @Login UserDto user, @ModelAttribute @Valid TeamKeyReqDto teamKeyReqDto, @RequestParam("agenda_key") UUID agendaKey) { - agendaTeamService.modifyAttendTeam(user, teamKeyReqDto, agendaKey); + Agenda agenda = agendaService.findAgendaByAgendaKey(agendaKey); + AgendaTeam agendaTeam = agendaTeamService.getAgendaTeam(teamKeyReqDto.getTeamKey()); + agendaTeamService.modifyAttendTeam(user, agendaTeam, agenda); + agendaSlackService.slackAttendTeamMate(agenda, agendaTeam, user.getIntraId()); return ResponseEntity.status(HttpStatus.CREATED).build(); } diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendateam/service/AgendaTeamService.java b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendateam/service/AgendaTeamService.java index c72fd7db1..7dcfb9ffe 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/user/agendateam/service/AgendaTeamService.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/user/agendateam/service/AgendaTeamService.java @@ -22,6 +22,7 @@ import gg.agenda.api.user.agendateam.controller.response.TeamDetailsResDto; import gg.agenda.api.user.agendateam.controller.response.TeamKeyResDto; import gg.agenda.api.user.ticket.service.TicketService; +import gg.agenda.api.utils.SnsMessageUtil; import gg.auth.UserDto; import gg.data.agenda.Agenda; import gg.data.agenda.AgendaProfile; @@ -40,12 +41,15 @@ import gg.utils.exception.custom.DuplicationException; import gg.utils.exception.custom.ForbiddenException; import gg.utils.exception.custom.NotExistException; +import gg.utils.sns.MessageSender; import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor public class AgendaTeamService { private final TicketService ticketService; + private final MessageSender messageSender; + private final SnsMessageUtil snsMessageUtil; private final AgendaRepository agendaRepository; private final TicketRepository ticketRepository; private final AgendaTeamRepository agendaTeamRepository; @@ -161,10 +165,7 @@ public TeamKeyResDto addAgendaTeam(UserDto user, TeamCreateReqDto teamCreateReqD * @param user 사용자 정보, teamKeyReqDto 팀 KEY 요청 정보, agendaId 아젠다 아이디 */ @Transactional - public void confirmTeam(UserDto user, UUID agendaKey, UUID teamKey) { - Agenda agenda = agendaRepository.findByAgendaKey(agendaKey) - .orElseThrow(() -> new NotExistException(AGENDA_NOT_FOUND)); - + public AgendaTeam confirmTeam(UserDto user, Agenda agenda, UUID teamKey) { AgendaTeam agendaTeam = agendaTeamRepository .findByAgendaAndTeamKeyAndStatus(agenda, teamKey, OPEN, CONFIRM) .orElseThrow(() -> new NotExistException(AGENDA_TEAM_NOT_FOUND)); @@ -177,7 +178,7 @@ public void confirmTeam(UserDto user, UUID agendaKey, UUID teamKey) { } agenda.confirmTeam(agendaTeam.getLocation(), LocalDateTime.now()); agendaTeam.confirm(); - agendaTeamRepository.save(agendaTeam); + return agendaTeamRepository.save(agendaTeam); } /** @@ -246,20 +247,12 @@ public List getCoalitionsFromAgendaTeam(AgendaTeam agendaTeam) { /** * 아젠다 팀 참여하기 - * @param user 사용자 정보, teamKeyReqDto 팀 KEY 요청 정보, agendaId 아젠다 아이디 */ @Transactional - public void modifyAttendTeam(UserDto user, TeamKeyReqDto teamKeyReqDto, UUID agendaKey) { + public void modifyAttendTeam(UserDto user, AgendaTeam agendaTeam, Agenda agenda) { AgendaProfile agendaProfile = agendaProfileRepository.findByUserId(user.getId()) .orElseThrow(() -> new NotExistException(AGENDA_PROFILE_NOT_FOUND)); - Agenda agenda = agendaRepository.findByAgendaKey(agendaKey) - .orElseThrow(() -> new NotExistException(AGENDA_NOT_FOUND)); - - AgendaTeam agendaTeam = agendaTeamRepository - .findByAgendaAndTeamKeyAndStatus(agenda, teamKeyReqDto.getTeamKey(), OPEN, CONFIRM) - .orElseThrow(() -> new NotExistException(AGENDA_TEAM_NOT_FOUND)); - agendaTeamProfileRepository.findByAgendaAndProfileAndIsExistTrue(agenda, agendaProfile) .ifPresent(profile -> { throw new ForbiddenException(AGENDA_TEAM_FORBIDDEN); diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/utils/AgendaSlackService.java b/gg-agenda-api/src/main/java/gg/agenda/api/utils/AgendaSlackService.java new file mode 100644 index 000000000..70158dcad --- /dev/null +++ b/gg-agenda-api/src/main/java/gg/agenda/api/utils/AgendaSlackService.java @@ -0,0 +1,97 @@ +package gg.agenda.api.utils; + +import java.util.List; + +import org.springframework.stereotype.Component; + +import gg.data.agenda.Agenda; +import gg.data.agenda.AgendaAnnouncement; +import gg.data.agenda.AgendaTeam; +import gg.data.agenda.AgendaTeamProfile; +import gg.repo.agenda.AgendaTeamProfileRepository; +import gg.utils.sns.MessageSender; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class AgendaSlackService { + private final MessageSender messageSender; + private final SnsMessageUtil snsMessageUtil; + private final AgendaTeamProfileRepository agendaTeamProfileRepository; + + public void slackAddAgendaAnnouncement(Agenda agenda, AgendaAnnouncement newAnnounce) { + List agendaTeamProfiles = agendaTeamProfileRepository.findAllByAgendaAndIsExistTrue(agenda); + String message = snsMessageUtil.addAgendaAnnouncementMessage(agenda, newAnnounce); + agendaTeamProfiles.stream().map(atp -> atp.getProfile().getIntraId()) + .forEach(intraId -> messageSender.send(intraId, message)); + } + + public void slackCancelAgenda(Agenda agenda) { + List agendaTeamProfiles = agendaTeamProfileRepository.findAllByAgendaAndIsExistTrue(agenda); + String message = snsMessageUtil.cancelAgendaMessage(agenda); + agendaTeamProfiles.stream().map(atp -> atp.getProfile().getIntraId()) + .forEach(intraId -> messageSender.send(intraId, message)); + } + + public void slackFinishAgenda(Agenda agenda) { + List agendaTeamProfiles = agendaTeamProfileRepository.findAllByAgendaAndIsExistTrue(agenda); + String message = snsMessageUtil.finishAgendaMessage(agenda); + agendaTeamProfiles.stream().map(atp -> atp.getProfile().getIntraId()) + .forEach(intraId -> messageSender.send(intraId, message)); + } + + public void slackConfirmAgenda(Agenda agenda) { + List agendaTeamProfiles = agendaTeamProfileRepository.findAllByAgendaAndIsExistTrue(agenda); + String message = snsMessageUtil.confirmAgendaMessage(agenda); + agendaTeamProfiles.stream().map(atp -> atp.getProfile().getIntraId()) + .forEach(intraId -> messageSender.send(intraId, message)); + } + + public void slackConfirmAgendaTeam(Agenda agenda, AgendaTeam newTeam) { + List agendaTeamProfiles = agendaTeamProfileRepository.findByAgendaTeamAndIsExistTrue( + newTeam); + String message = snsMessageUtil.confirmTeamMessage(agenda, newTeam); + agendaTeamProfiles.stream().map(atp -> atp.getProfile().getIntraId()) + .forEach(intraId -> messageSender.send(intraId, message)); + if (agenda.getMaxTeam() == agenda.getCurrentTeam()) { + String toHostMessage = snsMessageUtil.agendaHostMinTeamSatisfiedMessage(agenda); + messageSender.send(agenda.getHostIntraId(), toHostMessage); + } else if (agenda.getMinTeam() == agenda.getCurrentTeam()) { + String toHostMessage = snsMessageUtil.agendaHostMaxTeamSatisfiedMessage(agenda); + messageSender.send(agenda.getHostIntraId(), toHostMessage); + } + } + + public void slackCancelAgendaTeam(Agenda agenda, AgendaTeam newTeam) { + List agendaTeamProfiles = agendaTeamProfileRepository.findByAgendaTeamAndIsExistTrue( + newTeam); + String message = snsMessageUtil.cancelTeamMessage(agenda, newTeam); + agendaTeamProfiles.stream().map(atp -> atp.getProfile().getIntraId()) + .forEach(intraId -> messageSender.send(intraId, message)); + } + + public void slackCancelByAgendaConfirm(Agenda agenda, List failTeam) { + List agendaTeamProfiles = agendaTeamProfileRepository.findByAgendaTeamInAndIsExistTrue( + failTeam); + String message = snsMessageUtil.failTeamMessage(agenda); + agendaTeamProfiles.stream().map(atp -> atp.getProfile().getIntraId()) + .forEach(intraId -> messageSender.send(intraId, message)); + } + + public void slackAttendTeamMate(Agenda agenda, AgendaTeam agendaTeam, String userIntraId) { + List agendaTeamProfiles = agendaTeamProfileRepository.findByAgendaTeamAndIsExistTrue( + agendaTeam); + String message = snsMessageUtil.attendTeamMateMessage(agenda, agendaTeam, userIntraId); + agendaTeamProfiles.stream().map(atp -> atp.getProfile().getIntraId()) + .filter(intraId -> !intraId.equals(userIntraId)) + .forEach(intraId -> messageSender.send(intraId, message)); + } + + public void slackLeaveTeamMate(Agenda agenda, AgendaTeam agendaTeam, String userIntraId) { + List agendaTeamProfiles = agendaTeamProfileRepository.findByAgendaTeamAndIsExistTrue( + agendaTeam); + String message = snsMessageUtil.leaveTeamMateMessage(agenda, agendaTeam, userIntraId); + agendaTeamProfiles.stream().map(atp -> atp.getProfile().getIntraId()) + .forEach(intraId -> messageSender.send(intraId, message)); + } +} diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/utils/SnsMessageUtil.java b/gg-agenda-api/src/main/java/gg/agenda/api/utils/SnsMessageUtil.java new file mode 100644 index 000000000..290355125 --- /dev/null +++ b/gg-agenda-api/src/main/java/gg/agenda/api/utils/SnsMessageUtil.java @@ -0,0 +1,91 @@ +package gg.agenda.api.utils; + +import org.springframework.stereotype.Component; + +import gg.data.agenda.Agenda; +import gg.data.agenda.AgendaAnnouncement; +import gg.data.agenda.AgendaTeam; + +@Component +public class SnsMessageUtil { + private static final String URL = "https://gg.42seoul.kr/agenda/"; + private static final String SUBJECT = "행사요정🧚으로부터 도착한 편지"; + + public String addAgendaAnnouncementMessage(Agenda agenda, AgendaAnnouncement newAnnounce) { + String link = URL + "agenda_key=" + agenda.getAgendaKey() + "/announcement/" + newAnnounce.getId(); + return SUBJECT + + "\n" + agenda.getTitle() + "의 새로운 공지사항이 도착했습니다." + + "\n" + newAnnounce.getTitle() + + "\n" + "$$" + link + "$$"; + } + + public String confirmAgendaMessage(Agenda agenda) { + String link = URL + "agenda_key=" + agenda.getAgendaKey(); + return SUBJECT + + "\n" + agenda.getTitle() + "이 확정되었습니다." + + "\n" + "행사가 확정되었습니다. 시작일자와 장소를 확인해주세요!" + + "\n" + "$$" + link + "$$"; + } + + public String cancelAgendaMessage(Agenda agenda) { + return SUBJECT + + "\n" + agenda.getTitle() + "이 취소되었습니다." + + "\n" + "아쉽게도 행사가 취소되었습니다. 다음에 다시 만나요!"; + } + + public String finishAgendaMessage(Agenda agenda) { + String link = URL + "agenda_key=" + agenda.getAgendaKey(); + if (agenda.getIsRanking()) { + return SUBJECT + + "\n" + agenda.getTitle() + "이 종료되었습니다." + + "\n" + "행사가 성공적으로 종료되었습니다. 수고하셨습니다!" + + "\n" + "결과 확인 $$" + link + "$$"; + } else { + return SUBJECT + + "\n" + agenda.getTitle() + "이 종료되었습니다." + + "\n" + "행사가 성공적으로 종료되었습니다. 수고하셨습니다!"; + } + } + + public String confirmTeamMessage(Agenda agenda, AgendaTeam agendaTeam) { + return SUBJECT + + "\n" + agenda.getTitle() + "의" + agendaTeam.getName() + "팀이 확정되었습니다." + + "\n" + "행사 확정을 기다려주세요!"; + } + + public String cancelTeamMessage(Agenda agenda, AgendaTeam agendaTeam) { + return SUBJECT + + "\n" + agenda.getTitle() + "의" + agendaTeam.getName() + "팀이 취소되었습니다."; + } + + public String failTeamMessage(Agenda agenda) { + return SUBJECT + + "\n" + agenda.getTitle() + "의 팀이 취소되었습니다." + + "\n" + "행사가 확정되어 확정되지 않은 팀은 취소됩니다."; + } + + public String attendTeamMateMessage(Agenda agenda, AgendaTeam agendaTeam, String intraId) { + return SUBJECT + + "\n" + agenda.getTitle() + "의" + agendaTeam.getName() + "팀에" + intraId + "님이 참가했습니다."; + } + + public String leaveTeamMateMessage(Agenda agenda, AgendaTeam agendaTeam, String intraId) { + return SUBJECT + + "\n" + agenda.getTitle() + "의" + agendaTeam.getName() + "팀에서" + intraId + "님이 탈퇴했습니다."; + } + + public String agendaHostMinTeamSatisfiedMessage(Agenda agenda) { + return SUBJECT + + "\n" + agenda.getTitle() + "행사가 최소 팀 개수를 충족했습니다." + + "\n" + "행사를 확정할 수 있습니다." + + "\n" + "확정시엔 다른 팀들이 참가 할 수 없으니, 주의하세요!" + + "\n" + "$$" + URL + "agenda_key=" + agenda.getAgendaKey() + "$$"; + } + + public String agendaHostMaxTeamSatisfiedMessage(Agenda agenda) { + return SUBJECT + + "\n" + agenda.getTitle() + "행사가 최대 팀 개수를 충족했습니다." + + "\n" + "행사를 확정하고 진행 시간과 장소를 공지사항으로 전달해주세요." + + "\n" + "$$" + URL + "agenda_key=" + agenda.getAgendaKey() + "$$"; + } +} diff --git a/gg-agenda-api/src/test/java/gg/agenda/api/admin/agenda/controller/AgendaAdminControllerTest.java b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agenda/controller/AgendaAdminControllerTest.java index a05f53654..d07adb842 100644 --- a/gg-agenda-api/src/test/java/gg/agenda/api/admin/agenda/controller/AgendaAdminControllerTest.java +++ b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agenda/controller/AgendaAdminControllerTest.java @@ -41,11 +41,9 @@ import gg.data.agenda.type.AgendaStatus; import gg.data.agenda.type.Location; import gg.data.user.User; -import gg.utils.AgendaTestDataUtils; import gg.utils.TestDataUtils; import gg.utils.annotation.IntegrationTest; import gg.utils.converter.MultiValueMapConverter; -import gg.utils.dto.PageRequestDto; import gg.utils.dto.PageResponseDto; import gg.utils.file.handler.AwsImageHandler; import gg.utils.fixture.agenda.AgendaFixture; diff --git a/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java index ff6857651..dd9433a51 100644 --- a/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java +++ b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java @@ -43,7 +43,6 @@ import gg.utils.AgendaTestDataUtils; import gg.utils.TestDataUtils; import gg.utils.annotation.IntegrationTest; -import gg.utils.dto.PageRequestDto; import gg.utils.dto.PageResponseDto; import gg.utils.fixture.agenda.AgendaFixture; import gg.utils.fixture.agenda.AgendaProfileFixture; @@ -341,7 +340,7 @@ void updateAgendaTeamAdminSuccessWithAddTeammate() throws Exception { AgendaTeam updatedAgendaTeam = agendaTeamAdminRepository.findByTeamKey(team.getTeamKey()) .orElseThrow(() -> new AssertionError("AgendaTeam not found")); List participants = agendaTeamProfileAdminRepository - .findAllByAgendaTeamAndIsExistIsTrue(updatedAgendaTeam); + .findAllByAgendaTeamAndIsExistIsTrue(updatedAgendaTeam); // then assertThat(updatedAgendaTeam.getName()).isEqualTo(updateDto.getTeamName()); @@ -535,4 +534,43 @@ void updateAgendaTeamAdminFailedWithInvalidIntraId() throws Exception { assertThat(result.getAwardPriority()).isEqualTo(team.getAwardPriority()); } } + + @Nested + @DisplayName("Admin AgendaTeam 취소") + class CancelAgendaTeamAdmin { + @Test + @DisplayName("Admin AgendaTeam 취소 성공") + void cancelAgendaTeamAdminSuccess() throws Exception { + // given + Agenda agenda = agendaFixture.createAgenda(); + AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda); + List profiles = agendaProfileFixture.createAgendaProfileList(5); + profiles.forEach(profile -> agendaTeamProfileFixture + .createAgendaTeamProfile(agenda, team, profile)); + + // when + mockMvc.perform(patch("/agenda/admin/team/cancel") + .header("Authorization", "Bearer " + accessToken) + .param("team_key", team.getTeamKey().toString())) + .andExpect(status().isNoContent()); + AgendaTeam result = agendaTeamAdminRepository.findByTeamKey(team.getTeamKey()) + .orElseThrow(() -> new AssertionError("AgendaTeam not found")); + + // then + assertThat(result.getStatus()).isEqualTo(AgendaTeamStatus.CANCEL); + assertThat(agendaTeamProfileAdminRepository + .findAllByAgendaTeamAndIsExistIsTrue(result).size()).isEqualTo(0); + } + + @Test + @DisplayName("Admin AgendaTeam 취소 실패 - 존재하지 않는 Team Key") + void cancelAgendaTeamAdminFailedWithInvalidTeamKey() throws Exception { + // given + // expected + mockMvc.perform(patch("/agenda/admin/team/cancel") + .header("Authorization", "Bearer " + accessToken) + .param("team_key", UUID.randomUUID().toString())) + .andExpect(status().isNotFound()); + } + } } diff --git a/gg-agenda-api/src/test/java/gg/agenda/api/user/agendaprofile/AgendaProfileControllerTest.java b/gg-agenda-api/src/test/java/gg/agenda/api/user/agendaprofile/AgendaProfileControllerTest.java index c04c000fc..a01fc39ec 100644 --- a/gg-agenda-api/src/test/java/gg/agenda/api/user/agendaprofile/AgendaProfileControllerTest.java +++ b/gg-agenda-api/src/test/java/gg/agenda/api/user/agendaprofile/AgendaProfileControllerTest.java @@ -2,6 +2,7 @@ import static gg.data.agenda.type.Location.*; import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -10,6 +11,7 @@ import java.util.ArrayList; import java.util.List; +import javax.servlet.http.HttpServletResponse; import javax.transaction.Transactional; import org.junit.jupiter.api.BeforeEach; @@ -89,7 +91,8 @@ void test() throws Exception { //given URL url = new URL("http://localhost:8080"); IntraProfile intraProfile = new IntraProfile(url, List.of()); - Mockito.when(intraProfileUtils.getIntraProfile()).thenReturn(intraProfile); + Mockito.when(intraProfileUtils.getIntraProfile(any(HttpServletResponse.class))) + .thenReturn(intraProfile); AgendaProfile agendaProfile = agendaMockData.createAgendaProfile(user, SEOUL); agendaMockData.createTicket(agendaProfile); // when @@ -146,9 +149,10 @@ void getAgendaProfileSuccess() throws Exception { //given URL url = new URL("http://localhost:8080"); IntraProfile intraProfile = new IntraProfile(url, List.of()); - Mockito.when(intraProfileUtils.getIntraProfile(user.getIntraId())).thenReturn(intraProfile); AgendaProfile agendaProfile = agendaMockData.createAgendaProfile(user, SEOUL); agendaMockData.createTicket(agendaProfile); + Mockito.when(intraProfileUtils.getIntraProfile(any(String.class), any(HttpServletResponse.class))) + .thenReturn(intraProfile); // when String response = mockMvc.perform(get("/agenda/profile/" + user.getIntraId()) .header("Authorization", "Bearer " + accessToken)) @@ -171,7 +175,8 @@ void getAgendaProfileFailedWithInvalidIntraId() throws Exception { //given URL url = new URL("http://localhost:8080"); IntraProfile intraProfile = new IntraProfile(url, List.of()); - Mockito.when(intraProfileUtils.getIntraProfile()).thenReturn(intraProfile); + HttpServletResponse res = Mockito.mock(HttpServletResponse.class); + Mockito.when(intraProfileUtils.getIntraProfile(res)).thenReturn(intraProfile); AgendaProfile agendaProfile = agendaMockData.createAgendaProfile(user, SEOUL); agendaMockData.createTicket(agendaProfile); diff --git a/gg-agenda-api/src/test/java/gg/agenda/api/user/agendateam/AgendaTeamControllerTest.java b/gg-agenda-api/src/test/java/gg/agenda/api/user/agendateam/AgendaTeamControllerTest.java index 8f972d817..eaeec8f1e 100644 --- a/gg-agenda-api/src/test/java/gg/agenda/api/user/agendateam/AgendaTeamControllerTest.java +++ b/gg-agenda-api/src/test/java/gg/agenda/api/user/agendateam/AgendaTeamControllerTest.java @@ -1475,7 +1475,7 @@ public void notValidTeamStatus() throws Exception { .param("agenda_key", agenda.getAgendaKey().toString()) .param("teamKey", team.getTeamKey().toString()) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isNotFound()); + .andExpect(status().isBadRequest()); } @Test diff --git a/gg-auth/src/main/java/gg/auth/FortyTwoAuthUtil.java b/gg-auth/src/main/java/gg/auth/FortyTwoAuthUtil.java index e0f851f4d..b83615326 100644 --- a/gg-auth/src/main/java/gg/auth/FortyTwoAuthUtil.java +++ b/gg-auth/src/main/java/gg/auth/FortyTwoAuthUtil.java @@ -25,6 +25,7 @@ import gg.utils.exception.ErrorCode; import gg.utils.exception.custom.NotExistException; +import gg.utils.exception.user.TokenNotValidException; import gg.utils.external.ApiUtil; import lombok.RequiredArgsConstructor; @@ -37,6 +38,9 @@ public class FortyTwoAuthUtil { public String getAccessToken() { Authentication authentication = getAuthenticationFromContext(); OAuth2AuthorizedClient client = getClientFromAuthentication(authentication); + if (Objects.isNull(client)) { + throw new TokenNotValidException(); + } return client.getAccessToken().getTokenValue(); } diff --git a/gg-data/src/main/java/gg/data/agenda/AgendaTeam.java b/gg-data/src/main/java/gg/data/agenda/AgendaTeam.java index 5cc557360..c740ed875 100644 --- a/gg-data/src/main/java/gg/data/agenda/AgendaTeam.java +++ b/gg-data/src/main/java/gg/data/agenda/AgendaTeam.java @@ -114,6 +114,11 @@ public void cancelTeam(AgendaTeamStatus status) { this.mateCount = 0; } + public void adminCancelTeam() { + this.status = CANCEL; + this.mateCount = 0; + } + public void leaveTeamMate() { this.mateCount--; } diff --git a/gg-repo/src/main/java/gg/repo/agenda/AgendaTeamProfileRepository.java b/gg-repo/src/main/java/gg/repo/agenda/AgendaTeamProfileRepository.java index b41f2f702..f24a1555e 100644 --- a/gg-repo/src/main/java/gg/repo/agenda/AgendaTeamProfileRepository.java +++ b/gg-repo/src/main/java/gg/repo/agenda/AgendaTeamProfileRepository.java @@ -47,4 +47,9 @@ public interface AgendaTeamProfileRepository extends JpaRepository findByProfileAndIsExistTrueAndAgendaStatus( @Param("agendaProfile") AgendaProfile agendaProfile, @Param("status") AgendaStatus status, Pageable pageable); + + List findAllByAgendaAndIsExistTrue(Agenda agenda); + + @Query("SELECT atp FROM AgendaTeamProfile atp WHERE atp.agendaTeam IN :agendaTeams AND atp.isExist = true") + List findByAgendaTeamInAndIsExistTrue(List agendaTeams); } diff --git a/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java b/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java index 0d3f14e08..b3c68558c 100644 --- a/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java +++ b/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java @@ -193,46 +193,45 @@ public enum ErrorCode { INVALID_CHECKLIST(400, "RE001", "잘못된 요청 데이터입니다."), // agenda - AUTH_NOT_FOUND(404, "AG", "42 정보가 만료되었습니다."), - - AGENDA_NOT_FOUND(404, "AG", "해당 일정이 존재하지 않습니다."), - AGENDA_CREATE_FAILED(500, "AG", "일정 생성에 실패했습니다."), - AGENDA_UPDATE_FAILED(500, "AG", "일정 수정에 실패했습니다."), - AGENDA_NOT_OPEN(400, "AG", "마감된 일정에는 팀을 생성할 수 없습니다."), - AGENDA_TEAM_ALREADY_CONFIRM(400, "AG", "이미 확정된 팀입니다."), - AGENDA_TEAM_ALREADY_CANCEL(400, "AG", "이미 취소된 팀입니다."), - NOT_ENOUGH_TEAM_MEMBER(400, "AG", "팀원이 부족합니다."), - AGENDA_ANNOUNCEMENT_NOT_FOUND(404, "AG", "공지사항이 존재하지 않습니다."), - AGENDA_TEAM_FULL(400, "AG", "팀이 꽉 찼습니다."), - AGENDA_NO_CAPACITY(403, "AG", "해당 일정에 참여할 수 있는 팀이 꽉 찼습니다."), - AGENDA_POSTER_SIZE_TOO_LARGE(400, "AG", "포스터 사이즈가 너무 큽니다."), - AGENDA_INVALID_SCHEDULE(400, "AG", "유효하지 않은 일정입니다."), - AGENDA_INVALID_PARAM(400, "AG", "유효하지 않은 파라미터입니다."), - UPDATE_LOCATION_NOT_VALID(400, "AG", "지역을 변경할 수 없습니다."), - AGENDA_CAPACITY_CONFLICT(409, "AG", "팀 제한을 변경할 수 없습니다."), - AGENDA_TEAM_CAPACITY_CONFLICT(409, "AG", "팀 인원 제한을 변경할 수 없습니다."), - HOST_FORBIDDEN(403, "AG", "개최자는 팀을 생성할 수 없습니다."), - TEAM_LEADER_FORBIDDEN(403, "AG", "팀장만 팀을 확정할 수 있습니다."), - CONFIRM_FORBIDDEN(403, "AG", "개최자만 일정을 종료할 수 있습니다."), - AGENDA_MODIFICATION_FORBIDDEN(403, "AG", "개최자만 일정을 수정할 수 있습니다."), - LOCATION_NOT_VALID(400, "AG", "유효하지 않은 지역입니다."), - AGENDA_TEAM_FORBIDDEN(403, "AG", "일정에 참여한 팀이 있습니다."), - NOT_TEAM_MATE(403, "AG", "팀원이 아닙니다."), - TEAM_NAME_EXIST(409, "AG", "이미 존재하는 팀 이름입니다."), - TICKET_NOT_EXIST(403, "AG", "보유한 티켓이 부족합니다."), - TICKET_NOT_FOUND(404, "AG", "해당 티켓이 존재하지 않습니다."), - AGENDA_TEAM_NOT_FOUND(404, "AG", "팀이 존재하지 않습니다."), - AGENDA_PROFILE_NOT_FOUND(404, "AG", "프로필이 존재하지 않습니다."), - ALREADY_TICKET_SETUP(409, "AG", "이미 티켓 신청이 되어있습니다."), - NOT_SETUP_TICKET(404, "AG", "티켓 신청이 되어있지 않습니다."), - POINT_HISTORY_NOT_FOUND(404, "AG", "기부 내역이 존재하지 않습니다."), - TICKET_FORBIDDEN(403, "AG", "티켓 신청은 1분의 대기시간이 있습니다."), - AGENDA_ALREADY_FINISHED(409, "AG", "이미 종료된 일정입니다."), - AGENDA_ALREADY_CONFIRMED(409, "AG", "이미 확정된 일정입니다."), - AGENDA_ALREADY_CANCELED(409, "AG", "이미 취소된 일정입니다."), - AGENDA_DOES_NOT_CONFIRM(409, "AG", "확정되지 않은 일정입니다."), - AGENDA_AWARD_EMPTY(400, "AG", "시상 정보가 없습니다."), - AGENDA_AWARD_PRIORITY_DUPLICATE(400, "AG", "시상 우선순위가 중복됩니다."); + AGENDA_TEAM_FULL(400, "AG101", "팀이 꽉 찼습니다."), + LOCATION_NOT_VALID(400, "AG102", "유효하지 않은 지역입니다."), + AGENDA_AWARD_EMPTY(400, "AG103", "시상 정보가 없습니다."), + AGENDA_INVALID_PARAM(400, "AG104", "유효하지 않은 파라미터입니다."), + AGENDA_NOT_OPEN(400, "AG105", "마감된 일정에는 팀을 생성할 수 없습니다."), + AGENDA_CREATE_FAILED(400, "AG106", "일정 생성에 실패했습니다."), + AGENDA_UPDATE_FAILED(400, "AG107", "일정 수정에 실패했습니다."), + AGENDA_INVALID_SCHEDULE(400, "AG108", "유효하지 않은 일정입니다."), + NOT_ENOUGH_TEAM_MEMBER(400, "AG109", "팀원이 부족합니다."), + UPDATE_LOCATION_NOT_VALID(400, "AG110", "지역을 변경할 수 없습니다."), + AGENDA_TEAM_ALREADY_CANCEL(400, "AG111", "이미 취소된 팀입니다."), + AGENDA_TEAM_ALREADY_CONFIRM(400, "AG112", "이미 확정된 팀입니다."), + AGENDA_POSTER_SIZE_TOO_LARGE(400, "AG113", "포스터 사이즈가 너무 큽니다."), + AGENDA_AWARD_PRIORITY_DUPLICATE(400, "AG114", "시상 우선순위가 중복됩니다."), + AGENDA_NO_CAPACITY(403, "AG201", "해당 일정에 참여할 수 있는 팀이 꽉 찼습니다."), + HOST_FORBIDDEN(403, "AG202", "개최자는 팀을 생성할 수 없습니다."), + TICKET_NOT_EXIST(403, "AG203", "보유한 티켓이 부족합니다."), + NOT_TEAM_MATE(403, "AG204", "팀원이 아닙니다."), + CONFIRM_FORBIDDEN(403, "AG205", "개최자만 일정을 종료할 수 있습니다."), + TICKET_FORBIDDEN(403, "AG206", "티켓 신청은 1분의 대기시간이 있습니다."), + TEAM_LEADER_FORBIDDEN(403, "AG207", "팀장만 팀을 확정할 수 있습니다."), + AGENDA_TEAM_FORBIDDEN(403, "AG208", "일정에 참여한 팀이 있습니다."), + AGENDA_MODIFICATION_FORBIDDEN(403, "AG209", "개최자만 일정을 수정할 수 있습니다."), + AUTH_NOT_FOUND(404, "AG301", "42 정보가 만료되었습니다."), + TICKET_NOT_FOUND(404, "AG302", "해당 티켓이 존재하지 않습니다."), + AGENDA_NOT_FOUND(404, "AG303", "해당 일정이 존재하지 않습니다."), + NOT_SETUP_TICKET(404, "AG304", "티켓 신청이 되어있지 않습니다."), + AGENDA_TEAM_NOT_FOUND(404, "AG305", "팀이 존재하지 않습니다."), + AGENDA_PROFILE_NOT_FOUND(404, "AG306", "프로필이 존재하지 않습니다."), + POINT_HISTORY_NOT_FOUND(404, "AG307", "기부 내역이 존재하지 않습니다."), + AGENDA_ANNOUNCEMENT_NOT_FOUND(404, "AG308", "공지사항이 존재하지 않습니다."), + TEAM_NAME_EXIST(409, "AG401", "이미 존재하는 팀 이름입니다."), + ALREADY_TICKET_SETUP(409, "AG402", "이미 티켓 신청이 되어있습니다."), + AGENDA_DOES_NOT_CONFIRM(409, "AG403", "확정되지 않은 일정입니다."), + AGENDA_ALREADY_FINISHED(409, "AG404", "이미 종료된 일정입니다."), + AGENDA_ALREADY_CANCELED(409, "AG405", "이미 취소된 일정입니다."), + AGENDA_ALREADY_CONFIRMED(409, "AG406", "이미 확정된 일정입니다."), + AGENDA_CAPACITY_CONFLICT(409, "AG407", "팀 제한을 변경할 수 없습니다."), + AGENDA_TEAM_CAPACITY_CONFLICT(409, "AG408", "팀 인원 제한을 변경할 수 없습니다."); private final int status; private final String errCode;