diff --git a/src/main/java/com/example/hobiday_backend/domain/feed/dto/FeedReq.java b/src/main/java/com/example/hobiday_backend/domain/feed/dto/FeedReq.java index 944cde0..da6cf22 100644 --- a/src/main/java/com/example/hobiday_backend/domain/feed/dto/FeedReq.java +++ b/src/main/java/com/example/hobiday_backend/domain/feed/dto/FeedReq.java @@ -19,9 +19,8 @@ public class FeedReq { @Schema(description = "피드 해시태그") private List hashTags; - @Schema(description = "공연 id") + @Schema(description = "공연 id (선택사항)", nullable = true) private String performId; - // 프로필 사진도 받아야 함 } diff --git a/src/main/java/com/example/hobiday_backend/domain/feed/entity/Feed.java b/src/main/java/com/example/hobiday_backend/domain/feed/entity/Feed.java index a1d7ad1..2b9a414 100644 --- a/src/main/java/com/example/hobiday_backend/domain/feed/entity/Feed.java +++ b/src/main/java/com/example/hobiday_backend/domain/feed/entity/Feed.java @@ -37,7 +37,7 @@ public class Feed extends TimeStamped { // 공연 @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "perform_id", nullable = false) + @JoinColumn(name = "perform_id", nullable = true) private Perform perform; // 피드 사진 diff --git a/src/main/java/com/example/hobiday_backend/domain/feed/service/FeedService.java b/src/main/java/com/example/hobiday_backend/domain/feed/service/FeedService.java index b67156b..115e4ac 100644 --- a/src/main/java/com/example/hobiday_backend/domain/feed/service/FeedService.java +++ b/src/main/java/com/example/hobiday_backend/domain/feed/service/FeedService.java @@ -44,8 +44,12 @@ public FeedRes createFeed(FeedReq feedReq, Long userId) { Profile profile = profileRepository.findByMemberId(userId) .orElseThrow(() -> new ProfileException(ProfileErrorCode.PROFILE_NOT_FOUND)); - Perform perform = performRepository.findByMt20id(feedReq.getPerformId()) - .orElseThrow(() -> new PerformException(PerformErrorCode.PERFORM_NOT_FOUND)); + // 공연 정보가 있을 경우 처리 + Perform perform = null; + if (feedReq.getPerformId() != null) { + perform = performRepository.findByMt20id(feedReq.getPerformId()) + .orElseThrow(() -> new PerformException(PerformErrorCode.PERFORM_NOT_FOUND)); + } // 2. Feed 생성 Feed feed = Feed.builder() @@ -122,16 +126,17 @@ public FeedRes createFeed(FeedReq feedReq, Long userId) { .commentCount(savedFeed.getCommentList().size()) .isLiked(false) .relativeTime(getRelativeTime(savedFeed.getCreatedTime())) // 상대 시간 추가 - .performName(perform.getPrfnm()) - .startDate(perform.getPrfpdfrom()) - .endDate(perform.getPrfpdto()) - .genreName(perform.getGenrenm()) - .performState(perform.getPrfstate()) - .placeName(perform.getFcltynm()) - .openRun(perform.getOpenrun()) - .area(perform.getArea()) - .poster(perform.getPoster()) - .performLikeCount(perform.getWishCount()) + .performId(perform != null ? perform.getMt20id() : null) + .performName(perform != null ? perform.getPrfnm() : null) + .startDate(perform != null ? perform.getPrfpdfrom() : null) + .endDate(perform != null ? perform.getPrfpdto() : null) + .genreName(perform != null ? perform.getGenrenm() : null) + .performState(perform != null ? perform.getPrfstate() : null) + .placeName(perform != null ? perform.getFcltynm() : null) + .openRun(perform != null ? perform.getOpenrun() : null) + .area(perform != null ? perform.getArea() : null) + .poster(perform != null ? perform.getPoster() : null) + .performLikeCount(perform != null ? perform.getWishCount() : null) .build(); } @@ -140,9 +145,12 @@ public FeedRes updateFeed(FeedReq feedReq, Long memberId,Long feedId) { // 멤버 id로 프로필 찾기 Profile profile = profileRepository.findByMemberId(memberId) .orElseThrow(() -> new ProfileException(ProfileErrorCode.PROFILE_NOT_FOUND)); - // - Perform perform = performRepository.findByMt20id(feedReq.getPerformId()) - .orElseThrow(() -> new PerformException(PerformErrorCode.PERFORM_NOT_FOUND)); + + Perform perform = null; + if (feedReq.getPerformId() != null) { + perform = performRepository.findByMt20id(feedReq.getPerformId()) + .orElseThrow(() -> new PerformException(PerformErrorCode.PERFORM_NOT_FOUND)); + } // 2. 피드 조회 및 작성자 확인 Feed feed = feedRepository.findById(feedId) .orElseThrow(() -> new FeedException(FeedErrorCode.FEED_NOT_FOUND)); @@ -151,8 +159,22 @@ public FeedRes updateFeed(FeedReq feedReq, Long memberId,Long feedId) { throw new FeedException(FeedErrorCode.FEED_UPDATE_ACCESS_DENIED); } + List cdnFileUrls = new ArrayList<>(); + for (String s3url : feedReq.getFileUrls()) { + String[] urls = s3url.split("/"); + if (urls.length < 4) { + throw new FileUrlException(FileUrlErrorCode.WRONG_FILE_URL); + } + urls[2] = "cdn.hobiday.site"; + String cdnUrl = "https://"; + for (int i = 2; i < urls.length; i++) { + cdnUrl += urls[i] + "/"; + } + cdnFileUrls.add(cdnUrl.substring(0, cdnUrl.length() - 1)); + } + // 3. 피드 수정 - feed.update(feedReq.getContent(), feedReq.getTopic(), feedReq.getFileUrls(), feedReq.getHashTags()); + feed.update(feedReq.getContent(), feedReq.getTopic(), cdnFileUrls, feedReq.getHashTags()); // FeedRes 반환 (상대 시간 추가) return FeedRes.builder() @@ -171,17 +193,17 @@ public FeedRes updateFeed(FeedReq feedReq, Long memberId,Long feedId) { .commentCount(feed.getCommentList().size()) .isLiked(false) .relativeTime(getRelativeTime(feed.getCreatedTime())) // 상대 시간 추가 - .performId(perform.getMt20id()) - .performName(perform.getPrfnm()) - .startDate(perform.getPrfpdfrom()) - .endDate(perform.getPrfpdto()) - .genreName(perform.getGenrenm()) - .performState(perform.getPrfstate()) - .placeName(perform.getFcltynm()) - .openRun(perform.getOpenrun()) - .area(perform.getArea()) - .poster(perform.getPoster()) - .performLikeCount(perform.getWishCount()) + .performId(perform != null ? perform.getMt20id() : null) + .performName(perform != null ? perform.getPrfnm() : null) + .startDate(perform != null ? perform.getPrfpdfrom() : null) + .endDate(perform != null ? perform.getPrfpdto() : null) + .genreName(perform != null ? perform.getGenrenm() : null) + .performState(perform != null ? perform.getPrfstate() : null) + .placeName(perform != null ? perform.getFcltynm() : null) + .openRun(perform != null ? perform.getOpenrun() : null) + .area(perform != null ? perform.getArea() : null) + .poster(perform != null ? perform.getPoster() : null) + .performLikeCount(perform != null ? perform.getWishCount() : null) .build(); }