Skip to content

Commit

Permalink
Merge pull request #31 from Likelion-YeungNam-Univ/feat/#5-post-scrap
Browse files Browse the repository at this point in the history
Feat/#5 post scrap
  • Loading branch information
jjjjjinseo authored Jul 29, 2024
2 parents e6a3858 + 51eeb99 commit 4db643d
Show file tree
Hide file tree
Showing 5 changed files with 243 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.example.beginnerfitbe.scrap.controller;


import com.example.beginnerfitbe.jwt.util.JwtUtil;
import com.example.beginnerfitbe.scrap.service.ScrapService;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/posts")
public class ScrapController {

private final JwtUtil jwtUtil;
private final ScrapService scrapService;

@PostMapping("/{postId}/scraps")
@Operation(summary = "게시글 스크랩 메서드", description = "게시글을 스크랩합니다.")
private ResponseEntity<?> create(HttpServletRequest request , @PathVariable Long postId){
Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7));
return ResponseEntity.ok(scrapService.create(userId, postId));
}

@GetMapping("/scraps")
@Operation(summary = "스크랩 전체 조회 메소드", description = "전체 스크랩 목록을 조회합니다.")
private ResponseEntity<?> list(){
return ResponseEntity.ok(scrapService.list());
}

@GetMapping("/scraps/me")
@Operation(summary = "내가 스크랩 한 내역 조회 메소드", description = "내가 스크랩한 게시글을 조회합니다.")
private ResponseEntity<?> getScrapsByUser(HttpServletRequest request){
Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7));
return ResponseEntity.ok(scrapService.getScrapsByUser(userId));
}

@GetMapping("/{postId}/scraps")
@Operation(summary = "게시글 별 스크랩 조회 메소드", description = "게시글의 스크랩 내역을 조회합니다.")
private ResponseEntity<?> getScrapsByPost(@PathVariable Long postId){
return ResponseEntity.ok(scrapService.getScrapsByPost(postId));
}

@GetMapping("/{postId}/scraps/check")
@Operation(summary = "스크랩 여부 조회 메소드", description = "게시글을 스크랩 했는 지 조회합니다.")
private ResponseEntity<?> checkScrap(HttpServletRequest request, @PathVariable Long postId){
Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7));
return ResponseEntity.ok(scrapService.checkScrap(userId, postId));
}

@DeleteMapping("/{postId}/scraps")
@Operation(summary = "스크랩 취소 메소드", description = "게시글을 스크랩을 취소합니다.")
private ResponseEntity<?> delete(HttpServletRequest request, @PathVariable Long postId){
Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7));
return ResponseEntity.ok(scrapService.delete(userId, postId));
}

}
39 changes: 39 additions & 0 deletions src/main/java/com/example/beginnerfitbe/scrap/domain/Scrap.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.example.beginnerfitbe.scrap.domain;


import com.example.beginnerfitbe.post.domain.Post;
import com.example.beginnerfitbe.user.domain.User;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;

import java.time.LocalDateTime;

import static jakarta.persistence.FetchType.LAZY;

@Entity
@Getter
@NoArgsConstructor
public class Scrap {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = LAZY)
private Post post;

@ManyToOne(fetch = LAZY)
private User user;

@CreatedDate
private LocalDateTime createdAt;

@Builder
public Scrap(Post post, User user, LocalDateTime createdAt) {
this.post = post;
this.user = user;
this.createdAt = createdAt;
}
}
27 changes: 27 additions & 0 deletions src/main/java/com/example/beginnerfitbe/scrap/dto/ScrapDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.example.beginnerfitbe.scrap.dto;

import com.example.beginnerfitbe.post.dto.PostDto;
import com.example.beginnerfitbe.scrap.domain.Scrap;
import lombok.Data;

import java.time.LocalDateTime;

