Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

0.1.4-1 #346

Merged
merged 3 commits into from
Feb 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.permitAll()
.mvcMatchers("/v1/auth/token/refresh")
.permitAll()
.mvcMatchers(HttpMethod.GET, "/v1/events/{eventId:[\\d+]}")
.mvcMatchers(HttpMethod.GET, "/v1/events/{eventId:[0-9]*$}")
.permitAll()
.mvcMatchers(HttpMethod.GET, "/v1/events/{eventId:[\\d+]}/ticketItems")
.mvcMatchers(HttpMethod.GET, "/v1/events/{eventId:[0-9]*$}/ticketItems")
.permitAll()
.mvcMatchers(HttpMethod.GET, "/v1/events/{eventId:[\\d+]}/comments/**")
.mvcMatchers(HttpMethod.GET, "/v1/events/{eventId:[0-9]*$}/comments/**")
.permitAll()
.mvcMatchers(HttpMethod.POST, "/v1/coupons/campaigns")
.hasRole("SUPER_ADMIN")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package band.gosrock.api.email.dto;


import band.gosrock.infrastructure.config.mail.dto.EmailEventInfo;
import band.gosrock.infrastructure.config.mail.dto.EmailIssuedTicketInfo;
import band.gosrock.infrastructure.config.mail.dto.EmailUserInfo;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class IssuedTicketMailDTO {

private final EmailUserInfo userInfo;

private final EmailIssuedTicketInfo issuedTicketInfo;

private final EmailEventInfo eventInfo;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package band.gosrock.api.email.handler;


import band.gosrock.api.email.dto.IssuedTicketMailDTO;
import band.gosrock.api.email.service.EntranceIssuedTicketEmailService;
import band.gosrock.api.email.service.IssuedTicketMailInfoHelper;
import band.gosrock.domain.common.events.issuedTicket.EntranceIssuedTicketEvent;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;

@Component
@RequiredArgsConstructor
@Slf4j
public class EntranceIssuedTicketEventEmailHandler {

private final IssuedTicketMailInfoHelper issuedTicketMailInfoHelper;

private final EntranceIssuedTicketEmailService entranceIssuedTicketEmailService;

@Async
@TransactionalEventListener(
classes = EntranceIssuedTicketEvent.class,
phase = TransactionPhase.AFTER_COMMIT)
public void handleEntranceIssuedTicketEvent(
EntranceIssuedTicketEvent entranceIssuedTicketEvent) {
log.info(entranceIssuedTicketEvent.getIssuedTicketNo() + "번 티켓 입장 처리 이메일 전송");

IssuedTicketMailDTO issuedTicketMailDTO =
issuedTicketMailInfoHelper.execute(entranceIssuedTicketEvent.getIssuedTicketNo());
entranceIssuedTicketEmailService.execute(issuedTicketMailDTO);
log.info("이메일 전송 성공");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package band.gosrock.api.email.service;


import band.gosrock.api.email.dto.IssuedTicketMailDTO;
import band.gosrock.infrastructure.config.mail.dto.EmailUserInfo;
import band.gosrock.infrastructure.config.ses.AwsSesUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.thymeleaf.context.Context;

@Service
@RequiredArgsConstructor
public class EntranceIssuedTicketEmailService {

private final AwsSesUtils awsSesUtils;

public void execute(IssuedTicketMailDTO issuedTicketMailDTO) {
String subject = "[두둥] 입장 확인 알림드립니다.";
Context context = new Context();
EmailUserInfo userInfo = issuedTicketMailDTO.getUserInfo();

context.setVariable("userInfo", userInfo);
context.setVariable("issuedTicketInfo", issuedTicketMailDTO.getIssuedTicketInfo());
context.setVariable("eventInfo", issuedTicketMailDTO.getEventInfo());

awsSesUtils.singleEmailRequest(
userInfo.getEmail(), subject, "entranceIssuedTicket", context);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package band.gosrock.api.email.service;


import band.gosrock.api.email.dto.IssuedTicketMailDTO;
import band.gosrock.common.annotation.Helper;
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.issuedTicket.adaptor.IssuedTicketAdaptor;
import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket;
import band.gosrock.domain.domains.user.adaptor.UserAdaptor;
import band.gosrock.domain.domains.user.domain.User;
import band.gosrock.infrastructure.config.mail.dto.EmailEventInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

@Helper
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class IssuedTicketMailInfoHelper {

private final UserAdaptor userAdaptor;

private final EventAdaptor eventAdaptor;

private final IssuedTicketAdaptor issuedTicketAdaptor;

private final HostAdaptor hostAdaptor;

public IssuedTicketMailDTO execute(String issuedTicketNo) {
IssuedTicket issuedTicket = issuedTicketAdaptor.queryByIssuedTicketNo(issuedTicketNo);
User user = userAdaptor.queryUser(issuedTicket.getUserInfo().getUserId());
Event event = eventAdaptor.findById(issuedTicket.getEventId());
Host host = hostAdaptor.findById(event.getHostId());
return new IssuedTicketMailDTO(
user.toEmailUserInfo(),
issuedTicket.toEmailIssuedTicketInfo(),
getEventInfo(event, host));
}

private EmailEventInfo getEventInfo(Event event, Host host) {
return new EmailEventInfo(host.getProfile().getName(), event.getEventBasic().getName());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import band.gosrock.domain.common.vo.IssuedTicketInfoVo;
import band.gosrock.domain.domains.issuedTicket.service.IssuedTicketDomainService;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

@UseCase
@RequiredArgsConstructor
Expand All @@ -21,6 +22,7 @@ public class EntranceIssuedTicketUseCase {

private final UserUtils userUtils;

@Transactional
@HostRolesAllowed(role = MANAGER, findHostFrom = EVENT_ID)
public IssuedTicketInfoVo execute(Long eventId, Long issuedTicketId) {
return issuedTicketDomainService.processingEntranceIssuedTicket(eventId, issuedTicketId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class TicketItemController {

@Operation(
summary = "특정 이벤트에 속하는 티켓 상품을 생성합니다.",
description = "제휴 되지 않은 회원은 티켓 가격 0으로 강제해 보내주세요!")
description = "두둥티켓은 승인형식만, 유료티켓은 선착순형식만 가능합니다.")
@PostMapping
public TicketItemResponse createTicketItem(
@RequestBody @Valid CreateTicketItemRequest createTicketItemRequest,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@


import band.gosrock.common.annotation.Enum;
import band.gosrock.domain.domains.ticket_item.domain.TicketPayType;
import band.gosrock.domain.domains.ticket_item.domain.TicketType;
import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotEmpty;
Expand All @@ -14,9 +15,9 @@
@RequiredArgsConstructor
public class CreateTicketItemRequest {

@Schema(nullable = false, defaultValue = "선착순")
@Enum(message = "선착순, 승인만 허용됩니다")
private TicketType type;
@Schema(nullable = false, defaultValue = "두둥티켓")
@Enum(message = "두둥티켓, 무료티켓, 유료티켓만 허용됩니다")
private TicketPayType payType;

@NotEmpty(message = "티켓상품 이름을 입력해주세요")
@Schema(nullable = false, example = "일반 티켓")
Expand All @@ -26,6 +27,10 @@ public class CreateTicketItemRequest {
@Schema(nullable = true, example = "일반 입장 티켓입니다.")
private String description;

@Nullable
@Schema(nullable = true, example = "신한은행 110-123-1234567")
private String accountNumber;

@NotNull
@Schema(defaultValue = "0", nullable = false, example = "4000")
private Long price;
Expand All @@ -34,6 +39,14 @@ public class CreateTicketItemRequest {
@Schema(nullable = false, example = "100")
private Long supplyCount;

@Schema(nullable = false, defaultValue = "선착순")
@Enum(message = "선착순, 승인만 허용됩니다")
private TicketType approveType;

@NotNull
@Schema(nullable = false, example = "true")
private Boolean isQuantityPublic;

@NotNull
@Schema(nullable = false, example = "1")
private Long purchaseLimit;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import band.gosrock.domain.common.vo.Money;
import band.gosrock.domain.domains.ticket_item.domain.TicketItem;
import band.gosrock.domain.domains.ticket_item.domain.TicketPayType;
import band.gosrock.domain.domains.ticket_item.domain.TicketType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
Expand All @@ -14,6 +15,9 @@ public class TicketItemResponse {
@Schema(description = "티켓상품 id")
private final Long ticketItemId;

@Schema(description = "티켓 지불 타입")
private final TicketPayType payType;

@Schema(description = "이름")
private final String ticketName;

Expand All @@ -23,8 +27,8 @@ public class TicketItemResponse {
@Schema(description = "가격")
private final Money price;

@Schema(description = "티켓 타입")
private final TicketType type;
@Schema(description = "티켓 승인 타입")
private final TicketType approveType;

@Schema(description = "1인당 구매 제한 매수")
private final Long purchaseLimit;
Expand All @@ -35,17 +39,22 @@ public class TicketItemResponse {
@Schema(description = "재고")
private final Long quantity;

@Schema(description = "재고공개 여부")
private final Boolean isQuantityPublic;

public static TicketItemResponse from(TicketItem ticketItem) {

return TicketItemResponse.builder()
.ticketItemId(ticketItem.getId())
.payType(ticketItem.getPayType())
.ticketName(ticketItem.getName())
.description(ticketItem.getDescription())
.price(ticketItem.getPrice())
.type(ticketItem.getType())
.approveType(ticketItem.getType())
.purchaseLimit(ticketItem.getPurchaseLimit())
.supplyCount(ticketItem.getSupplyCount())
.quantity(ticketItem.getQuantity())
.isQuantityPublic(ticketItem.getIsQuantityPublic())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,16 @@ public class TicketItemMapper {
public TicketItem toTicketItem(CreateTicketItemRequest createTicketItemRequest, Event event) {

return TicketItem.builder()
.type(createTicketItemRequest.getType())
.payType(createTicketItemRequest.getPayType())
.name(createTicketItemRequest.getName())
.description(createTicketItemRequest.getDescription())
.price(Money.wons(createTicketItemRequest.getPrice()))
.quantity(createTicketItemRequest.getSupplyCount())
.supplyCount(createTicketItemRequest.getSupplyCount())
.purchaseLimit(createTicketItemRequest.getPurchaseLimit())
.type(createTicketItemRequest.getApproveType())
.accountNumber(createTicketItemRequest.getAccountNumber())
.isQuantityPublic(createTicketItemRequest.getIsQuantityPublic())
.isSellable(true)
.event(event)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,27 @@

import band.gosrock.domain.common.aop.domainEvent.DomainEvent;
import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket;
import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketUserInfoVo;
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;

@Getter
@Builder
@ToString
public class EntranceIssuedTicketEvent extends DomainEvent {

private final Long issuedTicketId;
private final String issuedTicketNo;

private final Long eventId;

private final IssuedTicketUserInfoVo userInfo;

public static EntranceIssuedTicketEvent from(IssuedTicket issuedTicket) {
return EntranceIssuedTicketEvent.builder()
.eventId(issuedTicket.getEventId())
.issuedTicketId(issuedTicket.getId())
.issuedTicketNo(issuedTicket.getIssuedTicketNo())
.userInfo(issuedTicket.getUserInfo())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,10 @@ public IssuedTickets findOrderIssuedTickets(String orderUuid) {
public Long countPaidTicket(Long userId, Long itemId) {
return issuedTicketRepository.countPaidTicket(userId, itemId);
}

public IssuedTicket queryByIssuedTicketNo(String issuedTicketNo) {
return issuedTicketRepository
.findByIssuedTicketNo(issuedTicketNo)
.orElseThrow(() -> IssuedTicketNotFoundException.EXCEPTION);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import band.gosrock.domain.domains.issuedTicket.exception.CanNotCancelException;
import band.gosrock.domain.domains.issuedTicket.exception.CanNotEntranceException;
import band.gosrock.domain.domains.issuedTicket.exception.IssuedTicketAlreadyEntranceException;
import band.gosrock.infrastructure.config.mail.dto.EmailIssuedTicketInfo;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
Expand Down Expand Up @@ -146,6 +147,15 @@ public IssuedTicketInfoVo toIssuedTicketInfoVo() {
return IssuedTicketInfoVo.from(this);
}

public EmailIssuedTicketInfo toEmailIssuedTicketInfo() {
return new EmailIssuedTicketInfo(
this.getIssuedTicketNo(),
this.getItemInfo().getTicketName(),
this.getCreatedAt(),
this.getIssuedTicketStatus().getKr(),
this.getPrice().toString());
}

/** ---------------------------- 상태 변환 관련 메서드 ---------------------------------- */

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@

import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;

public interface IssuedTicketRepository
extends JpaRepository<IssuedTicket, Long>, IssuedTicketCustomRepository {
List<IssuedTicket> findAllByOrderLineId(Long orderLineId);

List<IssuedTicket> findAllByOrderUuid(String orderId);

Optional<IssuedTicket> findByIssuedTicketNo(String issuedTicketNo);
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ public void doneOrderEventAfterRollBackWithdrawIssuedTickets(Long itemId, String
/*
발급 티켓 입장 처리 로직
*/
@Transactional
public IssuedTicketInfoVo processingEntranceIssuedTicket(Long eventId, Long issuedTicketId) {
IssuedTicket issuedTicket = issuedTicketAdaptor.queryIssuedTicket(issuedTicketId);
issuedTicketValidator.validIssuedTicketEventIdEqualEvent(issuedTicket, eventId);
Expand Down
Loading