Skip to content

Commit

Permalink
스크랩 리스트 조회 (#34)
Browse files Browse the repository at this point in the history
* 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
hhyuun authored Sep 26, 2024
1 parent 35eb90b commit 87b19d1
Show file tree
Hide file tree
Showing 7 changed files with 232 additions and 0 deletions.
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 src/main/java/org/example/tokpik_be/scrap/domain/Scrap.java
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 src/main/java/org/example/tokpik_be/scrap/domain/ScrapTopic.java
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;
}
}
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
) {

}
}
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);
}
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);
}
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()
);
}
}

0 comments on commit 87b19d1

Please sign in to comment.