Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat#67 Chore: Elasticache Redis로 추가 & Feat: 스크랩 추가/해제 구현 #73

Merged
merged 2 commits into from
Feb 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public enum ErrorStatus implements BaseErrorCode {
POST_NOT_FOUND(HttpStatus.NOT_FOUND, "POST4001", "글을 찾을 수 없습니다."),
POST_NOT_CORRECT_USER(HttpStatus.BAD_REQUEST, "POST4002", "올바른 사용자(글 작성자)가 아닙니다."),
POST_LIKE_NOT_FOUND(HttpStatus.NOT_FOUND, "POST4003", "글에 대한 좋아요 데이터를 찾을 수 없습니다."),
POST_SCRAP_NOT_FOUND(HttpStatus.NOT_FOUND, "POST4004", "글에 대한 스크랩 데이터를 찾을 수 없습니다."),

// 댓글 관련 응답
COMMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "COMMENT4001", "댓글을 찾을 수 없습니다."),
Expand All @@ -41,7 +42,7 @@ public enum ErrorStatus implements BaseErrorCode {
COMMENT_NOT_CORRECT_USER(HttpStatus.BAD_REQUEST, "COMMENT4005", "올바른 사용자(댓글 작성자)가 아닙니다."),

// 알림 관련 응답
ALARM_NOT_FOUND(HttpStatus.NOT_FOUND, "ALARM4001", "알림이 없습니다")
ALARM_NOT_FOUND(HttpStatus.NOT_FOUND, "ALARM4001", "알림이 없습니다"),

;

Expand Down
14 changes: 14 additions & 0 deletions src/main/java/friend/spring/converter/PostConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import friend.spring.domain.enums.PostType;
import friend.spring.domain.enums.PostVoteType;
import friend.spring.domain.mapping.Post_like;
import friend.spring.domain.mapping.Post_scrap;
import friend.spring.web.dto.CandidateResponseDTO;
import friend.spring.web.dto.PostRequestDTO;
import friend.spring.web.dto.PostResponseDTO;
Expand Down Expand Up @@ -135,6 +136,19 @@ public static PostResponseDTO.PostSummaryListRes toPostSummaryRes(Post post, Int
.candidateList(candidateSummaryResList)
.build();
}

public static Post_scrap toPostScrap(Post post, User user) {
return Post_scrap.builder()
.post(post)
.user(user)
.build();
}

public static PostResponseDTO.ScrapCreateRes toScrapCreateRes(Post_scrap post_scrap) {
return PostResponseDTO.ScrapCreateRes.builder()
.post_scrap_id(post_scrap.getId())
.build();
}
}


11 changes: 11 additions & 0 deletions src/main/java/friend/spring/repository/PostScrapRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package friend.spring.repository;

import friend.spring.domain.mapping.Post_scrap;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface PostScrapRepository extends JpaRepository<Post_scrap, Long> {

Optional<Post_scrap> findByPostIdAndUserId(Long postId, Long userId);
}
8 changes: 8 additions & 0 deletions src/main/java/friend/spring/service/PostService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
import friend.spring.domain.Post;
import friend.spring.domain.User;
import friend.spring.domain.mapping.Post_like;
import friend.spring.domain.mapping.Post_scrap;
import friend.spring.web.dto.PostRequestDTO;
import friend.spring.web.dto.PostResponseDTO;
import org.springframework.data.domain.Page;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

