Skip to content

Commit

Permalink
Merge pull request #107 from APPS-sookmyung/feature/#92-like-api
Browse files Browse the repository at this point in the history
[Feature/#92-like-api ] LIKE API
  • Loading branch information
5jisoo authored Mar 3, 2024
2 parents 5888ea9 + 6f7013c commit 7e681c4
Show file tree
Hide file tree
Showing 15 changed files with 1,128 additions and 14 deletions.
1 change: 1 addition & 0 deletions src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ pochak server team~~

* link:post.html[Post API]
* link:comment.html[Comment API]
* link:like.html[LIKE API]

=== Member
* link:profile.html[Profile API]
Expand Down
49 changes: 49 additions & 0 deletions src/docs/asciidoc/like.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
= COMMENT API
pochak server team~~
:doctype: book
:icons: font
:source-highlighter: highlishtjs
:toc: left
:toclevels: 4
:sectlinks:

ifndef::snippets[]
:snippets: ./build/generated-snippets
endif::[]

== `GET` Like API

좋아요 누른 사람들 조회 API

=== Request

include::{snippets}/get-like/curl-request.adoc[]

==== path parameters
include::{snippets}/get-like/path-parameters.adoc[]

==== request headers
include::{snippets}/get-like/request-headers.adoc[]

=== Response
==== response body
include::{snippets}/get-like/response-body.adoc[]
include::{snippets}/get-like/response-fields.adoc[]

== `POST` Like API

포스트 좋아요 API

=== Request
include::{snippets}/like-post/http-request.adoc[]

==== path parameters
include::{snippets}/like-post/path-parameters.adoc[]

==== request headers
include::{snippets}/like-post/request-headers.adoc[]

=== Response
==== response body
include::{snippets}/like-post/response-body.adoc[]
include::{snippets}/like-post/response-fields.adoc[]
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public enum ErrorStatus implements BaseErrorCode {
FOLLOW_ONESELF(BAD_REQUEST, "FOLLOW4002", "자기 자신을 팔로우할 수 없습니다."),

// Like
POST_OWNER_LIKE(BAD_REQUEST, "LIKE4001", "포스트의 owner는 좋아요를 누를 수 없습니다."),

// Login
INVALID_TOKEN(BAD_REQUEST, "LOGIN4001", "잘못된 엑세스 토큰입니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public enum SuccessStatus implements BaseCode {
SUCCESS_DELETE_FOLLOWER(NO_CONTENT, "FOLLOW2003", "성공적으로 팔로워를 삭제하였습니다."),

// Like
SUCCESS_LIKE(NO_CONTENT, "LIKE2001", "성공적으로 좋아요를 처리하였습니다."),

// Login
SUCCESS_LOG_OUT(NO_CONTENT, "LOGIN2001", "성공적으로 로그아웃하였습니다"),
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/com/apps/pochak/like/controller/LikeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.apps.pochak.like.controller;

import com.apps.pochak.global.apiPayload.ApiResponse;
import com.apps.pochak.like.dto.response.LikeElements;
import com.apps.pochak.like.service.LikeService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import static com.apps.pochak.global.apiPayload.code.status.SuccessStatus.SUCCESS_LIKE;

@RestController
@RequiredArgsConstructor
@RequestMapping("api/v2/posts/{postId}/like")
public class LikeController {

private final LikeService likeService;

@GetMapping("")
public ApiResponse<LikeElements> getLikeMembers(@PathVariable("postId") final Long postId) {
return ApiResponse.onSuccess(likeService.getMemberLikedPost(postId));
}

@PostMapping("")
public ApiResponse<Void> likePost(@PathVariable("postId") final Long postId) {
likeService.likePost(postId);
return ApiResponse.of(SUCCESS_LIKE);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface LikeRepository extends JpaRepository<LikeEntity, Long> {
int countByLikedPost(final Post post);

Expand All @@ -19,4 +21,9 @@ Boolean existsByLikeMemberAndLikedPost(final Member member,
"set like.status = 'DELETED' " +
"where like.likeMember.id = :memberId or like.likedPost.owner.id = :memberId")
void deleteLikeByMemberId(@Param("memberId") final Long memberId);

LikeEntity findByLikeMemberAndLikedPost(final Member member,
final Post post);

List<LikeEntity> findByLikedPost(final Post post);
}
19 changes: 17 additions & 2 deletions src/main/java/com/apps/pochak/like/dto/response/LikeElement.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,22 @@
package com.apps.pochak.like.dto.response;

import lombok.Data;
import com.apps.pochak.member.domain.Member;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Data
@Getter
@AllArgsConstructor
public class LikeElement {

private String handle;
private String profileImage;
private String name;
private Boolean follow;

public LikeElement(final Member member, final Boolean follow) {
this.handle = member.getHandle();
this.profileImage = member.getProfileImage();
this.name = member.getName();
this.follow = follow;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package com.apps.pochak.like.dto.response;

import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Data
import java.util.List;

@Getter
@AllArgsConstructor
public class LikeElements {

private final List<LikeElement> likeMembersList;
}
52 changes: 52 additions & 0 deletions src/main/java/com/apps/pochak/like/service/LikeService.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,63 @@
package com.apps.pochak.like.service;

import com.apps.pochak.follow.domain.repository.FollowRepository;
import com.apps.pochak.global.apiPayload.exception.GeneralException;
import com.apps.pochak.like.domain.LikeEntity;
import com.apps.pochak.like.domain.repository.LikeRepository;
import com.apps.pochak.like.dto.response.LikeElement;
import com.apps.pochak.like.dto.response.LikeElements;
import com.apps.pochak.login.jwt.JwtService;
import com.apps.pochak.member.domain.Member;
import com.apps.pochak.post.domain.Post;
import com.apps.pochak.post.domain.repository.PostRepository;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

import static com.apps.pochak.global.BaseEntityStatus.ACTIVE;
import static com.apps.pochak.global.BaseEntityStatus.DELETED;
import static com.apps.pochak.global.apiPayload.code.status.ErrorStatus.POST_OWNER_LIKE;

@Service
@RequiredArgsConstructor
public class LikeService {
private final LikeRepository likeRepository;
private final PostRepository postRepository;
private final FollowRepository followRepository;
private final JwtService jwtService;

@Transactional
public void likePost(final Long postId) {
final Member loginMember = jwtService.getLoginMember();
final Post post = postRepository.findPostById(postId);

if (loginMember == post.getOwner())
throw new GeneralException(POST_OWNER_LIKE);

LikeEntity postLike = likeRepository.findByLikeMemberAndLikedPost(loginMember, post);
if (postLike != null) {
if (postLike.getStatus().equals(ACTIVE))
postLike.setStatus(DELETED);
else if (postLike.getStatus().equals(DELETED))
postLike.setStatus(ACTIVE);
} else {
postLike = new LikeEntity(loginMember, post);
}
likeRepository.save(postLike);
}

@Transactional
public LikeElements getMemberLikedPost(final Long postId) {
final Member loginMember = jwtService.getLoginMember();
final Post likedPost = postRepository.findPostById(postId);
List<LikeEntity> likes = likeRepository.findByLikedPost(likedPost);

final List<LikeElement> likeElements = likes.stream().map(
like -> new LikeElement(like.getLikeMember(), followRepository.existsBySenderAndReceiver(loginMember, like.getLikeMember())
)).toList();

return new LikeElements(likeElements);
}
}
5 changes: 4 additions & 1 deletion src/main/resources/static/docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,9 @@ <h3 id="_post"><a class="link" href="#_post">Post</a></h3>
<li>
<p><a href="comment.html">Comment API</a></p>
</li>
<li>
<p><a href="like.html">LIKE API</a></p>
</li>
</ul>
</div>
</div>
Expand Down Expand Up @@ -545,7 +548,7 @@ <h3 id="_login"><a class="link" href="#_login">Login</a></h3>
<div id="footer">
<div id="footer-text">
Version 0.0.1-SNAPSHOT<br>
Last updated 2024-02-19 21:56:58 +0900
Last updated 2024-03-03 20:39:40 +0900
</div>
</div>
</body>
Expand Down
Loading

0 comments on commit 7e681c4

Please sign in to comment.