Browse Source

포스팅 데이터 조회 시 좋아요 수 및 로그인 상태인 사용자가 해당 포스팅 좋아요한 여부

sangwonlee 3 years ago
parent
commit
fae3270a5e

+ 27 - 3
realworld/src/main/java/com/dbs/realworld/controller/ArticleController.java

@@ -156,7 +156,7 @@ public class ArticleController {
     @PatchMapping("/{articleId}")
     public ResponseEntity editArticle(HttpServletRequest request, @PathVariable("articleId") int articleId, @RequestBody ArticleDTO articleDTO) {
         HttpSession session = request.getSession();
-        int ssId = (int) session.getAttribute("ssId");
+        final int ssId = (int) session.getAttribute("ssId");
         if (!(ssId == articleDTO.getWriterId())) {
             return ResponseEntity
                     .status(HttpStatus.FORBIDDEN)
@@ -234,7 +234,7 @@ public class ArticleController {
         }
 
         HttpSession session = request.getSession();
-        int ssUserId = (int) session.getAttribute("ssId");
+        final int ssUserId = (int) session.getAttribute("ssId");
         String ssEmail = (String) session.getAttribute("ssEmail");
 
         if (finded.getWriterId() == ssUserId && finded.getWriterEmail().equals(ssEmail)) {
@@ -251,8 +251,32 @@ public class ArticleController {
     
     @DeleteMapping("/{articleId}/comment/{commentId}")
     public ResponseEntity deleteComment(HttpServletRequest request, @PathVariable("articleId") int articleId, @PathVariable("commentId") int commentId) {
-        int userId = (int) request.getSession().getAttribute("ssId");
+        final int userId = (int) request.getSession().getAttribute("ssId");
         this.commentService.remove(userId, articleId, commentId);
         return ResponseEntity.ok().body("성공적으로 삭제했습니다.");
     }
+
+
+    @PostMapping("/{articleId}/favorite")
+    public ResponseEntity favorite(HttpServletRequest request, @PathVariable("articleId") int articleId) {
+        final int userId = (int) request.getSession().getAttribute("ssId");
+        ArticleDTO finded = articleService.findByArticleId(articleId);
+        if (finded == null) {
+            return ResponseEntity.status(HttpStatus.NO_CONTENT).body("존재하지 않는 게시물 입니다.");
+        }
+        articleService.favorite(userId, articleId);
+        return ResponseEntity.status(HttpStatus.CREATED).build();
+    }
+
+
+    @DeleteMapping("/{articleId}/favorite")
+    public ResponseEntity unfavorite(HttpServletRequest request, @PathVariable("articleId") int articleId) {
+        final int userId = (int) request.getSession().getAttribute("ssId");
+        ArticleDTO finded = articleService.findByArticleId(articleId);
+        if (finded == null) {
+            return ResponseEntity.status(HttpStatus.NO_CONTENT).body("존재하지 않는 게시물 입니다.");
+        }
+        articleService.unfavorite(userId, articleId);
+        return ResponseEntity.ok().build();
+    }
 }

+ 3 - 2
realworld/src/main/java/com/dbs/realworld/dto/ArticleDTO.java

@@ -1,7 +1,6 @@
 package com.dbs.realworld.dto;
 
 import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -10,7 +9,6 @@ import java.util.List;
 
 
 @Data
-@Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class ArticleDTO {
@@ -26,4 +24,7 @@ public class ArticleDTO {
     private String writerEmail;
 
     private List<CommentDTO> comments;
+
+    private int favoriteNum;
+    private boolean isFavorite;
 }

+ 3 - 0
realworld/src/main/java/com/dbs/realworld/mapper/ArticleMapper.java

@@ -18,4 +18,7 @@ public interface ArticleMapper {
     ArticleDTO selectByArticleId(int articleId);
     void deleteByArticleId(int articleId);
     int updateArticle(ArticleDTO dto);
+    void insertFavorite(int userId, int articleId);
+    void deleteFavorite(int userId, int articleId);
+    void updateFavoriteNum(int articleId);
 }

+ 20 - 0
realworld/src/main/java/com/dbs/realworld/service/ArticleService.java

@@ -9,6 +9,7 @@ import com.dbs.realworld.mapper.ArticleMapper;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 @Service
 public class ArticleService {
@@ -30,10 +31,12 @@ public class ArticleService {
         return articleDTO.getId();
     }
 
+    
     public List<ArticleDTO> findAll() {
         return this.articleMapper.selectAll();
     }
 
+
     /**
      * 
      * @param feed  feed 타입, 'your-feed', 'global-feed'
@@ -43,6 +46,7 @@ public class ArticleService {
         return this.articleMapper.select(articleId, feed, userId);
     }
 
+
     public Map<String, Object> calculatePagingInfo(List<ArticleDTO> articleDTOs, int articleId, String feed, int userId) {
         Map<String, Object> paging = this.articleMapper.selectPagingInfo(articleId, feed, userId);
         paging.put("size", articleDTOs.size());
@@ -58,6 +62,7 @@ public class ArticleService {
         return paging;
     }
 
+
     public ArticleDTO findByArticleId(int articleId) {
         ArticleDTO articleDTO = this.articleMapper.selectByArticleId(articleId);
         List<CommentDTO> commentDTOs = this.commentService.findAllByArticleId(articleId);
@@ -70,7 +75,22 @@ public class ArticleService {
         this.articleMapper.deleteByArticleId(articleId);
     }
 
+
     public void edit(ArticleDTO articleDTO) {
         this.articleMapper.updateArticle(articleDTO);
     }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    public void favorite(int userId, int articleId) {
+        this.articleMapper.insertFavorite(userId, articleId);
+        this.articleMapper.updateFavoriteNum(articleId);
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    public void unfavorite(int userId, int articleId) {
+        this.articleMapper.deleteFavorite(userId, articleId);
+        this.articleMapper.updateFavoriteNum(articleId);
+    }
 }

+ 38 - 0
realworld/src/main/resources/mybatis/mapper/user/ArticleMapper.xml

@@ -50,6 +50,18 @@
           AR.content          AS content,
           AR.tags             AS tags,
           AR.create_datetime  AS created,
+          AR.favorite_num     AS favoriteNum,
+      ]]>
+      <if test='userId != -1'>
+        <![CDATA[
+          (
+              SELECT COUNT(*) FROM article_like AL 
+              WHERE AL.user_id     = #{userId}
+              AND   AL.article_id  = AR.id
+          )                   AS isFavorite,
+        ]]>
+      </if>
+      <![CDATA[
           AR.user_id          AS writerId,
           USR.name            AS writerName,
           USR.email           AS writerEmail
@@ -135,4 +147,30 @@
             DELETE FROM article_mst WHERE id = #{articleId}
         ]]>
     </delete>
+
+    <insert id="insertFavorite" parameterType="hashmap">
+        <![CDATA[
+            INSERT INTO article_mst 
+              ( user_id, article_id	)
+            VALUES 
+              ( #{userId}, #{articleId} )
+        ]]>
+    </insert>
+
+    <delete id="deleteFavorite" parameterType="hashmap">
+        <![CDATA[
+            DELETE FROM article_mst 
+            WHERE 
+              user_id    = #{userId},
+              article_id = #{articleId}
+        ]]>
+    </delete>
+
+    <update id="updateFavoriteNum" parameterType="int">
+      <![CDATA[
+          UPDATE	article_mst
+             SET	favorite_num = (SELECT COUNT(*) FROM article_like WHERE article_id = #{articleId})
+          WHERE   id = #{articleId}
+      ]]>
+    </update>
 </mapper>