Skip to content

Commit

Permalink
feat: 행사 다건 조회 시 S3에 저장된 이미지를 조회하도록 수정 및 행사 도메인의 imageUrl 컬럼 제거
Browse files Browse the repository at this point in the history
  • Loading branch information
amaran-th committed Sep 28, 2023
1 parent 9a9e042 commit e1f465d
Show file tree
Hide file tree
Showing 10 changed files with 170 additions and 88 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -104,10 +107,11 @@ public List<EventResponse> findEvents(final EventType category,
spec = spec.and(EventSpecification.filterByPeriod(startDateTime, endDateTime));
}
final List<Event> events = eventRepository.findAll(spec);

final EnumMap<EventStatus, List<Event>> eventsForEventStatus
= groupByEventStatus(nowDate, events);

return filterByStatuses(statuses, eventsForEventStatus);
return filterByStatuses(statuses, eventsForEventStatus, makeImageUrlPerEventId(events));
}

private boolean isExistTagNames(final List<String> tagNames) {
Expand Down Expand Up @@ -154,6 +158,19 @@ private void validateEndDateAfterDateStart(final LocalDateTime startDate,
}
}

// TODO: 2023/09/27 코드 중복 제거(ScrapService)
private Map<Long, String> makeImageUrlPerEventId(final List<Event> events) {
final List<Long> scrappedEventIds = events.stream()
.map(Event::getId)
.collect(Collectors.toList());
final List<Image> images = imageRepository.findAllThumbnailByEventIdIn(scrappedEventIds);
Map<Long, String> imageUrlPerEventId = new HashMap<>();
for (Image image : images) {
imageUrlPerEventId.put(image.getContentId(), image.getName());
}
return imageUrlPerEventId;
}

