-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat: 스크랩 엔티티 정의(#29) * feat: 스크랩 된 토픽 엔티티 정의(#29) * feat: ScrapRepository 정의(#29) * feat: ScrapTopicRepository 정의(#29) * feat: 스크랩 리스트 조회 응답 DTO 정의(#29) * feat: 스크랩 리스트 조회 로직 구현(#29) * feat: 불필요한 repository 메서드 제거(#29) * feat: 스크랩 리스트 조회 API 구현(#29) * feat: 불필요한 BaseTimeEntity 상속 제거(#29)
- Loading branch information
Showing
7 changed files
with
232 additions
and
0 deletions.
There are no files selected for viewing
28 changes: 28 additions & 0 deletions
28
src/main/java/org/example/tokpik_be/scrap/controller/ScrapController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package org.example.tokpik_be.scrap.controller; | ||
|
||
import org.example.tokpik_be.scrap.dto.response.ScrapListResponse; | ||
import org.example.tokpik_be.scrap.service.ScrapService; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.GetMapping; | ||
import org.springframework.web.bind.annotation.RequestAttribute; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
import io.swagger.v3.oas.annotations.Operation; | ||
import io.swagger.v3.oas.annotations.responses.ApiResponse; | ||
import lombok.RequiredArgsConstructor; | ||
|
||
@RestController | ||
@RequiredArgsConstructor | ||
public class ScrapController { | ||
|
||
private final ScrapService scrapService; | ||
|
||
@GetMapping("/users/scraps") | ||
@Operation(summary = "스크랩 리스트 조회", description = "스크랩 리스트 조회") | ||
@ApiResponse(responseCode = "200", description = "스크랩 리스트 조회 성공") | ||
public ResponseEntity<ScrapListResponse> getScrapList( | ||
@RequestAttribute("userId") long userId) { | ||
ScrapListResponse scrapListResponse = scrapService.getScrapList(userId); | ||
return ResponseEntity.ok(scrapListResponse); | ||
} | ||
} |
39 changes: 39 additions & 0 deletions
39
src/main/java/org/example/tokpik_be/scrap/domain/Scrap.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package org.example.tokpik_be.scrap.domain; | ||
|
||
import org.example.tokpik_be.common.BaseTimeEntity; | ||
import org.example.tokpik_be.user.domain.User; | ||
|
||
import jakarta.persistence.Column; | ||
import jakarta.persistence.Entity; | ||
import jakarta.persistence.GeneratedValue; | ||
import jakarta.persistence.GenerationType; | ||
import jakarta.persistence.Id; | ||
import jakarta.persistence.JoinColumn; | ||
import jakarta.persistence.ManyToOne; | ||
import jakarta.persistence.Table; | ||
import lombok.AccessLevel; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Table(name = "scraps") | ||
@Getter | ||
@Entity | ||
@NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
public class Scrap extends BaseTimeEntity { | ||
|
||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long id; | ||
|
||
@Column(nullable = false) | ||
private String title; | ||
|
||
@ManyToOne | ||
@JoinColumn(name = "user_id", nullable = false) | ||
private User user; | ||
|
||
public Scrap(String title, User user){ | ||
this.title = title; | ||
this.user = user; | ||
} | ||
} |
40 changes: 40 additions & 0 deletions
40
src/main/java/org/example/tokpik_be/scrap/domain/ScrapTopic.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package org.example.tokpik_be.scrap.domain; | ||
|
||
import org.example.tokpik_be.common.BaseTimeEntity; | ||
import org.example.tokpik_be.talk_topic.domain.TalkTopic; | ||
|
||
import jakarta.persistence.Entity; | ||
import jakarta.persistence.FetchType; | ||
import jakarta.persistence.GeneratedValue; | ||
import jakarta.persistence.GenerationType; | ||
import jakarta.persistence.Id; | ||
import jakarta.persistence.JoinColumn; | ||
import jakarta.persistence.ManyToOne; | ||
import jakarta.persistence.Table; | ||
import lombok.AccessLevel; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Table(name = "scraped_talk_topics") | ||
@Getter | ||
@Entity | ||
@NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
public class ScrapTopic extends BaseTimeEntity { | ||
|
||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long id; | ||
|
||
@ManyToOne(fetch = FetchType.LAZY) | ||
@JoinColumn(name = "scrap_id", nullable = false) | ||
private Scrap scrap; | ||
|
||
@ManyToOne(fetch = FetchType.LAZY) | ||
@JoinColumn(name = "talk_topic_id", nullable = false) | ||
private TalkTopic talkTopic; | ||
|
||
public ScrapTopic(Scrap scrap, TalkTopic talkTopic){ | ||
this.scrap = scrap; | ||
this.talkTopic = talkTopic; | ||
} | ||
} |
40 changes: 40 additions & 0 deletions
40
src/main/java/org/example/tokpik_be/scrap/dto/response/ScrapListResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package org.example.tokpik_be.scrap.dto.response; | ||
|
||
import java.util.List; | ||
|
||
import com.fasterxml.jackson.annotation.JsonProperty; | ||
import io.swagger.v3.oas.annotations.media.Schema; | ||
|
||
public record ScrapListResponse( | ||
@JsonProperty(required = true) | ||
@Schema(description = "스크랩 목록") | ||
List<ScrapResponse> scraps | ||
) { | ||
public record ScrapResponse( | ||
@JsonProperty(required = true) | ||
@Schema(type = "number", description = "스크랩 ID", example = "1") | ||
Long scrapId, | ||
|
||
@JsonProperty(required = true) | ||
@Schema(type = "string", description = "스크랩 이름", example = "친구과 스몰톡하기 좋은 주제들") | ||
String scrapName, | ||
|
||
@JsonProperty(required = true) | ||
@Schema(description = "최근 주제 유형 목록") | ||
List<TopicTypeResponse> recentTopicTypes | ||
) { | ||
|
||
} | ||
|
||
public record TopicTypeResponse( | ||
@JsonProperty(required = true) | ||
@Schema(type = "number", description = "주제 유형 ID", example = "3") | ||
Long topicTypeId, | ||
|
||
@JsonProperty(required = true) | ||
@Schema(type = "string", description = "주제 유형 내용", example = "아이스브레이킹") | ||
String topicTypeContent | ||
) { | ||
|
||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
src/main/java/org/example/tokpik_be/scrap/repository/ScrapRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package org.example.tokpik_be.scrap.repository; | ||
|
||
import java.util.List; | ||
|
||
import org.example.tokpik_be.scrap.domain.Scrap; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
|
||
@Repository | ||
public interface ScrapRepository extends JpaRepository<Scrap, Long> { | ||
List<Scrap> findByUserIdOrderByCreatedAtDesc(Long id); | ||
} |
14 changes: 14 additions & 0 deletions
14
src/main/java/org/example/tokpik_be/scrap/repository/ScrapTopicRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package org.example.tokpik_be.scrap.repository; | ||
|
||
import java.util.List; | ||
|
||
import org.example.tokpik_be.scrap.domain.Scrap; | ||
import org.example.tokpik_be.scrap.domain.ScrapTopic; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
|
||
@Repository | ||
public interface ScrapTopicRepository extends JpaRepository<ScrapTopic, Long> { | ||
|
||
List<ScrapTopic> findByScrapOrderByCreatedAtDesc(Scrap scrap); | ||
} |
59 changes: 59 additions & 0 deletions
59
src/main/java/org/example/tokpik_be/scrap/service/ScrapService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
package org.example.tokpik_be.scrap.service; | ||
|
||
import java.util.List; | ||
|
||
import org.example.tokpik_be.scrap.domain.Scrap; | ||
import org.example.tokpik_be.scrap.domain.ScrapTopic; | ||
import org.example.tokpik_be.scrap.dto.response.ScrapListResponse; | ||
import org.example.tokpik_be.scrap.repository.ScrapRepository; | ||
import org.example.tokpik_be.scrap.repository.ScrapTopicRepository; | ||
import org.example.tokpik_be.talk_topic.domain.TalkTopic; | ||
import org.example.tokpik_be.user.domain.User; | ||
import org.example.tokpik_be.user.service.UserQueryService; | ||
import org.springframework.stereotype.Service; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@Service | ||
@RequiredArgsConstructor | ||
public class ScrapService { | ||
|
||
private final ScrapRepository scrapRepository; | ||
private final ScrapTopicRepository scrapTopicRepository; | ||
private final UserQueryService userQueryService; | ||
|
||
public ScrapListResponse getScrapList(long userId) { | ||
|
||
User user = userQueryService.findById(userId); | ||
|
||
List<Scrap> scraps = scrapRepository.findByUserIdOrderByCreatedAtDesc(user.getId()); | ||
|
||
List<ScrapListResponse.ScrapResponse> scrapResponses = scraps.stream() | ||
.map(this::mapToScrapResponse) | ||
.toList(); | ||
|
||
return new ScrapListResponse(scrapResponses); | ||
} | ||
|
||
private ScrapListResponse.ScrapResponse mapToScrapResponse(Scrap scrap) { | ||
List<ScrapTopic> scrapTopics = scrapTopicRepository.findByScrapOrderByCreatedAtDesc(scrap); | ||
|
||
List<ScrapListResponse.TopicTypeResponse> topicTypes = scrapTopics.stream() | ||
.map(this::mapToTopicTypeResponse) | ||
.toList(); | ||
|
||
return new ScrapListResponse.ScrapResponse( | ||
scrap.getId(), | ||
scrap.getTitle(), | ||
topicTypes | ||
); | ||
} | ||
|
||
private ScrapListResponse.TopicTypeResponse mapToTopicTypeResponse(ScrapTopic scrapTopic) { | ||
TalkTopic talkTopic = scrapTopic.getTalkTopic(); | ||
return new ScrapListResponse.TopicTypeResponse( | ||
talkTopic.getTopicTag().getId(), | ||
talkTopic.getTopicTag().getContent() | ||
); | ||
} | ||
} |