Skip to content
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 @@ -17,7 +17,6 @@ public class TimetableBlock {
private final LocalDateTime endAt;
private final String blockName;
private final String artist;
private final String imageUrl;
private final String information;
private final String blockInfoRedirectUrl;

Expand All @@ -31,7 +30,6 @@ public static TimetableBlock fromEntity(final TimetableBlockEntity timetableBloc
timetableBlockEntity.getEndAt(),
timetableBlockEntity.getBlockName(),
timetableBlockEntity.getArtist(),
timetableBlockEntity.getImageUrl(),
timetableBlockEntity.getInformation(),
timetableBlockEntity.getBlockInfoRedirectUrl()
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,6 @@ public class TimetableBlockEntity {
@Column(name = "artist")
private String artist;

@Column(name = "image_url")
private String imageUrl;

@Column(name = "information", nullable = false)
private String information;

Expand All @@ -58,7 +55,6 @@ private TimetableBlockEntity(
LocalDateTime endAt,
String blockName,
String artist,
String imageUrl,
String information,
String blockInfoRedirectUrl
) {
Expand All @@ -71,7 +67,6 @@ private TimetableBlockEntity(
this.endAt = endAt;
this.blockName = blockName;
this.artist = artist;
this.imageUrl = imageUrl;
this.information = information;
this.blockInfoRedirectUrl = blockInfoRedirectUrl;
}
Expand All @@ -83,10 +78,9 @@ public static TimetableBlockEntity create(final long timetableId,
final LocalDateTime endAt,
final String blockName,
final String artist,
final String imageUrl,
final String information,
final String blockInfoRedirectUrl) {
return new TimetableBlockEntity(timetableId, timetableCategoryId, timetableAreaId, startAt, endAt, blockName, artist, imageUrl, information, blockInfoRedirectUrl);
return new TimetableBlockEntity(timetableId, timetableCategoryId, timetableAreaId, startAt, endAt, blockName, artist, information, blockInfoRedirectUrl);
}

private void validateDateTime(final LocalDateTime startAt, final LocalDateTime endAt) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.permitseoul.permitserver.domain.eventtimetable.blockmedia.component;

import com.permitseoul.permitserver.domain.eventtimetable.blockmedia.domain.TimetableBlockMedia;
import com.permitseoul.permitserver.domain.eventtimetable.blockmedia.repository.TimetableBlockMediaRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@RequiredArgsConstructor
public class TimetableBlockMediaRetriever {
private final TimetableBlockMediaRepository mediaRepository;

public List<TimetableBlockMedia> getAllTimetableBlockMediaByBlockId(final long blockId) {
return mediaRepository.findAllByTimetableBlockId(blockId).stream().map(TimetableBlockMedia::fromEntity).toList();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.permitseoul.permitserver.domain.eventtimetable.blockmedia.domain;

import com.permitseoul.permitserver.domain.eventtimetable.blockmedia.domain.entity.TimetableBlockMediaEntity;
import lombok.Getter;
import lombok.RequiredArgsConstructor;


@Getter
@RequiredArgsConstructor
public class TimetableBlockMedia {
private final Long timetableBlockMediaId;
private final long timetableBlockId;
private final int sequence;
private final String mediaUrl;

public static TimetableBlockMedia fromEntity(final TimetableBlockMediaEntity timetableBlockMediaEntity) {
return new TimetableBlockMedia(
timetableBlockMediaEntity.getTimetableBlockMediaId(),
timetableBlockMediaEntity.getTimetableBlockId(),
timetableBlockMediaEntity.getSequence(),
timetableBlockMediaEntity.getMediaUrl()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.permitseoul.permitserver.domain.eventtimetable.blockmedia.domain.entity;

import jakarta.persistence.*;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Positive;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "event_timetable_block_media")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class TimetableBlockMediaEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "timetable_block_media_id", nullable = false)
private Long timetableBlockMediaId;

@Column(name = "timetable_block_id", nullable = false)
@Positive(message = "timetableBlockId는 1이상이어야합니다.")
private long timetableBlockId;

@Column(name = "sequence", nullable = false)
@Min(value = 0, message = "timetable_block_media의 sequence는 0이상이어야합니다.")
private int sequence;

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

private TimetableBlockMediaEntity(long timetableBlockId, int sequence, String mediaUrl) {
this.timetableBlockId = timetableBlockId;
this.sequence = sequence;
this.mediaUrl = mediaUrl;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.permitseoul.permitserver.domain.eventtimetable.blockmedia.repository;

import com.permitseoul.permitserver.domain.eventtimetable.blockmedia.domain.entity.TimetableBlockMediaEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface TimetableBlockMediaRepository extends JpaRepository<TimetableBlockMediaEntity, Long> {

List<TimetableBlockMediaEntity> findAllByTimetableBlockId(final long timetableBlockId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;

import java.time.LocalDateTime;
import java.util.List;

public record TimetableDetailResponse(
String blockName,
Expand All @@ -11,34 +12,43 @@ public record TimetableDetailResponse(
boolean isLiked,
String information,
String area,
String imageUrl,
String blockInfoUrl,
@JsonFormat(pattern = "yyyy.MM.dd HH:mm")
LocalDateTime startDate,
@JsonFormat(pattern = "yyyy.MM.dd HH:mm")
LocalDateTime endDate
LocalDateTime endDate,
List<MediaInfo> media

) {
public static TimetableDetailResponse of(final String blockName,
final String blockCategory,
final String categoryColor,
final boolean isLiked,
final String information,
final String area,
final String imageUrl,
final String blockInfoRedirectUrl,
final LocalDateTime startDate,
final LocalDateTime endDate) {
final LocalDateTime endDate,
final List<MediaInfo> mediaInfo) {
return new TimetableDetailResponse(
blockName,
blockCategory,
categoryColor,
isLiked,
information,
area,
imageUrl,
blockInfoRedirectUrl,
startDate,
endDate
endDate,
mediaInfo
);
}

public record MediaInfo(
String mediaUrl
) {
public static MediaInfo of(final String mediaUrl) {
return new MediaInfo(mediaUrl);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import com.permitseoul.permitserver.domain.eventtimetable.block.core.component.TimetableBlockRetriever;
import com.permitseoul.permitserver.domain.eventtimetable.block.core.domain.TimetableBlock;
import com.permitseoul.permitserver.domain.eventtimetable.block.core.exception.TimetableBlockNotfoundException;
import com.permitseoul.permitserver.domain.eventtimetable.blockmedia.component.TimetableBlockMediaRetriever;
import com.permitseoul.permitserver.domain.eventtimetable.blockmedia.domain.TimetableBlockMedia;
import com.permitseoul.permitserver.domain.eventtimetable.category.core.component.TimetableCategoryRetriever;
import com.permitseoul.permitserver.domain.eventtimetable.category.core.domain.TimetableCategory;
import com.permitseoul.permitserver.domain.eventtimetable.category.core.exception.TimetableCategoryNotfoundException;
Expand Down Expand Up @@ -36,10 +38,12 @@ public class TimetableService {
private final TimetableAreaRetriever timetableAreaRetriever;
private final TimetableCategoryRetriever timetableCategoryRetriever;
private final TimetableBlockRetriever timetableBlockRetriever;
private final TimetableBlockMediaRetriever timetableBlockMediaRetriever;
private final TimetableUserLikeRetriever timetableUserLikeRetriever;
private final EventRetriever eventRetriever;
private final SecureUrlUtil secureUrlUtil;


@Transactional(readOnly = true)
public TimetableResponse getEventTimetable(final long eventId, final Long userId) {
final Event event;
Expand Down Expand Up @@ -93,8 +97,10 @@ public TimetableDetailResponse getEventTimetableDetail(final long blockId, final
final TimetableBlock timetableBlock;
final TimetableCategory timetableCategory;
final TimetableArea timetableArea;
final List<TimetableBlockMedia> timetableBlockMediaList;
try {
timetableBlock = timetableBlockRetriever.findTimetableBlockById(blockId);
timetableBlockMediaList = timetableBlockMediaRetriever.getAllTimetableBlockMediaByBlockId(timetableBlock.getTimetableBlockId());
timetableCategory = timetableCategoryRetriever.findTimetableCategoryById(timetableBlock.getTimetableCategoryId());
timetableArea = timetableAreaRetriever.findTimetableAreaById(timetableBlock.getTimetableAreaId());
} catch (TimetableBlockNotfoundException e) {
Expand All @@ -105,12 +111,8 @@ public TimetableDetailResponse getEventTimetableDetail(final long blockId, final
throw new NotfoundTimetableException(ErrorCode.NOT_FOUND_TIMETABLE_AREA);
}

final boolean isUserLiked;
if (userId == null) {
isUserLiked = false;
} else {
isUserLiked = timetableUserLikeRetriever.isExistUserLikeByUserIdAndBlockId(userId, timetableBlock.getTimetableBlockId());
}
final List<TimetableDetailResponse.MediaInfo> mediaInfos = sortTimetableBlockMedia(timetableBlockMediaList);
final boolean isUserLiked = getUserLiked(userId, timetableBlock.getTimetableBlockId());

return TimetableDetailResponse.of(
timetableBlock.getBlockName(),
Expand All @@ -119,13 +121,28 @@ public TimetableDetailResponse getEventTimetableDetail(final long blockId, final
isUserLiked,
timetableBlock.getInformation(),
timetableArea.getAreaName(),
timetableBlock.getImageUrl(),
timetableBlock.getBlockInfoRedirectUrl(),
timetableBlock.getStartAt(),
timetableBlock.getEndAt()
timetableBlock.getEndAt(),
mediaInfos
);
}

private boolean getUserLiked(final Long userId, final long timetableBlockId) {
if (userId == null) {
return false;
} else {
return timetableUserLikeRetriever.isExistUserLikeByUserIdAndBlockId(userId, timetableBlockId);
}
}

private List<TimetableDetailResponse.MediaInfo> sortTimetableBlockMedia(final List<TimetableBlockMedia> timetableBlockMediaList) {
return timetableBlockMediaList.stream()
.sorted(Comparator.comparingInt(TimetableBlockMedia::getSequence))
.map(media -> TimetableDetailResponse.MediaInfo.of(media.getMediaUrl()))
.toList();
}

private Map<Long, String> mapCategoryColors(final List<TimetableCategory> categoryList) {
return categoryList.stream()
.collect(Collectors.toMap(
Expand Down