Skip to content

Commit

Permalink
Merge pull request #674 from bounswe/main
Browse files Browse the repository at this point in the history
Deploying the comment feature
  • Loading branch information
halisbal authored Nov 13, 2023
2 parents 37186b7 + ede6aea commit d5f8989
Show file tree
Hide file tree
Showing 14 changed files with 681 additions and 201 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.app.gamereview.controller;

import com.app.gamereview.dto.request.comment.CreateCommentRequestDto;
import com.app.gamereview.dto.request.comment.EditCommentRequestDto;
import com.app.gamereview.dto.request.comment.ReplyCommentRequestDto;
import com.app.gamereview.model.Comment;
import com.app.gamereview.model.User;
import com.app.gamereview.service.CommentService;
import com.app.gamereview.util.validation.annotation.AuthorizationRequired;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/comment")
@Validated
public class CommentController {

private final CommentService commentService;

@Autowired
public CommentController(CommentService commentService) {
this.commentService = commentService;
}


@AuthorizationRequired
@PostMapping("/create")
public ResponseEntity<Comment> createComment(@Valid @RequestBody CreateCommentRequestDto comment, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Comment commentToCreate = commentService.createComment(comment, user);
return ResponseEntity.ok(commentToCreate);
}

@AuthorizationRequired
@PostMapping("/reply")
public ResponseEntity<Comment> createReply(@Valid @RequestBody ReplyCommentRequestDto reply, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Comment commentToCreate = commentService.replyComment(reply, user);
return ResponseEntity.ok(commentToCreate);
}

@AuthorizationRequired
@PostMapping("/edit")
public ResponseEntity<Comment> editComment(@RequestParam String id, @Valid @RequestBody EditCommentRequestDto comment, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Comment editedComment = commentService.editComment(id, comment, user);
return ResponseEntity.ok(editedComment);
}

@AuthorizationRequired
@DeleteMapping("/delete")
public ResponseEntity<Comment> deleteComment(@RequestParam String id, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Comment deletedComment = commentService.deleteComment(id, user);
return ResponseEntity.ok(deletedComment);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.List;

import com.app.gamereview.dto.request.post.EditPostRequestDto;
import com.app.gamereview.dto.response.comment.GetPostCommentsResponseDto;
import com.app.gamereview.model.User;
import com.app.gamereview.util.validation.annotation.AuthorizationRequired;
import jakarta.servlet.http.HttpServletRequest;
Expand All @@ -25,48 +26,56 @@
@Validated
public class PostController {

private final PostService postService;
private final PostService postService;

@Autowired
public PostController(PostService postService) {
this.postService = postService;
}
@Autowired
public PostController(PostService postService) {
this.postService = postService;
}

@GetMapping("/get-post-list")
public ResponseEntity<List<GetPostListResponseDto>> getPostList(@Valid @ParameterObject GetPostListFilterRequestDto filter) {
List<GetPostListResponseDto> posts = postService.getPostList(filter);
return ResponseEntity.ok(posts);
}
@GetMapping("/get-post-list")
public ResponseEntity<List<GetPostListResponseDto>> getPostList(@Valid @ParameterObject GetPostListFilterRequestDto filter) {
List<GetPostListResponseDto> posts = postService.getPostList(filter);
return ResponseEntity.ok(posts);
}

@AuthorizationRequired
@GetMapping("/get-post-detail")
public ResponseEntity<Post> getPostDetail(@RequestParam String id, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Post post = postService.getPostById(id, user);
return ResponseEntity.ok(post);
}
@AuthorizationRequired
@GetMapping("/get-post-detail")
public ResponseEntity<Post> getPostDetail(@RequestParam String id, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Post post = postService.getPostById(id, user);
return ResponseEntity.ok(post);
}

@AuthorizationRequired
@PostMapping("/create")
public ResponseEntity<Post> createPost(@Valid @RequestBody CreatePostRequestDto post, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Post postToCreate = postService.createPost(post, user);
return ResponseEntity.ok(postToCreate);
}
@AuthorizationRequired
@GetMapping("/get-post-comments")
public ResponseEntity<List<GetPostCommentsResponseDto>> getPostComments(@RequestParam String id, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
List<GetPostCommentsResponseDto> comments = postService.getCommentList(id, user);
return ResponseEntity.ok(comments);
}

@AuthorizationRequired
@PostMapping("/edit")
public ResponseEntity<Post> editPost(@RequestParam String id, @Valid @RequestBody EditPostRequestDto post, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Post editedPost = postService.editPost(id, post, user);
return ResponseEntity.ok(editedPost);
}
@AuthorizationRequired
@PostMapping("/create")
public ResponseEntity<Post> createPost(@Valid @RequestBody CreatePostRequestDto post, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Post postToCreate = postService.createPost(post, user);
return ResponseEntity.ok(postToCreate);
}

@AuthorizationRequired
@DeleteMapping("/delete")
public ResponseEntity<Post> deletePost(@RequestParam String id, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Post deletedPost = postService.deletePost(id, user);
return ResponseEntity.ok(deletedPost);
}
@AuthorizationRequired
@PostMapping("/edit")
public ResponseEntity<Post> editPost(@RequestParam String id, @Valid @RequestBody EditPostRequestDto post, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Post editedPost = postService.editPost(id, post, user);
return ResponseEntity.ok(editedPost);
}

@AuthorizationRequired
@DeleteMapping("/delete")
public ResponseEntity<Post> deletePost(@RequestParam String id, @RequestHeader String Authorization, HttpServletRequest request) {
User user = (User) request.getAttribute("authenticatedUser");
Post deletedPost = postService.deletePost(id, user);
return ResponseEntity.ok(deletedPost);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.app.gamereview.dto.request.comment;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class CreateCommentRequestDto {

private String commentContent;

@NotNull(message = "Post Id cannot be null or empty.")
@Pattern(regexp = "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
message = "Post has invalid Id (UUID) format")
private String post;


// TODO annotations
// TODO achievements
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.app.gamereview.dto.request.comment;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class EditCommentRequestDto {

private String commentContent;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.app.gamereview.dto.request.comment;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class ReplyCommentRequestDto {

private String commentContent;


@NotNull(message = "Parent Comment Id cannot be null or empty.")
@Pattern(regexp = "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
message = "Comment has invalid Id (UUID) format")
private String parentComment;

// TODO annotations
// TODO achievements
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.app.gamereview.dto.response.comment;

import com.app.gamereview.model.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommentReplyResponseDto {

private String id;

private String commentContent;

private User commenter;

private String post;

private LocalDateTime lastEditedAt;

private LocalDateTime createdAt;

private Boolean isEdited;

private int overallVote; // overallVote = # of upvote - # of downvote

private int voteCount; // voteCount = # of upvote + # of downvote

// TODO reports
// TODO annotations
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.app.gamereview.dto.response.comment;

import com.app.gamereview.model.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.ArrayList;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class GetPostCommentsResponseDto {

private String id;

private String commentContent;

private User commenter;

private String post;

private LocalDateTime lastEditedAt;

private LocalDateTime createdAt;

private Boolean isEdited;

private int overallVote; // overallVote = # of upvote - # of downvote

private int voteCount; // voteCount = # of upvote + # of downvote

private ArrayList<CommentReplyResponseDto> replies;

// TODO reports
// TODO annotations
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ public class GetPostListResponseDto {

private int voteCount; // voteCount = # of upvote + # of downvote

private int commentCount;

// TODO reports
// TODO comments
// TODO annotations
Expand Down
58 changes: 58 additions & 0 deletions app/backend/src/main/java/com/app/gamereview/model/Comment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.app.gamereview.model;

import com.app.gamereview.enums.VoteChoice;
import com.app.gamereview.model.common.BaseModel;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;

import java.time.LocalDateTime;

@Document(collection = "Comment")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Comment extends BaseModel {

private String commentContent;

private String commenter;

@NotNull
private String post;

private String parentComment;

private LocalDateTime lastEditedAt;

private int overallVote; // overallVote = # of upvote - # of downvote

private int voteCount; // voteCount = # of upvote + # of downvote

// TODO reports
// TODO annotations

public void addVote(VoteChoice choice) {
voteCount += 1;
if (choice.name().equals("UPVOTE")) {
overallVote += 1;
} else if (choice.name().equals("DOWNVOTE")) {
overallVote -= 1;
}
}

public void deleteVote(VoteChoice choice) {
voteCount -= 1;
if (choice.name().equals("UPVOTE")) {
overallVote -= 1;
} else if (choice.name().equals("DOWNVOTE")) {
overallVote += 1;
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ public class Post extends BaseModel {
private int voteCount; // voteCount = # of upvote + # of downvote

// TODO reports
// TODO comments
// TODO annotations
// TODO achievements

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.app.gamereview.repository;

import com.app.gamereview.model.Comment;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.List;

public interface CommentRepository extends MongoRepository<Comment, String> {
List<Comment> findByPost(String postId);

int countByPost(String postId);
}
Loading

0 comments on commit d5f8989

Please sign in to comment.