review-api/src/main/java/com/guams/review/controller/CommentController.java
2025-01-12 16:41:26 +01:00

88 lines
4.0 KiB
Java

package com.guams.review.controller;
import com.guams.review.exception.ForbiddenExecption;
import com.guams.review.exception.NotFoundException;
import com.guams.review.model.AuthorRepository;
import com.guams.review.model.dao.Author;
import com.guams.review.model.dao.Comment;
import com.guams.review.model.dao.CommentIds;
import com.guams.review.service.AuthorService;
import com.guams.review.service.CommentService;
import com.guams.review.service.PostService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.List;
@RestController
@RequestMapping(path = "api/comments")
@RequiredArgsConstructor
public class CommentController {
private final CommentService commentService;
private final AuthorRepository authorRepository;
private final PostService postService;
private final AuthorService authorService;
@GetMapping
public List<Comment> listAllComments() {
return commentService.list();
}
@GetMapping("/{id}")
public Comment getCommentById(@PathVariable("id") Long id) {
return commentService.findById(id).orElseThrow(() -> new NotFoundException("Comment not found"));
}
@PostMapping("/posts/{post-id}")
public ResponseEntity<Comment> addComment(@RequestBody Comment comment, Authentication authentication, @PathVariable("post-id") Long postId) {
if (authentication == null || !authentication.isAuthenticated()) {
throw new ForbiddenExecption("You are not authorized to access this resource");
}
Author author = authorRepository.findByName(authentication.getName()).orElseThrow(() -> new NotFoundException("Author not found"));
Comment insertedComment = commentService.insert(comment
.setCommentDate(Timestamp.from(Instant.now()))
.setIsUpdated(false));
postService.findById(postId).orElseThrow(() -> new NotFoundException("Post not found"));
commentService.associateCommentToPostAndAuthor(author.getId(), postId, insertedComment.getId());
return new ResponseEntity<>(insertedComment, HttpStatus.CREATED);
}
@GetMapping("/posts/{post-id}")
public List<Comment> listCommentsByPostId(@PathVariable("post-id") Long postId) {
postService.findById(postId).orElseThrow(() -> new NotFoundException("Post not found"));
return commentService.getCommentsByCommentId(postId);
}
@PutMapping("/{id}")
public void updateComment(@PathVariable Long id, @RequestBody CommentIds commentIds, Authentication authentication) {
if (authentication == null || !authentication.isAuthenticated()) {
throw new ForbiddenExecption("You are not authorized to access this resource");
}
Author author = authorService.findByName(authentication.getName()).orElseThrow(() -> new NotFoundException("Author not found"));
Comment commentToUpdate = commentService.findById(id).orElseThrow(() -> new NotFoundException("Comment not found"));
CommentIds concernedCommentIds = commentService.getCommentIdsByCommentId(id).orElseThrow(() -> new NotFoundException("Comment not found"));
if (!author.getId().equals(concernedCommentIds.getAuthorId())) {
throw new ForbiddenExecption("You are not authorized to access this resource");
}
commentService.insert(commentToUpdate
.setIsUpdated(true)
.setContent(commentIds.getContent()));
}
@DeleteMapping("/{id}")
public void deleteComment(@PathVariable Long id, Authentication authentication) {
Comment commentToDelete = commentService.findById(id).orElseThrow(() -> new NotFoundException("Comment not found"));
commentService.delete(commentToDelete);
commentService.deleteAssociationByCommentId(commentToDelete.getId());
}
}