diff --git a/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/req/AdminEventUpdateRequest.java b/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/req/AdminEventUpdateRequest.java index f8fe55e8..8be97122 100644 --- a/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/req/AdminEventUpdateRequest.java +++ b/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/req/AdminEventUpdateRequest.java @@ -51,6 +51,9 @@ public record AdminEventUpdateRequest( List images, @Min(value = 0, message = "최소 나이는 0 이상이어야 합니다.") - Integer minAge + Integer minAge, + + @Valid + List siteMapImages ) { } diff --git a/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/req/AdminEventWithTicketCreateRequest.java b/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/req/AdminEventWithTicketCreateRequest.java index 7c3b08ca..b1926792 100644 --- a/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/req/AdminEventWithTicketCreateRequest.java +++ b/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/req/AdminEventWithTicketCreateRequest.java @@ -87,7 +87,10 @@ public record AdminEventWithTicketCreateRequest( @NotEmpty(message = "티켓 정보는 최소 1개 이상이어야 합니다.") @Valid - List ticketTypes + List ticketTypes, + + @Valid + List siteMapImages ) { public record TicketTypeRequest( @NotBlank(message = "티켓 이름은 필수입니다.") diff --git a/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/res/AdminEventDetailResponse.java b/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/res/AdminEventDetailResponse.java index 6e199e78..37267e2a 100644 --- a/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/res/AdminEventDetailResponse.java +++ b/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/dto/res/AdminEventDetailResponse.java @@ -21,7 +21,8 @@ public record AdminEventDetailResponse( String lineup, String details, List images, - int minAge + int minAge, + List siteMapImages ) { public static AdminEventDetailResponse of(final long eventId, @@ -40,7 +41,8 @@ public static AdminEventDetailResponse of(final long eventId, final String lineup, final String details, final List images, - final int minAge) { + final int minAge, + final List siteMapImages) { return new AdminEventDetailResponse( eventId, eventExposureStartDate, @@ -58,7 +60,8 @@ public static AdminEventDetailResponse of(final long eventId, lineup, details, images, - minAge + minAge, + siteMapImages ); } diff --git a/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/service/AdminEventService.java b/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/service/AdminEventService.java index 68b20171..f484f225 100644 --- a/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/service/AdminEventService.java +++ b/src/main/java/com/permitseoul/permitserver/domain/admin/event/api/service/AdminEventService.java @@ -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; @@ -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 getEvents() { @@ -89,6 +97,13 @@ public AdminEventDetailResponse getEventDetail(final long eventId) { .map(eventImage -> AdminEventDetailResponse.AdminEventImageInfo.of(eventImage.getImageUrl())) .toList(); + final List siteMapImages = siteMapImageRetriever.findAllEventSiteMapImagesByEventId(event.getEventId()); + + final List 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()), @@ -106,7 +121,8 @@ public AdminEventDetailResponse getEventDetail(final long eventId) { event.getLineUp(), event.getDetails(), adminEventImageInfos, - event.getMinAge() + event.getMinAge(), + eventSiteMapImages ); } catch(AdminEventNotFoundException e) { @@ -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 savedTicketTypes; try { @@ -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); @@ -177,11 +197,34 @@ public void updateEvent(final AdminEventUpdateRequest updateRequest) { } } + private void updateEventSiteMapImages(final long eventId, final List eventSiteMapImages) { + if (eventSiteMapImages == null || eventSiteMapImages.isEmpty()) { + return; + } + siteMapImageRemover.deleteAllSiteMapImages(eventId); + saveEventSiteMapImages(eventId, eventSiteMapImages); + } + private void updateEventImages(final long eventId, final List 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 eventSiteMapImages) { + if(eventSiteMapImages == null || eventSiteMapImages.isEmpty()) { + return; + } + final List 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 eventImages) { diff --git a/src/main/java/com/permitseoul/permitserver/domain/event/api/service/EventService.java b/src/main/java/com/permitseoul/permitserver/domain/event/api/service/EventService.java index f34d3276..519fc191 100644 --- a/src/main/java/com/permitseoul/permitserver/domain/event/api/service/EventService.java +++ b/src/main/java/com/permitseoul/permitserver/domain/event/api/service/EventService.java @@ -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; @@ -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 @@ -53,6 +55,7 @@ public EventDetailResponse getEventDetail(final long eventId) { final List eventImageList = eventImageRetriever.findAllEventImagesByEventId(event.getEventId()); final List imagesInfo = eventImageList.stream() + .sorted(Comparator.comparingInt(EventImage::getSequence)) .map(eventImage -> EventDetailResponse.EventImageInfo.of(eventImage.getImageUrl(), eventImage.getSequence())) .toList(); diff --git a/src/main/java/com/permitseoul/permitserver/domain/eventimage/core/domain/entity/EventImageEntity.java b/src/main/java/com/permitseoul/permitserver/domain/eventimage/core/domain/entity/EventImageEntity.java index abe09e06..67178f1c 100644 --- a/src/main/java/com/permitseoul/permitserver/domain/eventimage/core/domain/entity/EventImageEntity.java +++ b/src/main/java/com/permitseoul/permitserver/domain/eventimage/core/domain/entity/EventImageEntity.java @@ -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) diff --git a/src/main/java/com/permitseoul/permitserver/domain/eventtimetable/blockmedia/domain/entity/TimetableBlockMediaEntity.java b/src/main/java/com/permitseoul/permitserver/domain/eventtimetable/blockmedia/domain/entity/TimetableBlockMediaEntity.java index 91f7f84a..379f5de6 100644 --- a/src/main/java/com/permitseoul/permitserver/domain/eventtimetable/blockmedia/domain/entity/TimetableBlockMediaEntity.java +++ b/src/main/java/com/permitseoul/permitserver/domain/eventtimetable/blockmedia/domain/entity/TimetableBlockMediaEntity.java @@ -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) { diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/SiteMapImageBaseException.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/SiteMapImageBaseException.java new file mode 100644 index 00000000..bbff833d --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/SiteMapImageBaseException.java @@ -0,0 +1,4 @@ +package com.permitseoul.permitserver.domain.sitemapimage; + +public abstract class SiteMapImageBaseException extends RuntimeException { +} diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/EventSiteMapExceptionHandler.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/EventSiteMapExceptionHandler.java new file mode 100644 index 00000000..6c4c9911 --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/EventSiteMapExceptionHandler.java @@ -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> handleSiteMapImageApiException(final SiteMapImageApiException e) { + return ApiResponseUtil.failure(e.getErrorCode()); + } +} diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/controller/EventSiteMapImageController.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/controller/EventSiteMapImageController.java new file mode 100644 index 00000000..207c052c --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/controller/EventSiteMapImageController.java @@ -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> getEventSitemapImages ( + @EventIdPathVariable final Long eventId + ) { + return ApiResponseUtil.success(SuccessCode.OK, eventSiteMapImageService.getEventSiteMapImages(eventId)); + } +} diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/dto/res/EventSiteMapGetResponse.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/dto/res/EventSiteMapGetResponse.java new file mode 100644 index 00000000..f0c1a71c --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/dto/res/EventSiteMapGetResponse.java @@ -0,0 +1,20 @@ +package com.permitseoul.permitserver.domain.sitemapimage.api.dto.res; + + +import java.util.List; + +public record EventSiteMapGetResponse( + List siteMapImages +) { + public static EventSiteMapGetResponse of(List images) { + return new EventSiteMapGetResponse(images); + } + + public record EventSiteMapImageInfo( + String imageUrl + ) { + public static EventSiteMapImageInfo of(final String imageUrl) { + return new EventSiteMapImageInfo(imageUrl); + } + } +} diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/exception/SiteMapImageApiException.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/exception/SiteMapImageApiException.java new file mode 100644 index 00000000..674f7667 --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/exception/SiteMapImageApiException.java @@ -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; + +} diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/service/EventSiteMapImageService.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/service/EventSiteMapImageService.java new file mode 100644 index 00000000..91cb5372 --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/api/service/EventSiteMapImageService.java @@ -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 eventSiteMapImages = siteMapImageRetriever.findAllEventSiteMapImagesByEventId(event.getEventId()); + if (ObjectUtils.isEmpty(eventSiteMapImages)) { + throw new SiteMapImageApiException(ErrorCode.NOT_FOUND_SITE_MAP_IMAGE); + } + + final List 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); + } + } +} diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/component/SiteMapImageRemover.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/component/SiteMapImageRemover.java new file mode 100644 index 00000000..28f36b6b --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/component/SiteMapImageRemover.java @@ -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); + } +} diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/component/SiteMapImageRetriever.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/component/SiteMapImageRetriever.java new file mode 100644 index 00000000..a7122175 --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/component/SiteMapImageRetriever.java @@ -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 findAllEventSiteMapImagesByEventId(final long eventId) { + final List siteMapImageEntities = Optional.ofNullable( + eventSiteMapImageRepository.findAllByEventId(eventId)) + .orElseGet(List::of); + + return siteMapImageEntities.stream() + .map(EventSiteMapImage::fromEntity) + .toList(); + } +} diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/component/SiteMapImageSaver.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/component/SiteMapImageSaver.java new file mode 100644 index 00000000..45513aef --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/component/SiteMapImageSaver.java @@ -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 eventSiteMapImageEntities) { + eventSiteMapImageRepository.saveAll(eventSiteMapImageEntities); + } +} diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/domain/EventSiteMapImage.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/domain/EventSiteMapImage.java new file mode 100644 index 00000000..71e4c37b --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/domain/EventSiteMapImage.java @@ -0,0 +1,25 @@ +package com.permitseoul.permitserver.domain.sitemapimage.core.domain; + + +import com.permitseoul.permitserver.domain.sitemapimage.core.domain.entity.EventSiteMapImageEntity; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class EventSiteMapImage { + + private final long siteMapImagesId; + private final int sequence; + private final String sitemapImageUrl; + private final long eventId; + + public static EventSiteMapImage fromEntity(final EventSiteMapImageEntity entity) { + return new EventSiteMapImage( + entity.getSiteMapImagesId(), + entity.getSequence(), + entity.getSitemapImageUrl(), + entity.getEventId() + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/domain/entity/EventSiteMapImageEntity.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/domain/entity/EventSiteMapImageEntity.java new file mode 100644 index 00000000..6903bf8c --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/domain/entity/EventSiteMapImageEntity.java @@ -0,0 +1,43 @@ +package com.permitseoul.permitserver.domain.sitemapimage.core.domain.entity; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + + +@Entity +@Getter +@Table(name = "event_sitemap_images") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class EventSiteMapImageEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "sitemap_images_id", nullable = false) + private Long siteMapImagesId; + + @Column(name = "sequence", nullable = false) + private int sequence; + + @Column(name = "sitemap_image_url", nullable = false, columnDefinition = "TEXT") + private String sitemapImageUrl; + + @Column(name = "event_id", nullable = false) + private long eventId; + + private EventSiteMapImageEntity(final String sitemapImageUrl, + final int sequence, + final long eventId + ) { + this.sequence = sequence; + this.sitemapImageUrl = sitemapImageUrl; + this.eventId = eventId; + } + + public static EventSiteMapImageEntity create(final String sitemapImageUrl, + final int sequence, + final long eventId) { + return new EventSiteMapImageEntity( sitemapImageUrl, sequence, eventId); + } +} diff --git a/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/repository/EventSiteMapImageRepository.java b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/repository/EventSiteMapImageRepository.java new file mode 100644 index 00000000..e6672534 --- /dev/null +++ b/src/main/java/com/permitseoul/permitserver/domain/sitemapimage/core/repository/EventSiteMapImageRepository.java @@ -0,0 +1,18 @@ +package com.permitseoul.permitserver.domain.sitemapimage.core.repository; + +import com.permitseoul.permitserver.domain.sitemapimage.core.domain.entity.EventSiteMapImageEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface EventSiteMapImageRepository extends JpaRepository { + + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query("delete from EventSiteMapImageEntity e where e.eventId = :eventId") + void deleteAllByEventId(@Param("eventId") long eventId); + + List findAllByEventId(final long eventId); +} diff --git a/src/main/java/com/permitseoul/permitserver/global/response/code/ErrorCode.java b/src/main/java/com/permitseoul/permitserver/global/response/code/ErrorCode.java index c12409af..72b36a35 100644 --- a/src/main/java/com/permitseoul/permitserver/global/response/code/ErrorCode.java +++ b/src/main/java/com/permitseoul/permitserver/global/response/code/ErrorCode.java @@ -87,6 +87,7 @@ public enum ErrorCode implements ApiCode { NOT_FOUND_NOTION_RELATION_ID(HttpStatus.NOT_FOUND, 40426, "Notion Relation Id를 찾을 수 없습니다."), NOT_FOUND_NOTION_DATABASE_SOURCE(HttpStatus.NOT_FOUND, 40427, "Notion 데이터베이스 소스를 찾을 수 없습니다."), NOT_FOUND_COUPON(HttpStatus.NOT_FOUND, 40428, "coupon을 찾을 수 없습니다."), + NOT_FOUND_SITE_MAP_IMAGE(HttpStatus.NOT_FOUND, 40429, "sitemap image를 찾을 수 없습니다."),