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

feat : 공연 상세 및 체크리스트 조회 구현 #246

Merged
merged 9 commits into from
Jan 31, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import band.gosrock.domain.domains.cart.exception.CartInvalidOptionAnswerException;
import band.gosrock.domain.domains.cart.exception.CartItemNotOneTypeException;
import band.gosrock.domain.domains.cart.exception.CartNotAnswerAllOptionGroupException;
import band.gosrock.domain.domains.event.exception.EventIsNotOpenStatusException;
import band.gosrock.domain.domains.event.exception.EventNotOpenException;
import band.gosrock.domain.domains.event.exception.EventTicketingTimeIsPassedException;
import band.gosrock.domain.domains.ticket_item.exception.TicketItemQuantityLackException;
import band.gosrock.domain.domains.ticket_item.exception.TicketPurchaseLimitException;
Expand All @@ -23,7 +23,7 @@ public class CreateCartExceptionDocs implements SwaggerExampleExceptions {
public DuDoongCodeException 응답_다대답_안했을때 = CartNotAnswerAllOptionGroupException.EXCEPTION;

@ExplainError("이벤트가 열린 상태가 아닐때")
public DuDoongCodeException 이벤트_닫힘 = EventIsNotOpenStatusException.EXCEPTION;
public DuDoongCodeException 이벤트_닫힘 = EventNotOpenException.EXCEPTION;

@ExplainError("이벤트 티켓팅 시간이 지났을때.")
public DuDoongCodeException 티켓팅_시간지남 = EventTicketingTimeIsPassedException.EXCEPTION;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
import band.gosrock.api.event.model.dto.request.CreateEventRequest;
import band.gosrock.api.event.model.dto.request.UpdateEventBasicRequest;
import band.gosrock.api.event.model.dto.request.UpdateEventDetailRequest;
import band.gosrock.api.event.model.dto.request.UpdateEventStatusRequest;
import band.gosrock.api.event.model.dto.response.EventChecklistResponse;
import band.gosrock.api.event.model.dto.response.EventDetailResponse;
import band.gosrock.api.event.model.dto.response.EventProfileResponse;
import band.gosrock.api.event.model.dto.response.EventResponse;
import band.gosrock.api.event.service.CreateEventUseCase;
import band.gosrock.api.event.service.ReadUserEventProfilesUseCase;
import band.gosrock.api.event.service.UpdateEventBasicUseCase;
import band.gosrock.api.event.service.UpdateEventDetailUseCase;
import band.gosrock.api.event.service.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
Expand All @@ -29,9 +29,12 @@
public class EventController {

private final ReadUserEventProfilesUseCase readUserHostEventListUseCase;
private final ReadEventDetailUseCase readEventDetailUseCase;
private final ReadEventChecklistUseCase readEventChecklistUseCase;
private final CreateEventUseCase createEventUseCase;
private final UpdateEventBasicUseCase updateEventBasicUseCase;
private final UpdateEventDetailUseCase updateEventDetailUseCase;
private final UpdateEventStatusUseCase updateEventStatusUseCase;

@Operation(summary = "자신이 관리 중인 이벤트 리스트를 가져옵니다.")
@GetMapping
Expand All @@ -46,6 +49,18 @@ public EventResponse createEvent(@RequestBody @Valid CreateEventRequest createEv
return createEventUseCase.execute(createEventRequest);
}

@Operation(summary = "공연 상세 정보를 가져옵니다.")
@GetMapping("/{eventId}")
public EventDetailResponse getEventDetailById(@PathVariable Long eventId) {
return readEventDetailUseCase.execute(eventId);
}

@Operation(summary = "공연 체크리스트 가져오기")
@GetMapping("/{eventId}/checklist")
public EventChecklistResponse getEventChecklistById(@PathVariable Long eventId) {
return readEventChecklistUseCase.execute(eventId);
}

@Operation(summary = "공연 기본 정보를 등록하여, 새로운 이벤트(공연)를 생성합니다")
@PatchMapping("/{eventId}/basic")
public EventResponse updateEventBasic(
Expand All @@ -61,4 +76,12 @@ public EventResponse updateEventDetail(
@RequestBody @Valid UpdateEventDetailRequest updateEventDetailRequest) {
return updateEventDetailUseCase.execute(eventId, updateEventDetailRequest);
}

@Operation(summary = "공연 상태를 변경합니다.")
@PatchMapping("/{eventId}/status")
public EventResponse updateEventStatus(
@PathVariable Long eventId,
@RequestBody @Valid UpdateEventStatusRequest updateEventDetailRequest) {
return updateEventStatusUseCase.execute(eventId, updateEventDetailRequest);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package band.gosrock.api.event.model.dto.request;


import band.gosrock.common.annotation.Enum;
import band.gosrock.domain.domains.event.domain.EventStatus;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class UpdateEventStatusRequest {

@Schema(defaultValue = "OPEN", description = "오픈 상태", allowableValues = "OPEN,CLOSED,PREPARING")
@Enum(message = "올바른 값을 입력해주세요.")
private EventStatus status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package band.gosrock.api.event.model.dto.response;


import band.gosrock.domain.domains.event.domain.Event;
import lombok.Builder;
import lombok.Getter;

/** 공연 체크 리스트 응답 DTO */
@Getter
@Builder
public class EventChecklistResponse {
private Long hostId;
private Long eventId;
private String name;
// 공연 기본 정보 (공연장 위치로 구분) 작성 여부
private Boolean hasBasic;
// 공연 상세 정보 작성 여부
private Boolean hasDetail;
// 티켓 상품 설정했는지 여부
private Boolean hasTicketItem;

public static EventChecklistResponse of(Event event, Boolean hasTicket) {
return EventChecklistResponse.builder()
.hostId(event.getHostId())
.eventId(event.getId())
.name(event.getEventBasic().getName())
.hasBasic(event.hasEventBasic() && event.hasEventPlace())
.hasDetail(event.hasEventDetail())
.hasTicketItem(hasTicket)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package band.gosrock.api.event.model.dto.response;


import band.gosrock.common.annotation.DateFormat;
import band.gosrock.domain.common.vo.EventBasicVo;
import band.gosrock.domain.common.vo.EventDetailVo;
import band.gosrock.domain.common.vo.EventPlaceVo;
import band.gosrock.domain.common.vo.HostInfoVo;
import band.gosrock.domain.domains.event.domain.Event;
import band.gosrock.domain.domains.event.domain.EventStatus;
import band.gosrock.domain.domains.host.domain.Host;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import java.time.LocalDateTime;
import lombok.Builder;
import lombok.Getter;

/** 이벤트 디테일 응답 DTO */
@Getter
@Builder
public class EventDetailResponse {

private String name;
@DateFormat private LocalDateTime startAt;
private Long runTime;
private EventStatus status;
private HostInfoVo host;
private EventPlaceVo place;
@JsonUnwrapped private EventDetailVo eventDetailVo;

public static EventDetailResponse of(Host host, Event event) {
EventBasicVo eventBasicVo = event.toEventBasicVo();
return EventDetailResponse.builder()
.name(eventBasicVo.getName())
.startAt(eventBasicVo.getStartAt())
.runTime(eventBasicVo.getRunTime())
.eventDetailVo(event.toEventDetailVo())
.place(event.toEventPlaceVo())
.host(host.toHostInfoVo())
.status(event.getStatus())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,42 +1,34 @@
package band.gosrock.api.event.model.dto.response;


import band.gosrock.common.annotation.DateFormat;
import band.gosrock.domain.common.vo.EventBasicVo;
import band.gosrock.domain.common.vo.EventDetailVo;
import band.gosrock.domain.common.vo.EventPlaceVo;
import band.gosrock.domain.domains.event.domain.Event;
import band.gosrock.domain.domains.event.domain.EventStatus;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import java.time.LocalDateTime;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class EventResponse {
private Long eventId;

private Long hostId;
private EventStatus status;

@JsonUnwrapped private EventBasicVo eventBasic;
@JsonUnwrapped private EventDetailVo eventDetail;
@JsonUnwrapped private EventPlaceVo eventPlace;

/** todo : ************* 미확정된 정보 ***************** */
@DateFormat private LocalDateTime ticketingStartAt;

@DateFormat private LocalDateTime ticketingEndAt;
/************* 미확정된 정보 ******************/
private EventPlaceVo place;

public static EventResponse of(Event event) {
return EventResponse.builder()
.eventId(event.getId())
.hostId(event.getHostId())
.eventBasic(EventBasicVo.from(event))
.eventDetail(EventDetailVo.from(event))
.eventPlace(EventPlaceVo.from(event))
.ticketingStartAt(event.getTicketingStartAt())
.ticketingEndAt(event.getTicketingEndAt())
.place(EventPlaceVo.from(event))
.status(event.getStatus())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import band.gosrock.api.event.model.dto.request.CreateEventRequest;
import band.gosrock.api.event.model.dto.request.UpdateEventBasicRequest;
import band.gosrock.api.event.model.dto.request.UpdateEventDetailRequest;
import band.gosrock.api.event.model.dto.response.EventChecklistResponse;
import band.gosrock.api.event.model.dto.response.EventDetailResponse;
import band.gosrock.api.event.model.dto.response.EventProfileResponse;
import band.gosrock.common.annotation.Mapper;
import band.gosrock.domain.domains.event.adaptor.EventAdaptor;
Expand All @@ -13,6 +15,7 @@
import band.gosrock.domain.domains.event.domain.EventPlace;
import band.gosrock.domain.domains.host.adaptor.HostAdaptor;
import band.gosrock.domain.domains.host.domain.Host;
import band.gosrock.domain.domains.ticket_item.adaptor.TicketItemAdaptor;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
Expand All @@ -25,6 +28,7 @@ public class EventMapper {

private final HostAdaptor hostAdaptor;
private final EventAdaptor eventAdaptor;
private final TicketItemAdaptor ticketItemAdaptor;

@Transactional(readOnly = true)
public Event toEntity(CreateEventRequest createEventRequest) {
Expand Down Expand Up @@ -61,6 +65,15 @@ public EventPlace toEventPlace(UpdateEventBasicRequest updateEventBasicRequest)
.build();
}

public EventDetailResponse toEventDetailResponse(Host host, Event event) {
return EventDetailResponse.of(host, event);
}

public EventChecklistResponse toEventChecklistResponse(Event event) {
final Boolean hasTicketItem = ticketItemAdaptor.existsByEventId(event.getId());
return EventChecklistResponse.of(event, hasTicketItem);
}

public Page<EventProfileResponse> toEventProfileResponsePage(Long userId, Pageable pageable) {
List<Host> hostList = hostAdaptor.findAllByHostUsers_UserId(userId);
List<Long> hostIds = hostList.stream().map(Host::getId).toList();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package band.gosrock.api.event.service;


import band.gosrock.api.common.UserUtils;
import band.gosrock.api.event.model.dto.response.EventChecklistResponse;
import band.gosrock.api.event.model.mapper.EventMapper;
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.host.adaptor.HostAdaptor;
import band.gosrock.domain.domains.host.domain.Host;
import band.gosrock.domain.domains.user.domain.User;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

@UseCase
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ReadEventChecklistUseCase {
private final UserUtils userUtils;
private final EventAdaptor eventAdaptor;
private final EventMapper eventMapper;
private final HostAdaptor hostAdaptor;

public EventChecklistResponse execute(Long eventId) {
final Event event = eventAdaptor.findById(eventId);
final Host host = hostAdaptor.findById(event.getHostId());
final User user = userUtils.getCurrentUser();
final Long userId = user.getId();
host.validateHostUser(userId);
gengminy marked this conversation as resolved.
Show resolved Hide resolved

return eventMapper.toEventChecklistResponse(event);
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,39 @@
package band.gosrock.api.event.service;


import band.gosrock.api.common.page.PageResponse;
import band.gosrock.api.event.model.dto.response.EventProfileResponse;
import band.gosrock.api.common.UserUtils;
import band.gosrock.api.event.model.dto.response.EventDetailResponse;
import band.gosrock.api.event.model.mapper.EventMapper;
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.domain.EventStatus;
import band.gosrock.domain.domains.event.exception.EventNotOpenException;
import band.gosrock.domain.domains.host.adaptor.HostAdaptor;
import band.gosrock.domain.domains.host.domain.Host;
import band.gosrock.domain.domains.user.domain.User;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.transaction.annotation.Transactional;

@UseCase
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ReadEventDetailUseCase {
private final UserUtils userUtils;
private final EventAdaptor eventAdaptor;
private final EventMapper eventMapper;
private final HostAdaptor hostAdaptor;

@Deprecated
public PageResponse<EventProfileResponse> execute(Long hostId, Pageable pageable) {
return null;
// PageResponse.of(
// eventAdaptor.findAllByHostId(hostId,
// pageable).map(EventProfileResponse::of));
public EventDetailResponse execute(Long eventId) {
Event event = eventAdaptor.findById(eventId);
Host host = hostAdaptor.findById(event.getHostId());
User user = userUtils.getCurrentUser();
Long userId = user.getId();
gengminy marked this conversation as resolved.
Show resolved Hide resolved

// 호스트 유저가 아닐 경우 준비 상태일 때 조회할 수 없음
if (event.getStatus() == EventStatus.PREPARING && !host.hasHostUserId(userId)) {
gengminy marked this conversation as resolved.
Show resolved Hide resolved
throw EventNotOpenException.EXCEPTION;
}
return eventMapper.toEventDetailResponse(host, event);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package band.gosrock.api.event.service;


import band.gosrock.api.common.UserUtils;
import band.gosrock.api.event.model.dto.request.UpdateEventStatusRequest;
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.domain.EventStatus;
import band.gosrock.domain.domains.event.service.EventService;
import band.gosrock.domain.domains.host.service.HostService;
import band.gosrock.domain.domains.user.domain.User;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

@UseCase
@RequiredArgsConstructor
public class UpdateEventStatusUseCase {
private final UserUtils userUtils;
private final HostService hostService;
private final EventService eventService;
private final EventAdaptor eventAdaptor;

@Transactional
public EventResponse execute(Long eventId, UpdateEventStatusRequest updateEventStatusRequest) {
final User user = userUtils.getCurrentUser();
final Long userId = user.getId();
final Event event = eventAdaptor.findById(eventId);
hostService.validateSuperHostUser(event.getHostId(), userId);
final EventStatus status = updateEventStatusRequest.getStatus();

return EventResponse.of(eventService.updateEventStatus(event, status));
}
}
Loading