Skip to content
23 changes: 13 additions & 10 deletions src/main/java/com/wss/websoso/config/BaseTimeEntity.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
package com.wss.websoso.config;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import jakarta.persistence.PrePersist;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Getter
public abstract class BaseTimeEntity {
@CreatedDate // 생성 시각, 현재 시각으로 초기화 해줌!
private String createdDate;
@CreatedDate // 생성 시각, 현재 시각으로 초기화 해줌!
@Column(name = "created_date", nullable = false)
private String createdDate;

@PrePersist
public void onPrePersist() {
this.createdDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd a HH:mm"));
}
}
@PrePersist
public void onPrePersist() {
this.createdDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd a HH:mm"));
}
}
8 changes: 5 additions & 3 deletions src/main/java/com/wss/websoso/memo/Memo.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,20 @@

@Entity
@Getter
@Table(name = "memo")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "memo")
public class Memo extends BaseTimeEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "memo_id", nullable = false)
private Long memoId;
@Column(length = 2000)

@Column(name = "memo_content", length = 2000, nullable = false)
private String memoContent;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_novel_id")
@JoinColumn(name = "user_novel_id", nullable = false)
private UserNovel userNovel;

@Builder
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/com/wss/websoso/memo/MemoRepository.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package com.wss.websoso.memo;

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

@Repository
public interface MemoRepository extends JpaRepository<Memo, Long> {
}

@Query(value = "SELECT m FROM Memo m WHERE m.userNovel.userNovelId = ?1")
List<Memo> findByUserNovelId(Long userNovelId);
}
8 changes: 7 additions & 1 deletion src/main/java/com/wss/websoso/platform/Platform.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.wss.websoso.novel.Novel;
import com.wss.websoso.userNovel.UserNovel;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
Expand All @@ -23,16 +24,21 @@ public class Platform {

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

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

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "novel_id")
private Novel novel;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_novel_id")
@JoinColumn(name = "user_novel_id", nullable = false)
private UserNovel userNovel;

@Builder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package com.wss.websoso.platform;

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

@Repository
public interface PlatformRepository extends JpaRepository<Platform, Long> {
}

@Query(value = "SELECT p FROM Platform p WHERE p.userNovel.userNovelId = ?1 ")
List<Platform> findByUserNovelId(Long userNovelId);
}
14 changes: 13 additions & 1 deletion src/main/java/com/wss/websoso/userNovel/UserNovelController.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
import java.security.Principal;
import java.util.Objects;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
Expand Down Expand Up @@ -33,5 +36,14 @@ public UserNovelsResponse getUserNovels(
lastUserNovelId, size, sortType);
}
}
}

@GetMapping("/{userNovelId}")
public ResponseEntity<UserNovelMemoAndInfoGetResponse> getUserNovelMemoAndInfo(@PathVariable Long userNovelId,
Principal principal) {

Long userId = Long.valueOf(principal.getName());
return ResponseEntity
.status(HttpStatus.OK)
.body(userNovelService.getUserNovelMemoAndInfo(userId, userNovelId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.wss.websoso.userNovel;

import com.wss.websoso.config.ReadStatus;
import com.wss.websoso.memo.Memo;
import com.wss.websoso.platform.Platform;
import java.util.List;

public record UserNovelMemoAndInfoGetResponse(
List<UserNovelMemosGetResponse> memoList,
float userNovelRating,
ReadStatus userNovelReadStatus,
String userNovelReadStartDate,
String userNovelReadEndDate,
String userNovelDescription,
String userNovelGenre,
List<UserNovelPlatformsGetResponse> platformList
) {

public static UserNovelMemoAndInfoGetResponse of(List<Memo> memos, UserNovel userNovel, List<Platform> platforms) {
List<UserNovelMemosGetResponse> memoList = memos.stream()
.map(memo -> new UserNovelMemosGetResponse(
memo.getMemoId(),
memo.getMemoContent(),
memo.getCreatedDate()
)).toList();

List<UserNovelPlatformsGetResponse> platformList = platforms.stream()
.map(platform -> new UserNovelPlatformsGetResponse(
platform.getPlatformName(),
platform.getPlatformUrl()
)).toList();

return new UserNovelMemoAndInfoGetResponse(
memoList,
userNovel.getUserNovelRating(),
userNovel.getUserNovelReadStatus(),
userNovel.getUserNovelReadStartDate(),
userNovel.getUserNovelReadEndDate(),
userNovel.getUserNovelDescription(),
userNovel.getUserNovelGenre(),
platformList
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.wss.websoso.userNovel;

public record UserNovelMemosGetResponse(
Long memoId,
String memoContent,
String createdDate
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.wss.websoso.userNovel;

public record UserNovelPlatformsGetResponse(
String platformName,
String platformUrl
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,6 @@ Slice<UserNovel> findUserNovelsByReadStatusAndOldest(Long userId, ReadStatus rea
+ "un.user.userId = ?1 AND "
+ "un.userNovelReadStatus = ?2")
Long countByUserNovelReadStatus(Long userId, ReadStatus readStatus);

UserNovel findByUserNovelId(Long userNovelId);
}
25 changes: 24 additions & 1 deletion src/main/java/com/wss/websoso/userNovel/UserNovelService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package com.wss.websoso.userNovel;

import com.wss.websoso.config.ReadStatus;
import com.wss.websoso.memo.Memo;
import com.wss.websoso.memo.MemoRepository;
import com.wss.websoso.platform.Platform;
import com.wss.websoso.platform.PlatformRepository;
import java.util.List;
import java.util.Objects;
import lombok.RequiredArgsConstructor;
Expand All @@ -16,6 +20,8 @@ public class UserNovelService {

private static final int DEFAULT_PAGE_NUMBER = 0;
private final UserNovelRepository userNovelRepository;
private final MemoRepository memoRepository;
private final PlatformRepository platformRepository;

// ALL
public UserNovelsResponse getUserNovels(Long userId, Long lastUserNovelId, int size, String sortType) {
Expand Down Expand Up @@ -57,4 +63,21 @@ public UserNovelsResponse getUserNovels(Long userId, ReadStatus readStatus,
return UserNovelsResponse.of(userNovelCount, userNovels);
}
}
}

public UserNovelMemoAndInfoGetResponse getUserNovelMemoAndInfo(Long userId, Long userNovelId) {

UserNovel userNovelForAuthorization = userNovelRepository.findById(userNovelId)
.orElseThrow(() -> new RuntimeException("해당하는 userNovel이 없습니다."));

Long userIdForAuthorization = userNovelForAuthorization.getUser().getUserId();
if (!Objects.equals(userIdForAuthorization, userId)) {
throw new RuntimeException("잘못된 접근입니다.(인가X)");
}

List<Memo> memos = memoRepository.findByUserNovelId(userNovelId);
List<Platform> platforms = platformRepository.findByUserNovelId(userNovelId);
UserNovel userNovel = userNovelRepository.findByUserNovelId(userNovelId);

return UserNovelMemoAndInfoGetResponse.of(memos, userNovel, platforms);
}
}