diff --git a/src/main/java/site/easystartup/web/post/controller/PostController.java b/src/main/java/site/easystartup/web/post/controller/PostController.java index 672c2c9..7bd33e2 100644 --- a/src/main/java/site/easystartup/web/post/controller/PostController.java +++ b/src/main/java/site/easystartup/web/post/controller/PostController.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.*; import site.easystartup.web.domain.model.User; import site.easystartup.web.domain.response.MessageResponse; import site.easystartup.web.domain.validation.ResponseErrorValidation; +import site.easystartup.web.exception.NoPermissionException; import site.easystartup.web.post.domain.model.Post; import site.easystartup.web.post.domain.request.PostRequest; import site.easystartup.web.post.dto.PostDto; @@ -39,7 +40,7 @@ public class PostController { return ResponseEntity.ok().body(posts); } - @GetMapping("/new") + @PostMapping("/new") public ResponseEntity createPost(@Valid @RequestBody PostRequest postRequest, BindingResult bindingResult, Principal principal) { var errors = responseErrorValidation.mapValidationService(bindingResult); @@ -49,37 +50,47 @@ public class PostController { return ResponseEntity.ok().body(modelMapper.map(post, PostRequest.class)); } - @GetMapping("/{username}") + @GetMapping("/user/{username}") public ResponseEntity> user(@PathVariable String username) { var posts = postService.getAllPostsByAuthor(username) .stream().map(post -> modelMapper.map(post, PostDto.class)).toList(); return ResponseEntity.ok().body(posts); } - /* - @PutMapping("/message/{message_id}/edit") - public ResponseEntity messageEdit(@Valid @RequestBody PostRequest messageRequest, - @PathVariable long message_id, - BindingResult bindingResult, - Principal principal) { + @GetMapping("/{post_id}/edit/") + public ResponseEntity edit(@Valid @RequestBody PostRequest postRequest, BindingResult bindingResult, + Principal principal, @PathVariable long post_id) { var errors = responseErrorValidation.mapValidationService(bindingResult); if (!ObjectUtils.isEmpty(errors)) return errors; - var messageUpdated = forumService.editDiscussionMessage(messageRequest, message_id, principal); - return ResponseEntity.ok().body(modelMapper.map(messageUpdated, PostDto.class)); + Post post = postService.edit(postRequest, post_id, principal); + return ResponseEntity.ok().body(modelMapper.map(post, PostRequest.class)); } - @DeleteMapping("/message/{message_id}/delete") - public ResponseEntity messageDelete(@PathVariable long message_id, Principal principal) { - Post message = forumService.getDiscussionMessageById(message_id); - User user = userService.getUserByPrincipal(principal); - if(!(message.getSender().equals(user.getUsername()) && user.isModer())) - return ResponseEntity.ok(new MessageResponse("No permissions!")); - forumService.deleteDiscussionMessage(message_id, user); - return ResponseEntity.ok(new MessageResponse("Message was deleted!")); + @DeleteMapping("/{post_id}/delete") + public void delete(@PathVariable long post_id, + Principal principal) { + Post post = postService.getPostById(post_id); + if(!post.getSender().equals(principal.getName()) && !userService.getUserByPrincipal(principal).isAdmin()) + throw new NoPermissionException(String.format("User %s cant delete post %s", principal.getName(), post_id)); + else postService.delete(post); } - */ + @PutMapping("/{post_id}/like/") + public ResponseEntity like(Principal principal, @PathVariable long post_id) { + Post post = postService.getPostById(post_id); + + Post edited = postService.addLike(post, principal); + return ResponseEntity.ok().body(modelMapper.map(edited, PostRequest.class)); + } + + @PutMapping("/{post_id}/dislike/") + public ResponseEntity dislike(Principal principal, @PathVariable long post_id) { + Post post = postService.getPostById(post_id); + + Post edited = postService.disLike(post, principal); + return ResponseEntity.ok().body(modelMapper.map(edited, PostRequest.class)); + } } diff --git a/src/main/java/site/easystartup/web/post/domain/exception/AlreadyLikedException.java b/src/main/java/site/easystartup/web/post/domain/exception/AlreadyLikedException.java new file mode 100644 index 0000000..fc98f9d --- /dev/null +++ b/src/main/java/site/easystartup/web/post/domain/exception/AlreadyLikedException.java @@ -0,0 +1,7 @@ +package site.easystartup.web.post.domain.exception; + +public class AlreadyLikedException extends RuntimeException { + public AlreadyLikedException(String message) { + super(message); + } +} diff --git a/src/main/java/site/easystartup/web/post/domain/exception/DontLickedException.java b/src/main/java/site/easystartup/web/post/domain/exception/DontLickedException.java new file mode 100644 index 0000000..2c083d5 --- /dev/null +++ b/src/main/java/site/easystartup/web/post/domain/exception/DontLickedException.java @@ -0,0 +1,7 @@ +package site.easystartup.web.post.domain.exception; + +public class DontLickedException extends RuntimeException{ + public DontLickedException(String message) { + super(message); + } +} diff --git a/src/main/java/site/easystartup/web/post/domain/model/Post.java b/src/main/java/site/easystartup/web/post/domain/model/Post.java index 94066c9..d079cc7 100644 --- a/src/main/java/site/easystartup/web/post/domain/model/Post.java +++ b/src/main/java/site/easystartup/web/post/domain/model/Post.java @@ -30,6 +30,11 @@ public class Post implements Comparable{ @ElementCollection(targetClass = Long.class, fetch = FetchType.EAGER) @CollectionTable(name = "post_answers", joinColumns = @JoinColumn(name = "post_id")) private List answers; + + @ElementCollection(targetClass = Long.class, fetch = FetchType.EAGER) + @CollectionTable(name = "post_licked_users", joinColumns = @JoinColumn(name = "post_id")) + private List liked_users; + private Long answered_post; @Column(name = "date", updatable = false) diff --git a/src/main/java/site/easystartup/web/post/domain/request/PostRequest.java b/src/main/java/site/easystartup/web/post/domain/request/PostRequest.java index 0e1b426..c557906 100644 --- a/src/main/java/site/easystartup/web/post/domain/request/PostRequest.java +++ b/src/main/java/site/easystartup/web/post/domain/request/PostRequest.java @@ -19,7 +19,7 @@ public class PostRequest { private String sender; private Date date; private boolean edited; - private long discussion_id; + private List liked_users; private long like; private List answers; private Long answered_post; diff --git a/src/main/java/site/easystartup/web/post/dto/PostDto.java b/src/main/java/site/easystartup/web/post/dto/PostDto.java index d8608dc..ab4ef90 100644 --- a/src/main/java/site/easystartup/web/post/dto/PostDto.java +++ b/src/main/java/site/easystartup/web/post/dto/PostDto.java @@ -17,7 +17,7 @@ public class PostDto implements Serializable { private String sender; private Date date; private boolean edited; - private long discussion_id; + private List liked_users; private long like; private List answers; private long answered_post; diff --git a/src/main/java/site/easystartup/web/post/service/PostService.java b/src/main/java/site/easystartup/web/post/service/PostService.java index b72f423..16c3bd4 100644 --- a/src/main/java/site/easystartup/web/post/service/PostService.java +++ b/src/main/java/site/easystartup/web/post/service/PostService.java @@ -3,12 +3,14 @@ package site.easystartup.web.post.service; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import site.easystartup.web.post.domain.exception.AlreadyLikedException; import site.easystartup.web.post.domain.exception.PostNotFoundException; import site.easystartup.web.post.domain.model.Post; import site.easystartup.web.post.domain.request.PostRequest; import site.easystartup.web.post.repo.PostRepo; import java.security.Principal; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -34,6 +36,50 @@ public class PostService { post.setLike(0); post.setSender(principal.getName()); post.setText(postRequest.getText()); + checkAnswers(post); + return postRepo.save(post); + } + + public Post edit(PostRequest postRequest, long post_id, Principal principal) { + Post post = postRepo.findById(post_id).orElseThrow( + new PostNotFoundException("Post with id " + post_id + " didnt exists")); + post.setEdited(true); + post.setSender(principal.getName()); + post.setText(postRequest.getText()); + checkAnswers(post); + return postRepo.save(post); + } + + public void delete(Post post) { + postRepo.delete(post); + } + + public void checkAnswers(Post post) { + if(post.getAnswered_post() != null) { + Post answered = postRepo.findById(post.getAnswered_post()).orElseThrow( + new PostNotFoundException("Post didnt exists: " + post.getAnswered_post())); + List answers = answered.getAnswers() != null ? answered.getAnswers() : new ArrayList<>(); + answers.add(post.getId()); + answered.setAnswers(answers); + postRepo.save(answered); + } + } + + public Post addLike(Post post, Principal principal) { + if (post.getLiked_users().contains(principal.getName())) + throw new AlreadyLikedException(String.format("User %s already liked post %s", principal.getName(), post.getId())); + post.setLike(post.getLike() + 1); + List liked = post.getLiked_users() == null ? new ArrayList<>() : post.getLiked_users(); + liked.add(principal.getName()); + return postRepo.save(post); + } + + public Post disLike(Post post, Principal principal) { + if (!post.getLiked_users().contains(principal.getName())) + throw new AlreadyLikedException(String.format("User %s already liked post %s", principal.getName(), post.getId())); + post.setLike(post.getLike() - 1); + List liked = post.getLiked_users() == null ? new ArrayList<>() : post.getLiked_users(); + liked.remove(principal.getName()); return postRepo.save(post); } }