@Data
public class ScrapDto {
private Long userId;
private PostDto postInfo;
private LocalDateTime createdAt;

public ScrapDto(Long userId, PostDto postInfo, LocalDateTime createdAt) {
this.userId = userId;
this.postInfo = postInfo;
this.createdAt = createdAt;
}
public static ScrapDto fromEntity(Scrap scrap){
return new ScrapDto(
scrap.getUser().getId(),
PostDto.fromEntity(scrap.getPost()),
scrap.getCreatedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.beginnerfitbe.scrap.repository;

import com.example.beginnerfitbe.post.domain.Post;
import com.example.beginnerfitbe.scrap.domain.Scrap;
import com.example.beginnerfitbe.user.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface ScrapRepository extends JpaRepository<Scrap, Long> {
Optional<Scrap> findByUserAndPost(User user, Post post);
List<Scrap> findScrapsByUser(User user);
List<Scrap> findScrapsByPost(Post post);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package com.example.beginnerfitbe.scrap.service;

import com.example.beginnerfitbe.error.StateResponse;
import com.example.beginnerfitbe.post.domain.Post;
import com.example.beginnerfitbe.post.repository.PostRepository;
import com.example.beginnerfitbe.scrap.domain.Scrap;
import com.example.beginnerfitbe.scrap.dto.ScrapDto;
import com.example.beginnerfitbe.scrap.repository.ScrapRepository;
import com.example.beginnerfitbe.user.domain.User;
import com.example.beginnerfitbe.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class ScrapService {

private final ScrapRepository scrapRepository;
private final UserRepository userRepository;
private final PostRepository postRepository;

public StateResponse create(Long userId, Long postId){
User user = userRepository.findById(userId).orElseThrow(() -> new IllegalArgumentException("not found user"));
Post post = postRepository.findById(postId).orElseThrow(() -> new IllegalArgumentException("not found post"));

Optional <Scrap> scrapOpt = scrapRepository.findByUserAndPost(user, post);

if(scrapOpt.isPresent()){
return StateResponse.builder()
.code("FAIL")
.message("이미 스크랩 했습니다.")
.build();
}
Scrap scrap = Scrap.builder()
.user(user)
.post(post)
.createdAt(LocalDateTime.now())
.build();

scrapRepository.save(scrap);
return StateResponse.builder()
.code("SUCCESS")
.message("게시글을 성공적으로 스크랩했습니다.")
.build();
}

public List<ScrapDto> list(){
return scrapRepository.findAll().stream()
.map(ScrapDto::fromEntity)
.collect(Collectors.toList());
}

public List<ScrapDto> getScrapsByUser(Long userId){
User user = userRepository.findById(userId).orElseThrow(() -> new IllegalArgumentException("not found user"));
return scrapRepository.findScrapsByUser(user).stream()
.map(ScrapDto::fromEntity)
.collect(Collectors.toList());
}

public List<ScrapDto> getScrapsByPost(Long postId){
Post post = postRepository.findById(postId).orElseThrow(() -> new IllegalArgumentException("not found post"));
return scrapRepository.findScrapsByPost(post).stream()
.map(ScrapDto::fromEntity)
.collect(Collectors.toList());
}

public Boolean checkScrap(Long userId, Long postId){
User user = userRepository.findById(userId).orElseThrow(() -> new IllegalArgumentException("not found user"));
Post post = postRepository.findById(postId).orElseThrow(() -> new IllegalArgumentException("not found post"));

Optional<Scrap> scrapOpt = scrapRepository.findByUserAndPost(user, post);

return scrapOpt.isPresent();
}

public StateResponse delete(Long userId, Long postId){
User user = userRepository.findById(userId).orElseThrow(() -> new IllegalArgumentException("not found user"));
Post post = postRepository.findById(postId).orElseThrow(() -> new IllegalArgumentException("not found post"));
Optional<Scrap> scrapOpt = scrapRepository.findByUserAndPost(user, post);

if(scrapOpt.isPresent()){
scrapRepository.delete(scrapOpt.get());
return StateResponse.builder()
.code("SUCCESS")
.message("스크랩을 취소했습니다.")
.build();
}
return StateResponse.builder()
.code("FAIL")
.message("스크랩 내역이 없습니다.")
.build();

}

}

0 comments on commit 4db643d

Please sign in to comment.