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

refactor : 이벤트 오픈 api 분리 #320

Merged
merged 3 commits into from
Feb 8, 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 @@ -36,6 +36,7 @@ public class EventController {
private final UpdateEventBasicUseCase updateEventBasicUseCase;
private final UpdateEventDetailUseCase updateEventDetailUseCase;
private final UpdateEventStatusUseCase updateEventStatusUseCase;
private final OpenEventUseCase openEventStatusUseCase;

@Operation(summary = "자신이 관리 중인 이벤트 리스트를 가져옵니다.")
@GetMapping
Expand Down Expand Up @@ -79,7 +80,13 @@ public EventResponse updateEventDetail(
return updateEventDetailUseCase.execute(eventId, updateEventDetailRequest);
}

@Operation(summary = "공연 상태를 변경합니다.")
@Operation(summary = "공연을 오픈 상태로 변경합니다. 모든 체크리스트를 달성해야 합니다.")
@PatchMapping("/{eventId}/open")
public EventResponse updateEventStatus(@PathVariable Long eventId) {
return openEventStatusUseCase.execute(eventId);
}

@Operation(summary = "공연 상태를 변경합니다. (OPEN 제외)")
@PatchMapping("/{eventId}/status")
public EventResponse updateEventStatus(
@PathVariable Long eventId,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package band.gosrock.api.event.service;

import static band.gosrock.api.common.aop.hostRole.FindHostFrom.EVENT_ID;
import static band.gosrock.api.common.aop.hostRole.HostQualification.MANAGER;

import band.gosrock.api.common.aop.hostRole.HostRolesAllowed;
import band.gosrock.api.event.model.dto.response.EventResponse;
import band.gosrock.common.annotation.UseCase;
import band.gosrock.domain.domains.event.adaptor.EventAdaptor;
import band.gosrock.domain.domains.event.domain.Event;
import band.gosrock.domain.domains.event.service.EventService;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

@UseCase
@RequiredArgsConstructor
public class OpenEventUseCase {
private final EventService eventService;
private final EventAdaptor eventAdaptor;

@Transactional
@HostRolesAllowed(role = MANAGER, findHostFrom = EVENT_ID)
public EventResponse execute(Long eventId) {
final Event event = eventAdaptor.findById(eventId);
return EventResponse.of(eventService.openEvent(event));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@

import band.gosrock.domain.common.model.BaseTimeEntity;
import band.gosrock.domain.common.vo.*;
import band.gosrock.domain.domains.event.exception.CannotModifyEventBasicException;
import band.gosrock.domain.domains.event.exception.EventCannotEndBeforeStartException;
import band.gosrock.domain.domains.event.exception.EventNotOpenException;
import band.gosrock.domain.domains.event.exception.EventTicketingTimeIsPassedException;
import band.gosrock.domain.domains.event.exception.*;
import java.time.LocalDateTime;
import javax.persistence.*;
import lombok.AccessLevel;
Expand Down Expand Up @@ -156,22 +153,23 @@ public EventPlaceVo toEventPlaceVo() {
}

public void prepare() {
// TODO : 오픈할수 있는 상태인지 검증필요함.
if (this.status == EventStatus.PREPARING) throw AlreadyPreparingStatusException.EXCEPTION;
this.status = EventStatus.PREPARING;
}

public void open() {
// TODO : 오픈할수 있는 상태인지 검증필요함.
if (this.status == EventStatus.OPEN) throw AlreadyOpenStatusException.EXCEPTION;
this.status = EventStatus.OPEN;
}

public void calculate() {
// TODO : 오픈할수 있는 상태인지 검증필요함.
if (this.status == EventStatus.CALCULATING)
throw AlreadyCalculatingStatusException.EXCEPTION;
this.status = EventStatus.CALCULATING;
}

public void close() {
// TODO : 오픈할수 있는 상태인지 검증필요함.
this.status = EventStatus.OPEN;
if (this.status == EventStatus.CLOSED) throw AlreadyCloseStatusException.EXCEPTION;
this.status = EventStatus.CLOSED;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package band.gosrock.domain.domains.event.exception;


import band.gosrock.common.exception.DuDoongCodeException;

public class AlreadyCalculatingStatusException extends DuDoongCodeException {

public static final DuDoongCodeException EXCEPTION = new AlreadyCalculatingStatusException();

private AlreadyCalculatingStatusException() {
super(EventErrorCode.ALREADY_CALCULATING_STATUS);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package band.gosrock.domain.domains.event.exception;


import band.gosrock.common.exception.DuDoongCodeException;

public class AlreadyCloseStatusException extends DuDoongCodeException {

public static final DuDoongCodeException EXCEPTION = new AlreadyCloseStatusException();

private AlreadyCloseStatusException() {
super(EventErrorCode.ALREADY_CLOSE_STATUS);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package band.gosrock.domain.domains.event.exception;


import band.gosrock.common.exception.DuDoongCodeException;

public class AlreadyOpenStatusException extends DuDoongCodeException {

public static final DuDoongCodeException EXCEPTION = new AlreadyOpenStatusException();

private AlreadyOpenStatusException() {
super(EventErrorCode.ALREADY_OPEN_STATUS);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package band.gosrock.domain.domains.event.exception;


import band.gosrock.common.exception.DuDoongCodeException;

public class AlreadyPreparingStatusException extends DuDoongCodeException {

public static final DuDoongCodeException EXCEPTION = new AlreadyPreparingStatusException();

private AlreadyPreparingStatusException() {
super(EventErrorCode.ALREADY_PREPARING_STATUS);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package band.gosrock.domain.domains.event.exception;


import band.gosrock.common.exception.DuDoongCodeException;

public class CannotOpenEventException extends DuDoongCodeException {

public static final DuDoongCodeException EXCEPTION = new CannotOpenEventException();

private CannotOpenEventException() {
super(EventErrorCode.CANNOT_OPEN_EVENT);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,21 @@
@AllArgsConstructor
public enum EventErrorCode implements BaseErrorCode {
EVENT_NOT_FOUND(NOT_FOUND, "Event_404_1", "이벤트를 찾을 수 없습니다."),
HOST_NOT_AUTH_EVENT(BAD_REQUEST, "Event_400_1", "Host Not Auth Event."),

HOST_NOT_AUTH_EVENT(BAD_REQUEST, "Event_400_1", "Host Not Auth Event."),
EVENT_CANNOT_END_BEFORE_START(BAD_REQUEST, "Event_400_2", "시작 시각은 종료 시각보다 빨라야 합니다."),

EVENT_URL_NAME_ALREADY_EXIST(BAD_REQUEST, "Event_400_3", "중복된 URL 표시 이름입니다."),
CANNOT_MODIFY_EVENT_BASIC(BAD_REQUEST, "Event_400_4", "이벤트 기본 정보는 수정할 수 없습니다."),
EVENT_NOT_OPEN(BAD_REQUEST, "Event_400_5", "아직 오픈되지 않은 이벤트에는 접근할 수 없습니다."),
EVENT_TICKETING_TIME_IS_PASSED(BAD_REQUEST, "Event_400_6", "이벤트 시작시간이 지나 티켓팅을 할 수 없습니다.");
EVENT_TICKETING_TIME_IS_PASSED(BAD_REQUEST, "Event_400_6", "이벤트 시작시간이 지나 티켓팅을 할 수 없습니다."),
CANNOT_OPEN_EVENT(BAD_REQUEST, "Event_400_7", "이벤트 오픈 조건을 충족하지 않았습니다."),
ALREADY_OPEN_STATUS(BAD_REQUEST, "Event_400_8", "이미 오픈 중인 이벤트입니다."),
ALREADY_CALCULATING_STATUS(BAD_REQUEST, "Event_400_9", "이미 정산중인 이벤트입니다."),
ALREADY_CLOSE_STATUS(BAD_REQUEST, "Event_400_10", "이미 닫은 이벤트입니다."),
ALREADY_PREPARING_STATUS(BAD_REQUEST, "Event_400_11", "이미 준비중인 이벤트입니다."),

USE_OTHER_API(BAD_REQUEST, "Event_400_8", "잘못된 접근입니다.");

private Integer status;
private String code;
private String reason;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package band.gosrock.domain.domains.event.exception;


import band.gosrock.common.exception.DuDoongCodeException;

public class UseOtherApiException extends DuDoongCodeException {

public static final DuDoongCodeException EXCEPTION = new UseOtherApiException();

private UseOtherApiException() {
super(EventErrorCode.USE_OTHER_API);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
import band.gosrock.common.annotation.DomainService;
import band.gosrock.domain.domains.event.adaptor.EventAdaptor;
import band.gosrock.domain.domains.event.domain.*;
import band.gosrock.domain.domains.event.exception.HostNotAuthEventException;
import band.gosrock.domain.domains.event.exception.CannotOpenEventException;
import band.gosrock.domain.domains.event.exception.UseOtherApiException;
import band.gosrock.domain.domains.event.repository.EventRepository;
import band.gosrock.domain.domains.ticket_item.service.TicketItemService;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -15,6 +17,7 @@
public class EventService {
private final EventRepository eventRepository;
private final EventAdaptor eventAdaptor;
private final TicketItemService ticketItemService;

public Event createEvent(Event event) {
return eventRepository.save(event);
Expand All @@ -36,19 +39,32 @@ public Event updateEventPlace(Event event, EventPlace eventPlace) {
return eventRepository.save(event);
}

public void validateEventBasicExistence(Event event) {
if (!event.hasEventBasic() || !event.hasEventPlace()) {
throw CannotOpenEventException.EXCEPTION;
}
}

public void validateEventDetailExistence(Event event) {
if (!event.hasEventDetail()) {
throw CannotOpenEventException.EXCEPTION;
}
}

public Event openEvent(Event event) {
this.validateEventBasicExistence(event);
this.validateEventDetailExistence(event);
ticketItemService.validateExistenceByEventId(event.getId());
event.open();
return eventRepository.save(event);
}

public Event updateEventStatus(Event event, EventStatus status) {
// todo :: 이벤트 상태 변경시 검증 필요
if (status == EventStatus.OPEN) event.open();
else if (status == EventStatus.CLOSED) event.close();
if (status == EventStatus.OPEN) {
throw UseOtherApiException.EXCEPTION; // open 은 다른 API 강제
} else if (status == EventStatus.CLOSED) event.close();
else if (status == EventStatus.CALCULATING) event.calculate();
else if (status == EventStatus.PREPARING) event.prepare();
return eventRepository.save(event);
}

public void checkEventHost(Long hostId, Long eventId) {
Event event = eventAdaptor.findById(eventId);
if (!event.getHostId().equals(hostId)) {
throw HostNotAuthEventException.EXCEPTION;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import band.gosrock.domain.common.aop.redissonLock.RedissonLock;
import band.gosrock.domain.domains.ticket_item.adaptor.TicketItemAdaptor;
import band.gosrock.domain.domains.ticket_item.domain.TicketItem;
import band.gosrock.domain.domains.ticket_item.exception.InvalidTicketItemException;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -23,6 +24,12 @@ public TicketItem createTicketItem(TicketItem ticketItem, Boolean isPartner) {
return ticketItemAdaptor.save(ticketItem);
}

public void validateExistenceByEventId(Long eventId) {
if (!ticketItemAdaptor.existsByEventId(eventId)) {
throw InvalidTicketItemException.EXCEPTION;
}
}

@RedissonLock(LockName = "티켓관리", identifier = "ticketItemId")
public void softDeleteTicketItem(Long eventId, Long ticketItemId) {

Expand Down