public interface PostService {
Expand All @@ -27,10 +29,16 @@ public interface PostService {

void dislikePost(Long postId, Long userId);

void checkPostScrap(Boolean flag);

Page<PostResponseDTO.PostSummaryListRes> getBestPosts(Integer page, Integer size);

Page<PostResponseDTO.PostSummaryListRes> getRecentPosts(Integer page, Integer size);

List<PostResponseDTO.PostSummaryListRes> getPostRes(Page<Post> postPage);

Post_scrap createScrapPost(Long postId, HttpServletRequest request);

void deleteScrapPost(Long postId, HttpServletRequest request);
}

56 changes: 56 additions & 0 deletions src/main/java/friend/spring/service/PostServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
import friend.spring.converter.PostConverter;
import friend.spring.domain.*;
import friend.spring.domain.mapping.Post_like;
import friend.spring.domain.mapping.Post_scrap;
import friend.spring.repository.*;
import friend.spring.security.JwtTokenProvider;
import friend.spring.web.dto.*;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
Expand All @@ -17,6 +19,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
Expand All @@ -38,7 +41,9 @@ public class PostServiceImpl implements PostService{
private final PointRepository pointRepository;
private final PostLikeRepository postLikeRepository;
private final CommentRepository commentRepository;
private final PostScrapRepository postScrapRepository;
private final UserService userService;
private final JwtTokenProvider jwtTokenProvider;
@Override
public void checkPost(Boolean flag) {
if (!flag) {
Expand Down Expand Up @@ -68,6 +73,13 @@ public void checkPostLike(Boolean flag) {
}
}

@Override
public void checkPostScrap(Boolean flag) {
if (!flag) {
throw new PostHandler(ErrorStatus.POST_SCRAP_NOT_FOUND);
}
}

@Override
@Transactional
public Post joinPost(PostRequestDTO.AddPostDTO request, Long userId) {
Expand Down Expand Up @@ -331,4 +343,48 @@ public List<PostResponseDTO.PostSummaryListRes> getPostRes(Page<Post> postPage)
.get()
.collect(Collectors.toList());
}

@Override
public Post_scrap createScrapPost(Long postId, HttpServletRequest request) {
Long userId = jwtTokenProvider.getCurrentUser(request);

Optional<Post> optionalPost = postRepository.findById(postId);
if (optionalPost.isEmpty()) {
this.checkPost(false);
}

Optional<User> optionalUser = userRepository.findById(userId);
if (optionalUser.isEmpty()) {
userService.checkUser(false);
}

Post post = optionalPost.get();
User user = optionalUser.get();

Post_scrap post_scrap = PostConverter.toPostScrap(post, user);
return postScrapRepository.save(post_scrap);
}

@Override
public void deleteScrapPost(Long postId, HttpServletRequest request) {
Long userId = jwtTokenProvider.getCurrentUser(request);

Optional<Post> optionalPost = postRepository.findById(postId);
if (optionalPost.isEmpty()) {
this.checkPost(false);
}

Optional<User> optionalUser = userRepository.findById(userId);
if (optionalUser.isEmpty()) {
userService.checkUser(false);
}

Optional<Post_scrap> optionalPost_scrap = postScrapRepository.findByPostIdAndUserId(postId, userId);
if (optionalPost_scrap.isEmpty()) {
this.checkPostScrap(false);
}

Post_scrap post_scrap = optionalPost_scrap.get();
postScrapRepository.delete(post_scrap);
}
}
84 changes: 44 additions & 40 deletions src/main/java/friend/spring/web/controller/PostRestController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import friend.spring.domain.Post;
import friend.spring.domain.mapping.Comment_like;
import friend.spring.domain.mapping.Post_like;
import friend.spring.domain.mapping.Post_scrap;
import friend.spring.service.PostService;
import friend.spring.web.dto.CommentResponseDTO;
import friend.spring.web.dto.PostRequestDTO;
Expand All @@ -18,6 +19,7 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
@RestController
@RequiredArgsConstructor
Expand Down Expand Up @@ -123,44 +125,46 @@ public ApiResponse<Page<PostResponseDTO.PostSummaryListRes>> getRecentPosts(
return ApiResponse.onSuccess(postService.getRecentPosts(page, size));
}

// // 스크랩 추가
// @PostMapping("/{post-id}/scrap")
// @Operation(summary = "스크랩 추가 API", description = "스크랩 추가하는 API입니다. ex) /posts/1/like")
// @ApiResponses({
// @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200",description = "OK, 요청에 성공했습니다."),
// @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER4001",description = "NOT_FOUND, 사용자를 찾을 수 없습니다."),
// @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "POST4001",description = "NOT_FOUND, 글을 찾을 수 없습니다."),
// })
// @Parameters({
// @Parameter(name = "post-id", description = "path variable - 글 아이디"),
// @Parameter(name = "userId", description = "RequestHeader - 로그인한 사용자 아이디(accessToken으로 변경 예정)"),
// })
// public ApiResponse<PostResponseDTO.PostLikeRes> createScrapPost(
// @PathVariable("post-id") Long postId,
// @RequestHeader("userId") Long userId
// ) {
// Post_like post_like = postService.likePost(postId, userId);
// return ApiResponse.onSuccess(PostConverter.toPostLikeRes(post_like));
// }
//
// // 스크랩 해제
// @PostMapping("/{post-id}/like/del")
// @Operation(summary = "글 추천(좋아요) 해제 API", description = "글 추천(좋아요) 해제하는 API입니다. ex) /posts/1/like/del")
// @ApiResponses({
// @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200",description = "OK, 요청에 성공했습니다."),
// @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER4001",description = "NOT_FOUND, 사용자를 찾을 수 없습니다."),
// @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "POST4001",description = "NOT_FOUND, 글을 찾을 수 없습니다."),
// @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "POST4003",description = "글에 대한 좋아요 데이터를 찾을 수 없습니다."),
// })
// @Parameters({
// @Parameter(name = "post-id", description = "path variable - 글 아이디"),
// @Parameter(name = "userId", description = "RequestHeader - 로그인한 사용자 아이디(accessToken으로 변경 예정)"),
// })
// public ApiResponse<Void> deleteScrapPost(
// @PathVariable("post-id") Long postId,
// @RequestHeader("userId") Long userId
// ) {
// postService.dislikePost(postId, userId);
// return ApiResponse.onSuccess(null);
// }
// 글 스크랩 추가
@PostMapping("/{post-id}/scrap")
@Operation(summary = "글 스크랩 추가 API", description = "글 스크랩 추가하는 API입니다. ex) /posts/1/scrap")
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200",description = "OK, 요청에 성공했습니다."),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER4001",description = "NOT_FOUND, 사용자를 찾을 수 없습니다."),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "POST4001",description = "NOT_FOUND, 글을 찾을 수 없습니다."),
})
@Parameters({
@Parameter(name = "post-id", description = "path variable - 글 아이디"),
@Parameter(name = "atk", description = "RequestHeader - 로그인한 사용자의 accessToken"),
})
public ApiResponse<PostResponseDTO.ScrapCreateRes> createScrapPost(
@PathVariable("post-id") Long postId,
@RequestHeader(name = "atk") String atk,
HttpServletRequest request
) {
Post_scrap post_scrap = postService.createScrapPost(postId, request);
return ApiResponse.onSuccess(PostConverter.toScrapCreateRes(post_scrap));
}

