diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/config/security/SecurityConfig.java b/DuDoong-Api/src/main/java/band/gosrock/api/config/security/SecurityConfig.java index 4f58d2ec..08efba07 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/config/security/SecurityConfig.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/config/security/SecurityConfig.java @@ -39,6 +39,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .permitAll() .mvcMatchers(HttpMethod.GET, "/v1/events/{eventId:[0-9]*$}/comments/**") .permitAll() + .mvcMatchers(HttpMethod.GET, "/v1/events/search") + .permitAll() .mvcMatchers(HttpMethod.POST, "/v1/coupons/campaigns") .hasRole("SUPER_ADMIN") .anyRequest() diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/event/controller/EventController.java b/DuDoong-Api/src/main/java/band/gosrock/api/event/controller/EventController.java index 2f18fd59..89f77743 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/event/controller/EventController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/event/controller/EventController.java @@ -30,7 +30,6 @@ public class EventController { private final ReadUserEventProfilesUseCase readUserHostEventListUseCase; - private final ReadOpenEventsUseCase readOpenEventsUseCase; private final ReadEventDetailUseCase readEventDetailUseCase; private final ReadEventChecklistUseCase readEventChecklistUseCase; private final SearchEventsUseCase searchEventsUseCase; @@ -48,17 +47,11 @@ public SliceResponse getAllEventByUser( return readUserHostEventListUseCase.execute(pageable); } - @Operation(summary = "오픈된 이벤트 리스트를 최신순으로 가져옵니다.") - @GetMapping("/list") - public SliceResponse getAllOpenEventByUser( - @ParameterObject @PageableDefault(size = 10) Pageable pageable) { - return readOpenEventsUseCase.execute(pageable); - } - @Operation(summary = "이벤트 이름을 키워드로 검색하여 최신순으로 가져옵니다.") + @DisableSwaggerSecurity @GetMapping("/search") public SliceResponse getAllOpenEventByUser( - @RequestParam String keyword, + @RequestParam(required = false) String keyword, @ParameterObject @PageableDefault(size = 10) Pageable pageable) { return searchEventsUseCase.execute(keyword, pageable); } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/event/service/ReadOpenEventsUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/event/service/ReadOpenEventsUseCase.java deleted file mode 100644 index 330cd938..00000000 --- a/DuDoong-Api/src/main/java/band/gosrock/api/event/service/ReadOpenEventsUseCase.java +++ /dev/null @@ -1,25 +0,0 @@ -package band.gosrock.api.event.service; - -import static band.gosrock.domain.domains.event.domain.EventStatus.OPEN; - -import band.gosrock.api.common.UserUtils; -import band.gosrock.api.common.slice.SliceResponse; -import band.gosrock.api.event.model.dto.response.EventResponse; -import band.gosrock.api.event.model.mapper.EventMapper; -import band.gosrock.common.annotation.UseCase; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Pageable; -import org.springframework.transaction.annotation.Transactional; - -/** 해당 호스트 유저가 관리중인 이벤트 리스트를 불러오는 유즈케이스 */ -@UseCase -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class ReadOpenEventsUseCase { - private final UserUtils userUtils; - private final EventMapper eventMapper; - - public SliceResponse execute(Pageable pageable) { - return SliceResponse.of(eventMapper.toEventResponseSliceByStatus(OPEN, pageable)); - } -} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/host/model/dto/response/HostDetailResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/host/model/dto/response/HostDetailResponse.java index 94f0ae17..c3d8b08b 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/host/model/dto/response/HostDetailResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/host/model/dto/response/HostDetailResponse.java @@ -6,8 +6,8 @@ import band.gosrock.domain.domains.host.domain.Host; import com.fasterxml.jackson.annotation.JsonUnwrapped; import io.swagger.v3.oas.annotations.media.Schema; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; import lombok.Builder; import lombok.Getter; @@ -22,7 +22,7 @@ public class HostDetailResponse { private final HostUserVo masterUser; @Schema(description = "호스트 유저 정보") - private final Set hostUsers; + private final List hostUsers; @Schema(description = "슬랙 알람 url") private final String slackUrl; @@ -30,11 +30,9 @@ public class HostDetailResponse { @Schema(description = "파트너쉽 여부") private final boolean partner; - // todo:: 이벤트 정보도 묶어서 내보내기 - - public static HostDetailResponse of(Host host, Set hostUserVoSet) { + public static HostDetailResponse of(Host host, List hostUserVoSet) { HostDetailResponseBuilder builder = HostDetailResponse.builder(); - Set hostUserVoList = new HashSet<>(); + List hostUserVoList = new ArrayList<>(); hostUserVoSet.forEach( hostUserVo -> { if (hostUserVo.getUserInfoVo().getUserId().equals(host.getMasterUserId())) { diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/host/model/mapper/HostMapper.java b/DuDoong-Api/src/main/java/band/gosrock/api/host/model/mapper/HostMapper.java index 59b66839..8ffcbaaa 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/host/model/mapper/HostMapper.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/host/model/mapper/HostMapper.java @@ -16,8 +16,7 @@ import band.gosrock.domain.domains.host.exception.AlreadyJoinedHostException; import band.gosrock.domain.domains.user.adaptor.UserAdaptor; import band.gosrock.domain.domains.user.domain.User; -import java.util.HashSet; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; @@ -85,22 +84,22 @@ public HostDetailResponse toHostDetailResponse(Host host) { } private HostDetailResponse toHostDetailResponseExecute(Host host) { - Set userIdList = new HashSet<>(); - host.getHostUsers().forEach(hostUser -> userIdList.add(hostUser.getUserId())); - final Set userInfoVoSet = - userAdaptor.queryUserListByIdIn(userIdList).stream() - .map(User::toUserInfoVo) - .collect(Collectors.toSet()); + final List userIds = host.getHostUser_UserIds(); + final List userList = userAdaptor.queryUserListByIdIn(userIds); + final Map userMap = + userList.stream().collect(Collectors.toMap(User::getId, user -> user)); + final List hostUserVoList = new ArrayList<>(); - final Set hostUserVoSet = - userInfoVoSet.stream() - .map( - userInfoVo -> - HostUserVo.from( - userInfoVo, - host.getHostUserByUserId(userInfoVo.getUserId()))) - .collect(Collectors.toSet()); + for (Long userId : userIds) { + final User user = userMap.get(userId); + if (user != null) { + final UserInfoVo userInfoVo = user.toUserInfoVo(); + final HostUser hostUser = host.getHostUserByUserId(userId); + final HostUserVo hostUserVo = HostUserVo.from(userInfoVo, hostUser); + hostUserVoList.add(hostUserVo); + } + } - return HostDetailResponse.of(host, hostUserVoSet); + return HostDetailResponse.of(host, hostUserVoList); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/host/service/ReadHostUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/host/service/ReadHostUseCase.java index e72e4aa2..66393eeb 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/host/service/ReadHostUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/host/service/ReadHostUseCase.java @@ -1,25 +1,19 @@ package band.gosrock.api.host.service; -import band.gosrock.api.common.UserUtils; import band.gosrock.api.host.model.dto.response.HostDetailResponse; import band.gosrock.api.host.model.mapper.HostMapper; import band.gosrock.common.annotation.UseCase; -import band.gosrock.domain.domains.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; @UseCase @RequiredArgsConstructor public class ReadHostUseCase { - private final UserUtils userUtils; private final HostMapper hostMapper; @Transactional(readOnly = true) public HostDetailResponse execute(Long hostId) { - final User user = userUtils.getCurrentUser(); - final Long userId = user.getId(); - return hostMapper.toHostDetailResponse(hostId); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/DudoongTicketCancelOrderEventHandler.java b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/DudoongTicketCancelOrderEventHandler.java new file mode 100644 index 00000000..393edc99 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/DudoongTicketCancelOrderEventHandler.java @@ -0,0 +1,46 @@ +package band.gosrock.api.slack.handler.order; + + +import band.gosrock.domain.common.alarm.HostSlackAlarm; +import band.gosrock.domain.common.events.order.WithDrawOrderEvent; +import band.gosrock.domain.domains.event.adaptor.EventAdaptor; +import band.gosrock.domain.domains.event.domain.Event; +import band.gosrock.domain.domains.host.adaptor.HostAdaptor; +import band.gosrock.domain.domains.host.domain.Host; +import band.gosrock.domain.domains.order.adaptor.OrderAdaptor; +import band.gosrock.domain.domains.order.domain.Order; +import band.gosrock.infrastructure.config.slack.SlackMessageProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +@Slf4j +public class DudoongTicketCancelOrderEventHandler { + private final EventAdaptor eventAdaptor; + + private final HostAdaptor hostAdaptor; + private final OrderAdaptor orderAdaptor; + private final SlackMessageProvider slackMessageProvider; + + @Async + @TransactionalEventListener( + classes = WithDrawOrderEvent.class, + phase = TransactionPhase.AFTER_COMMIT) + @Transactional(readOnly = true) + public void handle(WithDrawOrderEvent withDrawOrderEvent) { + log.info("두둥 티켓 취소 전송되는 알림"); + if (!withDrawOrderEvent.getIsDudoongTicketOrder()) return; + if (withDrawOrderEvent.getIsRefund()) return; + Order order = orderAdaptor.findByOrderUuid(withDrawOrderEvent.getOrderUuid()); + Event event = eventAdaptor.findById(order.getEventId()); + Host host = hostAdaptor.findById(event.getHostId()); + String message = HostSlackAlarm.dudoongOrderCancel(event, order); + slackMessageProvider.sendMessage(host.getSlackUrl(), message); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/DudoongTicketRefundOrderEventHandler.java b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/DudoongTicketRefundOrderEventHandler.java new file mode 100644 index 00000000..cd8a7f20 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/DudoongTicketRefundOrderEventHandler.java @@ -0,0 +1,46 @@ +package band.gosrock.api.slack.handler.order; + + +import band.gosrock.domain.common.alarm.HostSlackAlarm; +import band.gosrock.domain.common.events.order.WithDrawOrderEvent; +import band.gosrock.domain.domains.event.adaptor.EventAdaptor; +import band.gosrock.domain.domains.event.domain.Event; +import band.gosrock.domain.domains.host.adaptor.HostAdaptor; +import band.gosrock.domain.domains.host.domain.Host; +import band.gosrock.domain.domains.order.adaptor.OrderAdaptor; +import band.gosrock.domain.domains.order.domain.Order; +import band.gosrock.infrastructure.config.slack.SlackMessageProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +@Slf4j +public class DudoongTicketRefundOrderEventHandler { + private final EventAdaptor eventAdaptor; + + private final HostAdaptor hostAdaptor; + private final OrderAdaptor orderAdaptor; + private final SlackMessageProvider slackMessageProvider; + + @Async + @TransactionalEventListener( + classes = WithDrawOrderEvent.class, + phase = TransactionPhase.AFTER_COMMIT) + @Transactional(readOnly = true) + public void handle(WithDrawOrderEvent withDrawOrderEvent) { + log.info("두둥 티켓 환불시 전송되는 알림"); + if (!withDrawOrderEvent.getIsDudoongTicketOrder()) return; + if (!withDrawOrderEvent.getIsRefund()) return; + Order order = orderAdaptor.findByOrderUuid(withDrawOrderEvent.getOrderUuid()); + Event event = eventAdaptor.findById(order.getEventId()); + Host host = hostAdaptor.findById(event.getHostId()); + String message = HostSlackAlarm.dudoongOrderRefund(event, order); + slackMessageProvider.sendMessage(host.getSlackUrl(), message); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/NewApproveOrderAlarmEventHandler.java b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/NewApproveOrderAlarmEventHandler.java new file mode 100644 index 00000000..e149402b --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/NewApproveOrderAlarmEventHandler.java @@ -0,0 +1,46 @@ +package band.gosrock.api.slack.handler.order; + + +import band.gosrock.domain.common.alarm.HostSlackAlarm; +import band.gosrock.domain.common.events.order.CreateOrderEvent; +import band.gosrock.domain.domains.event.adaptor.EventAdaptor; +import band.gosrock.domain.domains.event.domain.Event; +import band.gosrock.domain.domains.host.adaptor.HostAdaptor; +import band.gosrock.domain.domains.host.domain.Host; +import band.gosrock.domain.domains.order.adaptor.OrderAdaptor; +import band.gosrock.domain.domains.order.domain.Order; +import band.gosrock.infrastructure.config.slack.SlackMessageProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +@Slf4j +public class NewApproveOrderAlarmEventHandler { + private final EventAdaptor eventAdaptor; + + private final HostAdaptor hostAdaptor; + private final OrderAdaptor orderAdaptor; + private final SlackMessageProvider slackMessageProvider; + + @Async + @TransactionalEventListener( + classes = CreateOrderEvent.class, + phase = TransactionPhase.AFTER_COMMIT) + @Transactional(readOnly = true) + public void handle(CreateOrderEvent createOrderEvent) { + // 승인 방식의 결제만 알림 발송 대상. + if (createOrderEvent.getOrderMethod().isPayment()) return; + log.info("승인 방식 요청 알림 전송"); + Order order = orderAdaptor.findByOrderUuid(createOrderEvent.getOrderUuid()); + Event event = eventAdaptor.findById(order.getEventId()); + Host host = hostAdaptor.findById(event.getHostId()); + String message = HostSlackAlarm.newApproveOrder(event, order); + slackMessageProvider.sendMessage(host.getSlackUrl(), message); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/NewConfirmOrderAlarmEventHandler.java b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/NewConfirmOrderAlarmEventHandler.java new file mode 100644 index 00000000..b1a12e41 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/NewConfirmOrderAlarmEventHandler.java @@ -0,0 +1,46 @@ +package band.gosrock.api.slack.handler.order; + + +import band.gosrock.domain.common.alarm.HostSlackAlarm; +import band.gosrock.domain.common.events.order.DoneOrderEvent; +import band.gosrock.domain.domains.event.adaptor.EventAdaptor; +import band.gosrock.domain.domains.event.domain.Event; +import band.gosrock.domain.domains.host.adaptor.HostAdaptor; +import band.gosrock.domain.domains.host.domain.Host; +import band.gosrock.domain.domains.order.adaptor.OrderAdaptor; +import band.gosrock.domain.domains.order.domain.Order; +import band.gosrock.infrastructure.config.slack.SlackMessageProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +@Slf4j +public class NewConfirmOrderAlarmEventHandler { + private final EventAdaptor eventAdaptor; + + private final HostAdaptor hostAdaptor; + private final OrderAdaptor orderAdaptor; + private final SlackMessageProvider slackMessageProvider; + + @Async + @TransactionalEventListener( + classes = DoneOrderEvent.class, + phase = TransactionPhase.AFTER_COMMIT) + @Transactional(readOnly = true) + public void handle(DoneOrderEvent doneOrderEvent) { + // 선착순 방식의 결제만 알림 발송 대상. + if (!doneOrderEvent.getOrderMethod().isPayment()) return; + log.info("선착순 방식의 결제만 알림 발송 대상 알림 전송"); + Order order = orderAdaptor.findByOrderUuid(doneOrderEvent.getOrderUuid()); + Event event = eventAdaptor.findById(order.getEventId()); + Host host = hostAdaptor.findById(event.getHostId()); + String message = HostSlackAlarm.newConfirmOrder(event, order); + slackMessageProvider.sendMessage(host.getSlackUrl(), message); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/OrderApprovedAlarmEventHandler.java b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/OrderApprovedAlarmEventHandler.java new file mode 100644 index 00000000..4a51cce2 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/OrderApprovedAlarmEventHandler.java @@ -0,0 +1,45 @@ +package band.gosrock.api.slack.handler.order; + + +import band.gosrock.domain.common.alarm.HostSlackAlarm; +import band.gosrock.domain.common.events.order.DoneOrderEvent; +import band.gosrock.domain.domains.event.adaptor.EventAdaptor; +import band.gosrock.domain.domains.event.domain.Event; +import band.gosrock.domain.domains.host.adaptor.HostAdaptor; +import band.gosrock.domain.domains.host.domain.Host; +import band.gosrock.domain.domains.order.adaptor.OrderAdaptor; +import band.gosrock.domain.domains.order.domain.Order; +import band.gosrock.infrastructure.config.slack.SlackMessageProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +@Slf4j +public class OrderApprovedAlarmEventHandler { + private final EventAdaptor eventAdaptor; + + private final HostAdaptor hostAdaptor; + private final OrderAdaptor orderAdaptor; + private final SlackMessageProvider slackMessageProvider; + + @Async + @TransactionalEventListener( + classes = DoneOrderEvent.class, + phase = TransactionPhase.AFTER_COMMIT) + @Transactional(readOnly = true) + public void handle(DoneOrderEvent doneOrderEvent) { + if (doneOrderEvent.getOrderMethod().isPayment()) return; + log.info("승인 방식 완료 시에 알림 전송"); + Order order = orderAdaptor.findByOrderUuid(doneOrderEvent.getOrderUuid()); + Event event = eventAdaptor.findById(order.getEventId()); + Host host = hostAdaptor.findById(event.getHostId()); + String message = HostSlackAlarm.approvedOrder(event, order); + slackMessageProvider.sendMessage(host.getSlackUrl(), message); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/WithDrawOrderEventHandler.java b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/WithDrawOrderEventHandler.java new file mode 100644 index 00000000..18fe891c --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/slack/handler/order/WithDrawOrderEventHandler.java @@ -0,0 +1,46 @@ +package band.gosrock.api.slack.handler.order; + + +import band.gosrock.domain.common.alarm.HostSlackAlarm; +import band.gosrock.domain.common.events.order.WithDrawOrderEvent; +import band.gosrock.domain.domains.event.adaptor.EventAdaptor; +import band.gosrock.domain.domains.event.domain.Event; +import band.gosrock.domain.domains.host.adaptor.HostAdaptor; +import band.gosrock.domain.domains.host.domain.Host; +import band.gosrock.domain.domains.order.adaptor.OrderAdaptor; +import band.gosrock.domain.domains.order.domain.Order; +import band.gosrock.infrastructure.config.slack.SlackMessageProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +@Slf4j +public class WithDrawOrderEventHandler { + private final EventAdaptor eventAdaptor; + + private final HostAdaptor hostAdaptor; + private final OrderAdaptor orderAdaptor; + private final SlackMessageProvider slackMessageProvider; + + @Async + @TransactionalEventListener( + classes = WithDrawOrderEvent.class, + phase = TransactionPhase.AFTER_COMMIT) + @Transactional(readOnly = true) + public void handle(WithDrawOrderEvent withDrawOrderEvent) { + log.info("선착순 유료,무료 승인 무료 시에 전송되는 알람"); + if (withDrawOrderEvent.getIsDudoongTicketOrder()) return; + + Order order = orderAdaptor.findByOrderUuid(withDrawOrderEvent.getOrderUuid()); + Event event = eventAdaptor.findById(order.getEventId()); + Host host = hostAdaptor.findById(event.getHostId()); + String message = HostSlackAlarm.withDrawOrder(event, order); + slackMessageProvider.sendMessage(host.getSlackUrl(), message); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/alarm/HostSlackAlarm.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/alarm/HostSlackAlarm.java index 1905c059..24f9663b 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/alarm/HostSlackAlarm.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/alarm/HostSlackAlarm.java @@ -1,7 +1,9 @@ package band.gosrock.domain.common.alarm; +import band.gosrock.domain.domains.event.domain.Event; import band.gosrock.domain.domains.host.domain.Host; +import band.gosrock.domain.domains.order.domain.Order; import band.gosrock.domain.domains.user.domain.User; import lombok.AllArgsConstructor; import lombok.Getter; @@ -26,6 +28,60 @@ public static String disabledOf(User user) { return nameOf(user) + "님이 호스트에서 추방당했습니다."; } + private static String getEventOrderTitle(Event event) { + return event.getEventBasic().getName() + " 이벤트 주문관련 알림\n"; + } + + public static String newConfirmOrder(Event event, Order order) { + return getEventOrderTitle(event) + + getOrderNo(order) + + " 주문이 결제되었습니다.\n" + + getOrderNameAndAmount(order); + } + + public static String newApproveOrder(Event event, Order order) { + return getEventOrderTitle(event) + + getOrderNo(order) + + " 주문 승인이 요청 되었습니다.\n" + + getOrderNameAndAmount(order); + } + + public static String approvedOrder(Event event, Order order) { + return getEventOrderTitle(event) + + getOrderNo(order) + + " 주문이 승인 되었습니다.\n" + + getOrderNameAndAmount(order); + } + + public static String withDrawOrder(Event event, Order order) { + return getEventOrderTitle(event) + + getOrderNo(order) + + " 주문이 철회 되었습니다.\n" + + getOrderNameAndAmount(order); + } + + public static String dudoongOrderRefund(Event event, Order order) { + return getEventOrderTitle(event) + + getOrderNo(order) + + " 두둥티켓 주문이 구매자에의해 환불 처리 되었습니다. 구매자에게 연락해서 환불을 진행해 주세요.\n" + + getOrderNameAndAmount(order); + } + + public static String dudoongOrderCancel(Event event, Order order) { + return getEventOrderTitle(event) + + getOrderNo(order) + + " 두둥티켓 주문이 관리자에의해 환불 처리 되었습니다. 구매자에게 연락해서 환불을 진행해 주세요.\n" + + getOrderNameAndAmount(order); + } + + private static String getOrderNo(Order order) { + return "주문번호 : " + order.getOrderNo(); + } + + private static String getOrderNameAndAmount(Order order) { + return "주문이름 :" + order.getOrderName() + " | 주문 금액 : " + order.getTotalPaymentPrice(); + } + private static String nameOf(Host host) { return "'" + host.getProfile().getName() + "'"; } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/WithDrawOrderEvent.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/WithDrawOrderEvent.java index 996389ef..fbb6c588 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/WithDrawOrderEvent.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/WithDrawOrderEvent.java @@ -20,6 +20,9 @@ public class WithDrawOrderEvent extends DomainEvent { private final OrderMethod orderMethod; private final OrderStatus orderStatus; + private final Boolean isDudoongTicketOrder; + private final Boolean isRefund; + @Nullable private final String paymentKey; private final Long itemId; @@ -36,6 +39,8 @@ public static WithDrawOrderEvent from(Order order) { .itemId(order.getItemId()) .isUsingCoupon(order.hasCoupon()) .issuedCouponId(order.getOrderCouponVo().getCouponId()) + .isDudoongTicketOrder(order.isDudoongTicketOrder()) + .isRefund(order.getOrderStatus() == OrderStatus.REFUND) .build(); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/repository/EventCustomRepositoryImpl.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/repository/EventCustomRepositoryImpl.java index 9368ffb1..2fb183a0 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/repository/EventCustomRepositoryImpl.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/repository/EventCustomRepositoryImpl.java @@ -49,7 +49,7 @@ public Slice querySliceEventsByKeyword(String keyword, Pageable pageable) List events = queryFactory .selectFrom(event) - .where(nameContains(keyword).and(eqStatusOpen())) + .where(eqStatusOpen().and(nameContains(keyword))) .orderBy(event.id.desc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize() + 1) @@ -66,6 +66,6 @@ private BooleanExpression eqStatusOpen() { } private BooleanExpression nameContains(String keyword) { - return event.eventBasic.name.containsIgnoreCase(keyword); + return keyword == null ? null : event.eventBasic.name.containsIgnoreCase(keyword); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/host/domain/Host.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/host/domain/Host.java index 74c441cd..8230a0d4 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/host/domain/Host.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/host/domain/Host.java @@ -11,7 +11,9 @@ import band.gosrock.domain.common.vo.HostProfileVo; import band.gosrock.domain.domains.host.exception.*; import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import javax.persistence.*; import lombok.AccessLevel; import lombok.Builder; @@ -42,6 +44,7 @@ public class Host extends BaseTimeEntity { // 단방향 oneToMany 매핑 @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @OrderBy("createdAt DESC") private final Set hostUsers = new HashSet<>(); public void addHostUsers(Set hostUserList) { @@ -70,6 +73,10 @@ public HostUser getHostUserByUserId(Long userId) { .orElseThrow(() -> HostUserNotFoundException.EXCEPTION); } + public List getHostUser_UserIds() { + return this.hostUsers.stream().map(HostUser::getUserId).collect(Collectors.toList()); + } + public void updateProfile(HostProfile hostProfile) { this.profile.updateProfile(hostProfile); } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java index 83422599..5180bae0 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java @@ -332,6 +332,11 @@ public Boolean isPaid() { return isNeedPaid(); } + public Boolean isDudoongTicketOrder() { + return getTotalPaymentPrice().isGreaterThan(Money.ZERO) + && orderMethod == OrderMethod.APPROVAL; + } + public List getDistinctItemIds() { return this.orderLineItems.stream().map(OrderLineItem::getItemId).distinct().toList(); } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/adaptor/UserAdaptor.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/adaptor/UserAdaptor.java index bc09d346..6ba53984 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/adaptor/UserAdaptor.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/adaptor/UserAdaptor.java @@ -9,7 +9,6 @@ import band.gosrock.domain.domains.user.repository.UserRepository; import java.time.LocalDateTime; import java.util.List; -import java.util.Set; import lombok.RequiredArgsConstructor; @Adaptor @@ -33,7 +32,7 @@ public User queryUserByOauthInfo(OauthInfo oauthInfo) { } /** user id 리스트에 포함되어 있는 유저를 모두 가져오는 쿼리 */ - public Set queryUserListByIdIn(Set userIdList) { + public List queryUserListByIdIn(List userIdList) { return userRepository.findAllByIdIn(userIdList); } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/repository/UserRepository.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/repository/UserRepository.java index 8cdf89ac..52b6ed50 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/repository/UserRepository.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/repository/UserRepository.java @@ -7,14 +7,13 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Optional; -import java.util.Set; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository { Optional findByOauthInfo(OauthInfo oauthInfo); /** user id 리스트에 포함되어 있는 유저를 모두 가져오는 쿼리 */ - Set findAllByIdIn(Set id); + List findAllByIdIn(List id); /** email 로 유저를 가져오는 쿼리 */ Optional findByProfileEmailAndAccountState(String email, AccountState accountState); diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackErrorNotificationProvider.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackErrorNotificationProvider.java index cef081f1..6e9c28f3 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackErrorNotificationProvider.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackErrorNotificationProvider.java @@ -1,7 +1,6 @@ package band.gosrock.infrastructure.config.slack; -import com.slack.api.methods.MethodsClient; import com.slack.api.model.block.LayoutBlock; import java.util.Arrays; import java.util.List; @@ -23,8 +22,6 @@ public class SlackErrorNotificationProvider { @Value("${slack.webhook.id}") private String CHANNEL_ID; - private final MethodsClient methodsClient; - public String getErrorStack(Throwable throwable) { String exceptionAsString = Arrays.toString(throwable.getStackTrace()); int cutLength = Math.min(exceptionAsString.length(), MAX_LEN); diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackHelper.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackHelper.java index cec7c1cb..f4ea031f 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackHelper.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackHelper.java @@ -19,7 +19,7 @@ @Slf4j public class SlackHelper { private final Environment env; - private final List sendAlarmProfiles = List.of("staging", "prod", "dev"); + private final List sendAlarmProfiles = List.of("staging", "prod"); private final MethodsClient methodsClient; diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackMessageProvider.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackMessageProvider.java index 7abd0552..e64ee735 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackMessageProvider.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/config/slack/SlackMessageProvider.java @@ -5,11 +5,11 @@ import com.slack.api.webhook.Payload; import java.io.IOException; import java.net.UnknownHostException; +import java.util.Objects; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.StringUtils; import org.springframework.beans.factory.annotation.Value; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @Service @@ -23,8 +23,10 @@ public class SlackMessageProvider { @Value("${slack.webhook.icon-url}") private String iconUrl; - @Async + /** 이벤트 핸들러 자체에서 비동기로 실행하기 때문에 @Async 어노테이션 지움 */ public void sendMessage(String url, String text) { + // 슬랙 url 이 null 일경우 안보냄. + if (Objects.isNull(url)) return; try { doSend(url, text); } catch (Exception ignored) {