Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ public record AdminEventUpdateRequest(
List<AdminEventImageRequest> images,

@Min(value = 0, message = "최소 나이는 0 이상이어야 합니다.")
Integer minAge
Integer minAge,

@Valid
List<AdminEventImageRequest> siteMapImages
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,10 @@ public record AdminEventWithTicketCreateRequest(

@NotEmpty(message = "티켓 정보는 최소 1개 이상이어야 합니다.")
@Valid
List<TicketTypeRequest> ticketTypes
List<TicketTypeRequest> ticketTypes,

@Valid
List<AdminEventImageRequest> siteMapImages
) {
public record TicketTypeRequest(
@NotBlank(message = "티켓 이름은 필수입니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ public record AdminEventDetailResponse(
String lineup,
String details,
List<AdminEventImageInfo> images,
int minAge
int minAge,
List<AdminEventImageInfo> siteMapImages
) {

public static AdminEventDetailResponse of(final long eventId,
Expand All @@ -40,7 +41,8 @@ public static AdminEventDetailResponse of(final long eventId,
final String lineup,
final String details,
final List<AdminEventImageInfo> images,
final int minAge) {
final int minAge,
final List<AdminEventImageInfo> siteMapImages) {
return new AdminEventDetailResponse(
eventId,
eventExposureStartDate,
Expand All @@ -58,7 +60,8 @@ public static AdminEventDetailResponse of(final long eventId,
lineup,
details,
images,
minAge
minAge,
siteMapImages
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@
import com.permitseoul.permitserver.domain.event.core.exception.EventIllegalArgumentException;
import com.permitseoul.permitserver.domain.eventimage.core.domain.EventImage;
import com.permitseoul.permitserver.domain.eventimage.core.domain.entity.EventImageEntity;
import com.permitseoul.permitserver.domain.sitemapimage.core.component.SiteMapImageRemover;
import com.permitseoul.permitserver.domain.sitemapimage.core.component.SiteMapImageRetriever;
import com.permitseoul.permitserver.domain.sitemapimage.core.component.SiteMapImageSaver;
import com.permitseoul.permitserver.domain.sitemapimage.core.domain.EventSiteMapImage;
import com.permitseoul.permitserver.domain.sitemapimage.core.domain.entity.EventSiteMapImageEntity;
import com.permitseoul.permitserver.domain.ticketround.core.domain.TicketRound;
import com.permitseoul.permitserver.domain.ticketround.core.exception.TicketRoundIllegalArgumentException;
import com.permitseoul.permitserver.domain.tickettype.core.domain.TicketType;
Expand Down Expand Up @@ -57,6 +62,9 @@ public class AdminEventService {
private final AdminEventUpdater adminEventUpdater;
private final AdminEventImageRemover adminEventImageRemover;
private final AdminRedisTicketTypeSaver adminRedisTicketTypeSaver;
private final SiteMapImageSaver siteMapImageSaver;
private final SiteMapImageRemover siteMapImageRemover;
private final SiteMapImageRetriever siteMapImageRetriever;

@Transactional(readOnly = true)
public List<AdminEventListResponse> getEvents() {
Expand Down Expand Up @@ -89,6 +97,13 @@ public AdminEventDetailResponse getEventDetail(final long eventId) {
.map(eventImage -> AdminEventDetailResponse.AdminEventImageInfo.of(eventImage.getImageUrl()))
.toList();

final List<EventSiteMapImage> siteMapImages = siteMapImageRetriever.findAllEventSiteMapImagesByEventId(event.getEventId());

final List<AdminEventDetailResponse.AdminEventImageInfo> eventSiteMapImages = siteMapImages.stream()
.sorted(Comparator.comparingInt(EventSiteMapImage::getSequence))
.map(eventImage -> AdminEventDetailResponse.AdminEventImageInfo.of(eventImage.getSitemapImageUrl()))
.toList();

return AdminEventDetailResponse.of(
event.getEventId(),
LocalDateTimeFormatterUtil.formatyyyyMMdd(event.getVisibleStartAt()),
Expand All @@ -106,7 +121,8 @@ public AdminEventDetailResponse getEventDetail(final long eventId) {
event.getLineUp(),
event.getDetails(),
adminEventImageInfos,
event.getMinAge()
event.getMinAge(),
eventSiteMapImages
);

} catch(AdminEventNotFoundException e) {
Expand All @@ -128,6 +144,8 @@ public void createEventWithTickets(final AdminEventWithTicketCreateRequest creat
final Event savedEvent = saveEvent(createEventWithTicketsReq, eventStartDateTime, eventEndDateTime, eventExposureStartDateTime, eventExposureEndDateTime);
saveEventImages(savedEvent.getEventId(), createEventWithTicketsReq.images());

saveEventSiteMapImages(savedEvent.getEventId(), createEventWithTicketsReq.siteMapImages());

final TicketRound savedTicketRound;
final List<TicketType> savedTicketTypes;
try {
Expand Down Expand Up @@ -167,8 +185,10 @@ public void updateEvent(final AdminEventUpdateRequest updateRequest) {

final LocalDateTime startAt = combineDateAndTimeForUpdate(updateRequest.startDate(), updateRequest.startTime(), eventEntity.getStartAt());
final LocalDateTime endAt = combineDateAndTimeForUpdate(updateRequest.endDate(), updateRequest.endTime(), eventEntity.getEndAt());

adminEventUpdater.updateEvent(eventEntity, updateRequest, visibleStartAt, visibleEndAt, startAt, endAt);
updateEventImages(eventEntity.getEventId(), updateRequest.images());
updateEventSiteMapImages(eventEntity.getEventId(), updateRequest.siteMapImages());

} catch(AdminEventNotFoundException e) {
throw new AdminApiException(ErrorCode.NOT_FOUND_EVENT);
Expand All @@ -177,11 +197,34 @@ public void updateEvent(final AdminEventUpdateRequest updateRequest) {
}
}

private void updateEventSiteMapImages(final long eventId, final List<AdminEventImageRequest> eventSiteMapImages) {
if (eventSiteMapImages == null || eventSiteMapImages.isEmpty()) {
return;
}
siteMapImageRemover.deleteAllSiteMapImages(eventId);
saveEventSiteMapImages(eventId, eventSiteMapImages);
}

private void updateEventImages(final long eventId, final List<AdminEventImageRequest> eventImages) {
if (eventImages != null && !eventImages.isEmpty()) {
adminEventImageRemover.deleteAllByEventId(eventId);
saveEventImages(eventId, eventImages);
if (eventImages == null || eventImages.isEmpty()) {
return;
}
adminEventImageRemover.deleteAllByEventId(eventId);
saveEventImages(eventId, eventImages);
}

private void saveEventSiteMapImages(final long eventId, final List<AdminEventImageRequest> eventSiteMapImages) {
if(eventSiteMapImages == null || eventSiteMapImages.isEmpty()) {
return;
}
final List<EventSiteMapImageEntity> eventSiteMapImageEntities = IntStream.range(0, eventSiteMapImages.size())
.mapToObj(i -> EventSiteMapImageEntity.create(
eventSiteMapImages.get(i).imageUrl().trim(),
i,
eventId
))
.toList();
siteMapImageSaver.saveSiteMapImages(eventSiteMapImageEntities);
}

private void saveEventImages(final long eventId, final List<AdminEventImageRequest> eventImages) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.permitseoul.permitserver.domain.event.core.exception.EventNotfoundException;
import com.permitseoul.permitserver.domain.eventimage.core.component.EventImageRetriever;
import com.permitseoul.permitserver.domain.eventimage.core.domain.EventImage;
import com.permitseoul.permitserver.domain.eventimage.core.domain.entity.EventImageEntity;
import com.permitseoul.permitserver.domain.eventimage.core.exception.EventImageNotFoundException;
import com.permitseoul.permitserver.global.util.LocalDateTimeFormatterUtil;
import com.permitseoul.permitserver.global.response.code.ErrorCode;
Expand All @@ -22,6 +23,7 @@
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

@RequiredArgsConstructor
Expand Down Expand Up @@ -53,6 +55,7 @@ public EventDetailResponse getEventDetail(final long eventId) {

final List<EventImage> eventImageList = eventImageRetriever.findAllEventImagesByEventId(event.getEventId());
final List<EventDetailResponse.EventImageInfo> imagesInfo = eventImageList.stream()
.sorted(Comparator.comparingInt(EventImage::getSequence))
.map(eventImage -> EventDetailResponse.EventImageInfo.of(eventImage.getImageUrl(), eventImage.getSequence()))
.toList();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class EventImageEntity {
@Column(name = "event_id", nullable = false)
private long eventId;

@Column(name = "image_url", nullable = false)
@Column(name = "image_url", nullable = false, columnDefinition = "TEXT")
private String imageUrl;

@Column(name = "sequence", nullable = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class TimetableBlockMediaEntity {
@Min(value = 0, message = "timetable_block_media의 sequence는 0이상이어야합니다.")
private int sequence;

@Column(name = "mediaUrl", nullable = false)
@Column(name = "mediaUrl", nullable = false, columnDefinition = "TEXT")
private String mediaUrl;

private TimetableBlockMediaEntity(long timetableBlockId, int sequence, String mediaUrl) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.permitseoul.permitserver.domain.sitemapimage;

public abstract class SiteMapImageBaseException extends RuntimeException {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.permitseoul.permitserver.domain.sitemapimage.api;

import com.permitseoul.permitserver.domain.sitemapimage.api.exception.SiteMapImageApiException;
import com.permitseoul.permitserver.global.response.ApiResponseUtil;
import com.permitseoul.permitserver.global.response.BaseResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice(basePackages = "com.permitseoul.permitserver.domain.sitemapimage")
public class EventSiteMapExceptionHandler {

@ExceptionHandler(SiteMapImageApiException.class)
public ResponseEntity<BaseResponse<?>> handleSiteMapImageApiException(final SiteMapImageApiException e) {
return ApiResponseUtil.failure(e.getErrorCode());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.permitseoul.permitserver.domain.sitemapimage.api.controller;

import com.permitseoul.permitserver.domain.sitemapimage.api.service.EventSiteMapImageService;
import com.permitseoul.permitserver.global.aop.resolver.event.EventIdPathVariable;
import com.permitseoul.permitserver.global.response.ApiResponseUtil;
import com.permitseoul.permitserver.global.response.BaseResponse;
import com.permitseoul.permitserver.global.response.code.SuccessCode;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/events")
public class EventSiteMapImageController {
private final EventSiteMapImageService eventSiteMapImageService;

//이벤트 siteMap 이미지 조회 API
@GetMapping("/{eventId}/sitemap")
public ResponseEntity<BaseResponse<?>> getEventSitemapImages (
@EventIdPathVariable final Long eventId
) {
return ApiResponseUtil.success(SuccessCode.OK, eventSiteMapImageService.getEventSiteMapImages(eventId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.permitseoul.permitserver.domain.sitemapimage.api.dto.res;


import java.util.List;

public record EventSiteMapGetResponse(
List<EventSiteMapImageInfo> siteMapImages
) {
public static EventSiteMapGetResponse of(List<EventSiteMapImageInfo> images) {
return new EventSiteMapGetResponse(images);
}

public record EventSiteMapImageInfo(
String imageUrl
) {
public static EventSiteMapImageInfo of(final String imageUrl) {
return new EventSiteMapImageInfo(imageUrl);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.permitseoul.permitserver.domain.sitemapimage.api.exception;

import com.permitseoul.permitserver.domain.sitemapimage.SiteMapImageBaseException;
import com.permitseoul.permitserver.global.response.code.ErrorCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class SiteMapImageApiException extends SiteMapImageBaseException {
private final ErrorCode errorCode;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.permitseoul.permitserver.domain.sitemapimage.api.service;

import com.permitseoul.permitserver.domain.event.core.component.EventRetriever;
import com.permitseoul.permitserver.domain.event.core.domain.Event;
import com.permitseoul.permitserver.domain.event.core.exception.EventNotfoundException;
import com.permitseoul.permitserver.domain.sitemapimage.api.dto.res.EventSiteMapGetResponse;
import com.permitseoul.permitserver.domain.sitemapimage.api.exception.SiteMapImageApiException;
import com.permitseoul.permitserver.domain.sitemapimage.core.component.SiteMapImageRetriever;
import com.permitseoul.permitserver.domain.sitemapimage.core.domain.EventSiteMapImage;
import com.permitseoul.permitserver.global.response.code.ErrorCode;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;

import java.util.Comparator;
import java.util.List;

@Service
@RequiredArgsConstructor
public class EventSiteMapImageService {
private final SiteMapImageRetriever siteMapImageRetriever;
private final EventRetriever eventRetriever;

@Transactional(readOnly = true)
public EventSiteMapGetResponse getEventSiteMapImages(final long eventId) {
try {
final Event event = eventRetriever.findEventById(eventId);
final List<EventSiteMapImage> eventSiteMapImages = siteMapImageRetriever.findAllEventSiteMapImagesByEventId(event.getEventId());
if (ObjectUtils.isEmpty(eventSiteMapImages)) {
throw new SiteMapImageApiException(ErrorCode.NOT_FOUND_SITE_MAP_IMAGE);
}

final List<EventSiteMapGetResponse.EventSiteMapImageInfo> siteMapImages = eventSiteMapImages.stream()
.sorted(Comparator.comparingInt(EventSiteMapImage::getSequence))
.map(eventSiteMapImage -> EventSiteMapGetResponse.EventSiteMapImageInfo.of(eventSiteMapImage.getSitemapImageUrl()))
.toList();

return EventSiteMapGetResponse.of(siteMapImages);
} catch (EventNotfoundException e) {
throw new SiteMapImageApiException(ErrorCode.NOT_FOUND_EVENT);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.permitseoul.permitserver.domain.sitemapimage.core.component;

import com.permitseoul.permitserver.domain.sitemapimage.core.repository.EventSiteMapImageRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class SiteMapImageRemover {
private final EventSiteMapImageRepository eventSiteMapImageRepository;

public void deleteAllSiteMapImages(final long eventId) {
eventSiteMapImageRepository.deleteAllByEventId(eventId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.permitseoul.permitserver.domain.sitemapimage.core.component;

import com.permitseoul.permitserver.domain.sitemapimage.core.domain.EventSiteMapImage;
import com.permitseoul.permitserver.domain.sitemapimage.core.domain.entity.EventSiteMapImageEntity;
import com.permitseoul.permitserver.domain.sitemapimage.core.repository.EventSiteMapImageRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Optional;

@Component
@RequiredArgsConstructor
public class SiteMapImageRetriever {
private final EventSiteMapImageRepository eventSiteMapImageRepository;

public List<EventSiteMapImage> findAllEventSiteMapImagesByEventId(final long eventId) {
final List<EventSiteMapImageEntity> siteMapImageEntities = Optional.ofNullable(
eventSiteMapImageRepository.findAllByEventId(eventId))
.orElseGet(List::of);

return siteMapImageEntities.stream()
.map(EventSiteMapImage::fromEntity)
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.permitseoul.permitserver.domain.sitemapimage.core.component;

import com.permitseoul.permitserver.domain.sitemapimage.core.domain.entity.EventSiteMapImageEntity;
import com.permitseoul.permitserver.domain.sitemapimage.core.repository.EventSiteMapImageRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@RequiredArgsConstructor
public class SiteMapImageSaver {
private final EventSiteMapImageRepository eventSiteMapImageRepository;

public void saveSiteMapImages(final List<EventSiteMapImageEntity> eventSiteMapImageEntities) {
eventSiteMapImageRepository.saveAll(eventSiteMapImageEntities);
}
}
Loading