// 글 스크랩 해제
@PostMapping("/{post-id}/scrap/del")
@Operation(summary = "글 스크랩 해제 API", description = "글 스크랩 해제하는 API입니다. ex) /posts/1/scrap/del")
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200",description = "OK, 요청에 성공했습니다."),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER4001",description = "NOT_FOUND, 사용자를 찾을 수 없습니다."),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "POST4001",description = "NOT_FOUND, 글을 찾을 수 없습니다."),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "POST4004",description = "글에 대한 스크랩 데이터를 찾을 수 없습니다."),
})
@Parameters({
@Parameter(name = "post-id", description = "path variable - 글 아이디"),
@Parameter(name = "atk", description = "RequestHeader - 로그인한 사용자의 accessToken"),
})
public ApiResponse<Void> deleteScrapPost(
@PathVariable("post-id") Long postId,
@RequestHeader(name = "atk") String atk,
HttpServletRequest request
) {
postService.deleteScrapPost(postId, request);
return ApiResponse.onSuccess(null);
}
}
7 changes: 7 additions & 0 deletions src/main/java/friend/spring/web/dto/PostResponseDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,11 @@ public static class PostSummaryListRes {
List<CandidateResponseDTO.CandidateSummaryRes> candidateList;
}

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class ScrapCreateRes {
Long post_scrap_id;
}
}
6 changes: 3 additions & 3 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
spring:
redis:
host: localhost
port: 6379
host: ${REDIS_HOSTNAME}
port: ${REDIS_PORT}
jwt:
secret: c4lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQtc2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQK
secret: ${JWT_SECRET}
datasource:
url: ${aws.db.url}
username: ${aws.db.username}
Expand Down
Loading