private EnumMap<EventStatus, List<Event>> groupByEventStatus(final LocalDate nowDate,
final List<Event> events) {
return events.stream()
Expand All @@ -166,12 +183,13 @@ private EnumMap<EventStatus, List<Event>> groupByEventStatus(final LocalDate now

private List<EventResponse> filterByStatuses(
final List<EventStatus> statuses,
final EnumMap<EventStatus, List<Event>> eventsForEventStatus
final EnumMap<EventStatus, List<Event>> eventsForEventStatus,
final Map<Long, String> imageUrlPerEventId
) {
if (isExistStatusName(statuses)) {
return filterEventResponseByStatuses(statuses, eventsForEventStatus);
return filterEventResponseByStatuses(statuses, eventsForEventStatus, imageUrlPerEventId);
}
return EventResponse.mergeEventResponses(eventsForEventStatus);
return EventResponse.mergeEventResponses(eventsForEventStatus, imageUrlPerEventId);
}

private boolean isExistStatusName(final List<EventStatus> statuses) {
Expand All @@ -180,12 +198,14 @@ private boolean isExistStatusName(final List<EventStatus> statuses) {

private List<EventResponse> filterEventResponseByStatuses(
final List<EventStatus> statuses,
final EnumMap<EventStatus, List<Event>> eventsForEventStatus
final EnumMap<EventStatus, List<Event>> eventsForEventStatus,
final Map<Long, String> imageUrlPerEventId
) {
return eventsForEventStatus.entrySet()
.stream()
.filter(entry -> statuses.contains(entry.getKey()))
.map(entry -> EventResponse.makeEventResponsesByStatus(entry.getValue()))
.map(
entry -> EventResponse.makeEventResponsesByStatus(entry.getValue(), imageUrlPerEventId))
.reduce(new ArrayList<>(), (combinedEvents, eventsToAdd) -> {
combinedEvents.addAll(eventsToAdd);
return combinedEvents;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ public Event toEvent() {
applyEndDateTime,
informationUrl,
type,
imageUrl,
paymentType,
eventMode,
organization
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.emmsale.event.application.dto;

import static java.util.stream.Collectors.toList;

import com.emmsale.event.domain.Event;
import com.emmsale.event.domain.EventStatus;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
Expand All @@ -35,24 +34,26 @@ public class EventResponse {
private final String eventMode;
private final String paymentType;

public static List<EventResponse> makeEventResponsesByStatus(final List<Event> events) {
public static List<EventResponse> makeEventResponsesByStatus(final List<Event> events,
final Map<Long, String> imageUrlPerEventId) {
return events.stream()
.map(EventResponse::from)
.collect(toList());
.map(event -> EventResponse.from(event, imageUrlPerEventId.get(event.getId())))
.collect(Collectors.toList());
}

public static List<EventResponse> mergeEventResponses(
final Map<EventStatus, List<Event>> groupByEventStatus
final Map<EventStatus, List<Event>> groupByEventStatus,
final Map<Long, String> imageUrlPerEventId
) {
return groupByEventStatus.values().stream()
.map(EventResponse::makeEventResponsesByStatus)
.map(events -> makeEventResponsesByStatus(events, imageUrlPerEventId))
.reduce(new ArrayList<>(), (combinedEvents, eventsToAdd) -> {
combinedEvents.addAll(eventsToAdd);
return combinedEvents;
});
}

private static EventResponse from(final Event event) {
private static EventResponse from(final Event event, final String imageUrl) {
return new EventResponse(
event.getId(),
event.getName(),
Expand All @@ -61,7 +62,7 @@ private static EventResponse from(final Event event) {
event.getEventPeriod().getApplyStartDate(),
event.getEventPeriod().getApplyEndDate(),
event.extractTags(),
event.getImageUrl(),
imageUrl,
event.getEventMode().getValue(),
event.getPaymentType().getValue()
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,6 @@ public class Event extends BaseEntity {
@Column(nullable = false)
private EventMode eventMode;

private String imageUrl;

@Column(nullable = false)
private String organization;

Expand All @@ -78,7 +76,6 @@ public Event(
final LocalDateTime applyEndDate,
final String informationUrl,
final EventType eventType,
final String imageUrl,
final PaymentType paymentType,
final EventMode eventMode,
final String organization
Expand All @@ -88,7 +85,6 @@ public Event(
this.eventPeriod = new EventPeriod(startDate, endDate, applyStartDate, applyEndDate);
this.informationUrl = informationUrl;
this.type = eventType;
this.imageUrl = imageUrl;
this.paymentType = paymentType;
this.eventMode = eventMode;
this.organization = organization;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,16 @@
import com.emmsale.event.application.dto.EventResponse;
import com.emmsale.event.domain.Event;
import com.emmsale.event.domain.EventStatus;
import com.emmsale.image.domain.Image;
import com.emmsale.image.domain.repository.ImageRepository;
import com.emmsale.member.domain.Member;
import com.emmsale.scrap.domain.Scrap;
import com.emmsale.scrap.domain.ScrapRepository;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -21,14 +25,31 @@
public class ScrapQueryService {

private final ScrapRepository scrapRepository;
private final ImageRepository imageRepository;

public List<EventResponse> findAllScraps(final Member member) {
//TODO : Scrap에서 event 사용해서 N+1 발생
final Map<EventStatus, List<Event>> eventGroupByStatus
= scrapRepository.findAllByMemberId(member.getId())
final List<Event> scrappedEvents = scrapRepository.findAllByMemberId(member.getId())
.stream()
.map(Scrap::getEvent)
.collect(Collectors.toList());

final Map<EventStatus, List<Event>> eventGroupByStatus = scrappedEvents.stream()
.collect(groupingBy(event -> event.getEventPeriod().calculateEventStatus(LocalDate.now())));
return EventResponse.mergeEventResponses(eventGroupByStatus);

return EventResponse.mergeEventResponses(eventGroupByStatus,
makeImageUrlPerEventId(scrappedEvents));
}

private Map<Long, String> makeImageUrlPerEventId(final List<Event> events) {
final List<Long> scrappedEventIds = events.stream()
.map(Event::getId)
.collect(Collectors.toList());
final List<Image> images = imageRepository.findAllThumbnailByEventIdIn(scrappedEventIds);
Map<Long, String> imageUrlPerEventId = new HashMap<>();
for (Image image : images) {
imageUrlPerEventId.put(image.getContentId(), image.getName());
}
return imageUrlPerEventId;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ void init() {
afterDateTime,
"url",
EventType.CONFERENCE,
"https://image.com",
PaymentType.FREE_PAID,
EventMode.ON_OFFLINE,
"행사기간"
Expand Down Expand Up @@ -194,11 +193,11 @@ void test_modify_canNotModifyDeletedComment() throws Exception {
final CommentModifyRequest request = new CommentModifyRequest("변경된 내용");
comment.delete();

final Comment deletedComment = commentRepository.save(comment);
final Long deletedCommentId = commentRepository.save(comment).getId();

//when & then
Assertions.assertThatThrownBy(
() -> commentCommandService.modify(deletedComment.getId(), 댓글_작성자, request))
() -> commentCommandService.modify(deletedCommentId, 댓글_작성자, request))
.isInstanceOf(CommentException.class)
.hasMessage(CommentExceptionType.FORBIDDEN_MODIFY_DELETED_COMMENT.errorMessage());
}
Expand Down
38 changes: 7 additions & 31 deletions backend/emm-sale/src/test/java/com/emmsale/event/EventFixture.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ public static Event eventFixture() {
LocalDateTime.of(2023, 8, 15, 15, 0),
"http://infcon.com",
EventType.CONFERENCE,
"https://image.url",
PaymentType.PAID,
EventMode.OFFLINE,
"인프런"
Expand All @@ -32,78 +31,55 @@ public static Event eventFixture() {
return new Event("인프콘 2023", "코엑스", LocalDateTime.parse("2023-06-01T12:00:00"),
LocalDateTime.parse("2023-09-01T12:00:00"), LocalDateTime.parse("2023-05-01T12:00:00"),
LocalDateTime.parse("2023-06-01T12:00:00"), "https://~~~", EventType.CONFERENCE,
"https://image.url",
PaymentType.FREE_PAID,
EventMode.ON_OFFLINE,
"인프런"
PaymentType.FREE_PAID, EventMode.ON_OFFLINE, "인프런"
);
}

public static Event AI_컨퍼런스() {
return new Event("AI 컨퍼런스", "코엑스", LocalDateTime.parse("2023-07-22T12:00:00"),
LocalDateTime.parse("2023-07-30T12:00:00"), LocalDateTime.parse("2023-07-01T12:00:00"),
LocalDateTime.parse("2023-07-22T12:00:00"), "https://~~~", EventType.CONFERENCE,
"https://image.url",
PaymentType.FREE_PAID,
EventMode.ON_OFFLINE,
"행사기관"
PaymentType.FREE_PAID, EventMode.ON_OFFLINE, "행사기관"
);
}

public static Event 모바일_컨퍼런스() {
return new Event("모바일 컨퍼런스", "코엑스", LocalDateTime.parse("2023-08-03T12:00:00"),
LocalDateTime.parse("2023-09-03T12:00:00"), LocalDateTime.parse("2023-08-01T12:00:00"),
LocalDateTime.parse("2023-08-02T12:00:00"), "https://~~~", EventType.CONFERENCE,
"https://image.url",
PaymentType.FREE_PAID,
EventMode.ON_OFFLINE,
"행사기관"
PaymentType.FREE_PAID, EventMode.ON_OFFLINE, "행사기관"
);
}

public static Event 안드로이드_컨퍼런스() {
return new Event("안드로이드 컨퍼런스", "코엑스", LocalDateTime.parse("2023-06-29T12:00:00"),
LocalDateTime.parse("2023-07-16T12:00:00"), LocalDateTime.parse("2023-06-01T12:00:00"),
LocalDateTime.parse("2023-06-20T12:00:00"), "https://~~~", EventType.CONFERENCE,
"https://image.url",
PaymentType.FREE_PAID,
EventMode.ON_OFFLINE,
"행사기관"
PaymentType.FREE_PAID, EventMode.ON_OFFLINE, "행사기관"
);
}

public static Event_컨퍼런스() {
return new Event("웹 컨퍼런스", "코엑스", LocalDateTime.parse("2023-07-03T12:00:00"),
LocalDateTime.parse("2023-08-03T12:00:00"), LocalDateTime.parse("2023-07-03T12:00:00"),
LocalDateTime.parse("2023-08-03T12:00:00"), "https://~~~", EventType.CONFERENCE,
"https://image.url",
PaymentType.FREE_PAID,
EventMode.ON_OFFLINE,
"행사기관"
PaymentType.FREE_PAID, EventMode.ON_OFFLINE, "행사기관"
);
}

public static Event AI_아이디어_공모전() {
return new Event("AI 아이디어 공모전", "코엑스", LocalDateTime.parse("2023-06-29T12:00:00"),
LocalDateTime.parse("2023-07-16T12:00:00"), LocalDateTime.parse("2023-06-01T12:00:00"),
LocalDateTime.parse("2023-07-16T12:00:00"), "https://~~~",
EventType.COMPETITION,
"https://image.url",
PaymentType.FREE_PAID,
EventMode.ON_OFFLINE,
"행사기관"
EventType.COMPETITION, PaymentType.FREE_PAID, EventMode.ON_OFFLINE, "행사기관"
);
}

public static Event 구름톤() {
return new Event("구름톤", "코엑스", LocalDateTime.parse("2023-07-03T12:00:00"),
LocalDateTime.parse("2023-08-03T12:00:00"), LocalDateTime.parse("2023-07-03T12:00:00"),
LocalDateTime.parse("2023-08-03T12:00:00"), "https://~~~",
EventType.COMPETITION,
"https://image.url",
PaymentType.FREE_PAID,
EventMode.ON_OFFLINE,
"행사기관"
EventType.COMPETITION, PaymentType.FREE_PAID, EventMode.ON_OFFLINE, "행사기관"
);
}

Expand Down
Loading

0 comments on commit e1f465d

Please sign in to comment.