diff --git a/src/main/java/site/easystartup/web/auth/controller/RegistrationController.java b/src/main/java/site/easystartup/web/auth/controller/RegistrationController.java index 662aed5..01ad6ad 100644 --- a/src/main/java/site/easystartup/web/auth/controller/RegistrationController.java +++ b/src/main/java/site/easystartup/web/auth/controller/RegistrationController.java @@ -7,8 +7,8 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; -import site.easystartup.web.domain.Role; -import site.easystartup.web.domain.User; +import site.easystartup.web.domain.model.Role; +import site.easystartup.web.domain.model.User; import site.easystartup.web.repo.UserRepo; import java.util.Collections; diff --git a/src/main/java/site/easystartup/web/domain/Role.java b/src/main/java/site/easystartup/web/domain/model/Role.java similarity index 56% rename from src/main/java/site/easystartup/web/domain/Role.java rename to src/main/java/site/easystartup/web/domain/model/Role.java index f76beae..4ef9c82 100644 --- a/src/main/java/site/easystartup/web/domain/Role.java +++ b/src/main/java/site/easystartup/web/domain/model/Role.java @@ -1,4 +1,4 @@ -package site.easystartup.web.domain; +package site.easystartup.web.domain.model; public enum Role { USER, PREMIUM, MODER, ADMIN; diff --git a/src/main/java/site/easystartup/web/domain/User.java b/src/main/java/site/easystartup/web/domain/model/User.java similarity index 98% rename from src/main/java/site/easystartup/web/domain/User.java rename to src/main/java/site/easystartup/web/domain/model/User.java index 51253cd..614093b 100644 --- a/src/main/java/site/easystartup/web/domain/User.java +++ b/src/main/java/site/easystartup/web/domain/model/User.java @@ -1,4 +1,4 @@ -package site.easystartup.web.domain; +package site.easystartup.web.domain.model; import lombok.*; import org.hibernate.Hibernate; diff --git a/src/main/java/site/easystartup/web/project/domain/payload/response/ResponseMessage.java b/src/main/java/site/easystartup/web/domain/response/ResponseMessage.java similarity index 73% rename from src/main/java/site/easystartup/web/project/domain/payload/response/ResponseMessage.java rename to src/main/java/site/easystartup/web/domain/response/ResponseMessage.java index 023f4f3..039902c 100644 --- a/src/main/java/site/easystartup/web/project/domain/payload/response/ResponseMessage.java +++ b/src/main/java/site/easystartup/web/domain/response/ResponseMessage.java @@ -1,4 +1,4 @@ -package site.easystartup.web.project.domain.payload.response; +package site.easystartup.web.domain.response; import lombok.Data; diff --git a/src/main/java/site/easystartup/web/project/domain/validation/ResponseErrorValidation.java b/src/main/java/site/easystartup/web/domain/validation/ResponseErrorValidation.java similarity index 95% rename from src/main/java/site/easystartup/web/project/domain/validation/ResponseErrorValidation.java rename to src/main/java/site/easystartup/web/domain/validation/ResponseErrorValidation.java index 607ffa0..7d52187 100644 --- a/src/main/java/site/easystartup/web/project/domain/validation/ResponseErrorValidation.java +++ b/src/main/java/site/easystartup/web/domain/validation/ResponseErrorValidation.java @@ -1,4 +1,4 @@ -package site.easystartup.web.project.domain.validation; +package site.easystartup.web.domain.validation; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/site/easystartup/web/exception/NoPermissionException.java b/src/main/java/site/easystartup/web/exception/NoPermissionException.java new file mode 100644 index 0000000..6948923 --- /dev/null +++ b/src/main/java/site/easystartup/web/exception/NoPermissionException.java @@ -0,0 +1,7 @@ +package site.easystartup.web.exception; + +public class NoPermissionException extends RuntimeException { + public NoPermissionException(String username) { + super("User " + username + " do not have access for this action"); + } +} diff --git a/src/main/java/site/easystartup/web/forum/controller/ForumController.java b/src/main/java/site/easystartup/web/forum/controller/ForumController.java index 6b865aa..6af7b20 100644 --- a/src/main/java/site/easystartup/web/forum/controller/ForumController.java +++ b/src/main/java/site/easystartup/web/forum/controller/ForumController.java @@ -2,165 +2,158 @@ package site.easystartup.web.forum.controller; import lombok.RequiredArgsConstructor; import lombok.val; +import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.util.ObjectUtils; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import site.easystartup.web.domain.User; -import site.easystartup.web.forum.domain.Discussion; -import site.easystartup.web.forum.domain.DiscussionMessage; -import site.easystartup.web.forum.domain.DiscussionStatus; -import site.easystartup.web.forum.domain.Topic; +import site.easystartup.web.domain.model.User; +import site.easystartup.web.domain.response.ResponseMessage; +import site.easystartup.web.domain.validation.ResponseErrorValidation; +import site.easystartup.web.forum.domain.model.Discussion; +import site.easystartup.web.forum.domain.model.DiscussionMessage; +import site.easystartup.web.forum.domain.model.DiscussionStatus; +import site.easystartup.web.forum.domain.model.Topic; +import site.easystartup.web.forum.domain.request.DiscussionMessageRequest; +import site.easystartup.web.forum.domain.request.DiscussionRequest; +import site.easystartup.web.forum.domain.request.TopicRequest; +import site.easystartup.web.forum.dto.DiscussionDto; +import site.easystartup.web.forum.dto.DiscussionMessageDto; +import site.easystartup.web.forum.dto.TopicDto; import site.easystartup.web.forum.service.ForumService; import site.easystartup.web.forum.repo.TopicRepo; +import site.easystartup.web.project.domain.model.Project; +import site.easystartup.web.project.domain.requst.ProjectRequest; +import site.easystartup.web.project.dto.ProjectDto; import site.easystartup.web.service.UserService; -import java.util.Date; +import javax.validation.Valid; +import java.security.Principal; +import java.util.List; +import java.util.stream.Collectors; -@Controller +@RestController +@RequestMapping("/forum") @RequiredArgsConstructor(onConstructor_ = @Autowired) public class ForumController { - private final TopicRepo topicRepo; - private final ForumService forumService; - private final UserService userService; + private final ModelMapper modelMapper; + private final ResponseErrorValidation responseErrorValidation; - @GetMapping("/forum") - public String forumMain(Model model) { - val topic = topicRepo.findAll(); - model.addAttribute("topics", topic); - return "/forum"; + @GetMapping("/") + public ResponseEntity> main(@Valid @RequestBody ProjectRequest projectRequest, + BindingResult bindingResult, + Principal principal) { + val topics = forumService.getAllTopics() + .stream().map(topic -> modelMapper.map(topic, TopicDto.class)).collect(Collectors.toList()); + return ResponseEntity.ok().body(topics); } - @GetMapping("/forum/my") - public String forumMy(Model model) { - User user = userService.getCurrentUser(); - val discussions = forumService.getDiscussionsByAuthor(user.getUsername()); - model.addAttribute("discussions", discussions); - return "/my-discussions"; + @GetMapping("/my") + public ResponseEntity> my(Principal principal) { + val discussions = forumService.getDiscussionsByAuthor(principal) + .stream().map(discussion -> modelMapper.map(discussion, DiscussionDto.class)).toList(); + return ResponseEntity.ok().body(discussions); } - @GetMapping("/forum/new") - public String forumNew() { - return "topic-new"; + @GetMapping("/takepart") + public ResponseEntity> takePart(Principal principal) { + val discussions = forumService.getDiscussionsByMember(principal) + .stream().map(discussion -> modelMapper.map(discussion, DiscussionDto.class)).toList(); + return ResponseEntity.ok().body(discussions); } @Secured({"ADMIN", "MODER"}) - @PostMapping("/forum/new") - public String forumNewTopic(@RequestParam String title, - @RequestParam String description) { - forumService.createTopic(title, description, userService.getCurrentUser()); - return "/forum"; + @PostMapping("/new") + public ResponseEntity forumNew(@Valid @RequestBody TopicRequest topicRequest, + BindingResult bindingResult, + Principal principal) { + val errors = responseErrorValidation.mapValidationService(bindingResult); + if (!ObjectUtils.isEmpty(errors)) return errors; + Topic topic = forumService.createTopic(topicRequest, principal); + return ResponseEntity.ok().body(modelMapper.map(topic, TopicDto.class)); } - @GetMapping("/forum/{topic_id}") - public String topicFirstPage(@PathVariable(value = "topic_id") long topic_id, - Model model) { - val pinned_discussions = forumService.getPinnedDiscussionsByTopicId(topic_id); - model.addAttribute("pinned_discussions", pinned_discussions); - val discussions = forumService.getSortedDiscussionsByTopicId(topic_id).subList(0, 14); - model.addAttribute("discussions", discussions); - return "/topic-first"; + @GetMapping("/{topic_id}/{page_id}") + public ResponseEntity> topicPage(@PathVariable long topic_id, + @PathVariable long page_id) { + List discussions = forumService.getDiscussionsByPage(topic_id, page_id) + .stream().map(discussion -> modelMapper.map(discussion, DiscussionDto.class)).toList(); + return ResponseEntity.ok().body(discussions); } - @GetMapping("/forum/{topic_id}/page/{page_index}") - public String topicPage(@PathVariable(value = "topic_id") long topic_id, - @PathVariable(value = "page_index") long page_index, - Model model) { - val discussions = forumService.getSortedDiscussionsByTopicId(topic_id).subList((int)(15 * page_index), (int)(15 * page_index) + 15); - model.addAttribute("discussions", discussions); - return "/topic-content"; + @GetMapping("/discussion/{discussion_id}") + public ResponseEntity discussion(@PathVariable(value = "discussion_id") long discussion_id) { + return ResponseEntity.ok().body(modelMapper.map(forumService.getDiscussionById(discussion_id), DiscussionDto.class)); } - @GetMapping("/forum/discussion/{discussion_id}") - public String discussion(@PathVariable(value = "discussion_id") long discussion_id, - Model model) { - model.addAttribute("discussion", forumService.getDiscussionById(discussion_id)); - model.addAttribute("messages ", forumService.getMessagesByDiscussionId(discussion_id)); - return "/discussion"; + @PostMapping("/{topic_id}/new") + public ResponseEntity discussionNew(@PathVariable long topic_id, + @Valid @RequestBody DiscussionRequest discussionRequest, + BindingResult bindingResult, + Principal principal) { + val errors = responseErrorValidation.mapValidationService(bindingResult); + if (!ObjectUtils.isEmpty(errors)) return errors; + + val discussion = forumService.createDiscussion(discussionRequest, topic_id, principal); + return ResponseEntity.ok().body(modelMapper.map(discussion, DiscussionDto.class)); } - @GetMapping("/forum/{topic_id}/create") - public String discussionCreate(@PathVariable long topic_id) { - return "/discussion-create"; + @PutMapping("/discussion/{discussion_id}/edit") + public ResponseEntity discussionEdit(@Valid @RequestBody DiscussionRequest discussionRequest, + @PathVariable long discussion_id, + BindingResult bindingResult, + Principal principal) { + val errors = responseErrorValidation.mapValidationService(bindingResult); + if (!ObjectUtils.isEmpty(errors)) return errors; + + val discussionUpdated = forumService.editDiscussion(discussionRequest, discussion_id, principal); + return ResponseEntity.ok().body(modelMapper.map(discussionUpdated, DiscussionDto.class)); } - @PostMapping("/forum/{topic_id}/create") - public String discussionCreatePost(@PathVariable long topic_id, - @RequestParam String title) { - forumService.createDiscussion(title, topic_id, userService.getCurrentUser()); - return "/discussion-create"; + @PostMapping("/discussion/{discussion_id}/new") + public ResponseEntity messageAdd(@PathVariable long discussion_id, + @Valid @RequestBody DiscussionMessageRequest messageRequest, + BindingResult bindingResult, + Principal principal) { + val errors = responseErrorValidation.mapValidationService(bindingResult); + if (!ObjectUtils.isEmpty(errors)) return errors; + + val discussionMessage = forumService.createDiscussionMessage(messageRequest, discussion_id, principal); + return ResponseEntity.ok().body(modelMapper.map(discussionMessage, DiscussionMessageDto.class)); } - @GetMapping("/forum/discussion/{discussion_id}/edit") - public String discussionEdit(@PathVariable long discussion_id, Model model) { - Discussion discussion = forumService.getDiscussionById(discussion_id); - User user = userService.getCurrentUser(); - if(!(discussion.getAuthor().equals(user.getUsername()) || user.isModer())) return "/403-error"; - model.addAttribute("discussion", discussion); - return "/discussion-edit"; + @GetMapping("/message/{message_id}") + public ResponseEntity message(@PathVariable long message_id) { + return ResponseEntity.ok().body(modelMapper.map(forumService.getDiscussionMessageById(message_id), DiscussionMessageDto.class)); } - @PostMapping("/forum/discussion/{discussion_id}/edit") - public String discussionEditPost(@PathVariable long discussion_id, - @RequestParam String title, - @RequestParam DiscussionStatus status, - Model model) { - forumService.editDiscussion(title, discussion_id, status, userService.getCurrentUser()); - model.addAttribute("discussion", forumService.getDiscussionById(discussion_id)); - model.addAttribute("messages ", forumService.getMessagesByDiscussionId(discussion_id)); - return "/discussion"; - } - - @GetMapping("/forum/discussion/{discussion_id}/add") - public String messageAdd(@PathVariable long discussion_id) { - return "/discussion-message-add"; - } - - @PostMapping("/forum/discussion/{discussion_id}/add") - public String messageAddPost(@PathVariable long discussion_id, - @RequestParam String text, - Model model) { - forumService.addDiscussionMessage(text, discussion_id, userService.getCurrentUser()); - model.addAttribute("discussion", forumService.getDiscussionById(discussion_id)); - model.addAttribute("messages ", forumService.getMessagesByDiscussionId(discussion_id)); - return "/discussion"; - } - - @GetMapping("/forum/discussion/{discussion_id}/{message_id}/edit") - public String messageEdit(@PathVariable long discussion_id, - @PathVariable long message_id) { - DiscussionMessage message = forumService.getDiscussionMessageById(message_id); - User user = userService.getCurrentUser(); - if(!(message.getSender().equals(user.getUsername()) || user.isModer())) return "/403-error"; - return "/discussion-message-edit"; - } - - @PostMapping("/forum/discussion/{discussion_id}/{message_id}/edit") - public String messageEditPost(@PathVariable long discussion_id, - @RequestParam String text, - Model model, @PathVariable String message_id) { - forumService.editDiscussionMessage(text, discussion_id, userService.getCurrentUser()); - model.addAttribute("discussion", forumService.getDiscussionById(discussion_id)); - model.addAttribute("messages ", forumService.getMessagesByDiscussionId(discussion_id)); - return "/discussion"; - } - - @DeleteMapping("/forum/discussion/{discussion_id}/{message_id}/delete") - public String messageDelete(@PathVariable long discussion_id, + @PutMapping("/message/{message_id}/edit") + public ResponseEntity messageEdit(@Valid @RequestBody DiscussionMessageRequest messageRequest, @PathVariable long message_id, - Model model) { - DiscussionMessage message = forumService.getDiscussionMessageById(message_id); - User user = userService.getCurrentUser(); - if(!(message.getSender().equals(user.getUsername()) || user.isModer())) return "/403-error"; + BindingResult bindingResult, + Principal principal) { + val errors = responseErrorValidation.mapValidationService(bindingResult); + if (!ObjectUtils.isEmpty(errors)) return errors; - model.addAttribute("discussion", forumService.getDiscussionById(discussion_id)); - model.addAttribute("messages ", forumService.getMessagesByDiscussionId(discussion_id)); - return "/discussion"; + val messageUpdated = forumService.editDiscussionMessage(messageRequest, message_id, principal); + return ResponseEntity.ok().body(modelMapper.map(messageUpdated, DiscussionMessageDto.class)); + } + + @DeleteMapping("/forum/message/{message_id}/delete") + public ResponseEntity messageDelete(@PathVariable long message_id, Principal principal) { + DiscussionMessage message = forumService.getDiscussionMessageById(message_id); + User user = userService.getUserByPrincipal(principal); + if(!(message.getSender().equals(user.getUsername()) || user.isModer())) + return ResponseEntity.ok(new ResponseMessage("No permissions!")); + forumService.deleteDiscussionMessage(message_id, user); + return ResponseEntity.ok(new ResponseMessage("Message was deleted!")); } diff --git a/src/main/java/site/easystartup/web/forum/domain/exception/DiscussionMessageNotFoundException.java b/src/main/java/site/easystartup/web/forum/domain/exception/DiscussionMessageNotFoundException.java new file mode 100644 index 0000000..8a615c3 --- /dev/null +++ b/src/main/java/site/easystartup/web/forum/domain/exception/DiscussionMessageNotFoundException.java @@ -0,0 +1,21 @@ +package site.easystartup.web.forum.domain.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +import java.util.function.Supplier; + +@ResponseStatus(HttpStatus.BAD_REQUEST) +public class DiscussionMessageNotFoundException extends RuntimeException implements Supplier { + private String message; + + public DiscussionMessageNotFoundException(String message) { + super(message); + this.message = message; + } + + @Override + public DiscussionMessageNotFoundException get() { + return this; + } +} diff --git a/src/main/java/site/easystartup/web/forum/domain/exception/DiscussionNotFoundException.java b/src/main/java/site/easystartup/web/forum/domain/exception/DiscussionNotFoundException.java new file mode 100644 index 0000000..9b929ae --- /dev/null +++ b/src/main/java/site/easystartup/web/forum/domain/exception/DiscussionNotFoundException.java @@ -0,0 +1,18 @@ +package site.easystartup.web.forum.domain.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +import java.util.function.Supplier; + +@ResponseStatus(HttpStatus.BAD_REQUEST) +public class DiscussionNotFoundException extends RuntimeException implements Supplier { + public DiscussionNotFoundException(String message) { + super(message); + } + + @Override + public DiscussionNotFoundException get() { + return this; + } +} diff --git a/src/main/java/site/easystartup/web/forum/domain/exception/TopicNotFoundException.java b/src/main/java/site/easystartup/web/forum/domain/exception/TopicNotFoundException.java new file mode 100644 index 0000000..93f1b08 --- /dev/null +++ b/src/main/java/site/easystartup/web/forum/domain/exception/TopicNotFoundException.java @@ -0,0 +1,18 @@ +package site.easystartup.web.forum.domain.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +import java.util.function.Supplier; + +@ResponseStatus(HttpStatus.BAD_REQUEST) +public class TopicNotFoundException extends RuntimeException implements Supplier { + public TopicNotFoundException(String message) { + super(message); + } + + @Override + public TopicNotFoundException get() { + return this; + } +} diff --git a/src/main/java/site/easystartup/web/forum/domain/Discussion.java b/src/main/java/site/easystartup/web/forum/domain/model/Discussion.java similarity index 82% rename from src/main/java/site/easystartup/web/forum/domain/Discussion.java rename to src/main/java/site/easystartup/web/forum/domain/model/Discussion.java index bd5bb25..e67374c 100644 --- a/src/main/java/site/easystartup/web/forum/domain/Discussion.java +++ b/src/main/java/site/easystartup/web/forum/domain/model/Discussion.java @@ -1,5 +1,6 @@ -package site.easystartup.web.forum.domain; +package site.easystartup.web.forum.domain.model; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.*; import org.hibernate.Hibernate; @@ -19,8 +20,15 @@ public class Discussion implements Comparable{ private long id; private String title; private String author; + + @Column(name = "date", updatable = false) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date date; + + @Column(name = "last_update") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date last_update; + private boolean pinned; private DiscussionStatus status; private long topic; diff --git a/src/main/java/site/easystartup/web/forum/domain/DiscussionMessage.java b/src/main/java/site/easystartup/web/forum/domain/model/DiscussionMessage.java similarity index 81% rename from src/main/java/site/easystartup/web/forum/domain/DiscussionMessage.java rename to src/main/java/site/easystartup/web/forum/domain/model/DiscussionMessage.java index 13ca691..d04e4af 100644 --- a/src/main/java/site/easystartup/web/forum/domain/DiscussionMessage.java +++ b/src/main/java/site/easystartup/web/forum/domain/model/DiscussionMessage.java @@ -1,5 +1,6 @@ -package site.easystartup.web.forum.domain; +package site.easystartup.web.forum.domain.model; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.*; import org.hibernate.Hibernate; @@ -19,7 +20,11 @@ public class DiscussionMessage { @Column(columnDefinition="varchar(1024)") private String text; private String sender; + + @Column(name = "date", updatable = false) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date date; + private boolean edited; private long discussion_id; diff --git a/src/main/java/site/easystartup/web/forum/domain/DiscussionStatus.java b/src/main/java/site/easystartup/web/forum/domain/model/DiscussionStatus.java similarity index 51% rename from src/main/java/site/easystartup/web/forum/domain/DiscussionStatus.java rename to src/main/java/site/easystartup/web/forum/domain/model/DiscussionStatus.java index df9dfa5..90182b7 100644 --- a/src/main/java/site/easystartup/web/forum/domain/DiscussionStatus.java +++ b/src/main/java/site/easystartup/web/forum/domain/model/DiscussionStatus.java @@ -1,4 +1,4 @@ -package site.easystartup.web.forum.domain; +package site.easystartup.web.forum.domain.model; public enum DiscussionStatus { OPEN, CLOSED; diff --git a/src/main/java/site/easystartup/web/forum/domain/Topic.java b/src/main/java/site/easystartup/web/forum/domain/model/Topic.java similarity index 77% rename from src/main/java/site/easystartup/web/forum/domain/Topic.java rename to src/main/java/site/easystartup/web/forum/domain/model/Topic.java index f564bb7..6796c86 100644 --- a/src/main/java/site/easystartup/web/forum/domain/Topic.java +++ b/src/main/java/site/easystartup/web/forum/domain/model/Topic.java @@ -1,12 +1,10 @@ -package site.easystartup.web.forum.domain; +package site.easystartup.web.forum.domain.model; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.*; import org.hibernate.Hibernate; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.*; import java.util.Date; import java.util.Objects; @@ -23,6 +21,9 @@ public class Topic { private String author; private int size; private String description; + + @Column(name = "last_update") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date last_update; @Override diff --git a/src/main/java/site/easystartup/web/forum/domain/request/DiscussionMessageRequest.java b/src/main/java/site/easystartup/web/forum/domain/request/DiscussionMessageRequest.java new file mode 100644 index 0000000..29e93ed --- /dev/null +++ b/src/main/java/site/easystartup/web/forum/domain/request/DiscussionMessageRequest.java @@ -0,0 +1,23 @@ +package site.easystartup.web.forum.domain.request; + +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Date; + +@Data +@Builder +public class DiscussionMessageRequest { + private long id; + @Size(min = 3, max = 1024, message = "Text should be no less 3 and no more 1024 signs") + @NotNull + private String text; + @NotNull + private String sender; + @NotNull + private Date date; + private boolean edited; + private long discussion_id; +} diff --git a/src/main/java/site/easystartup/web/forum/domain/request/DiscussionRequest.java b/src/main/java/site/easystartup/web/forum/domain/request/DiscussionRequest.java new file mode 100644 index 0000000..7f02202 --- /dev/null +++ b/src/main/java/site/easystartup/web/forum/domain/request/DiscussionRequest.java @@ -0,0 +1,32 @@ +package site.easystartup.web.forum.domain.request; + +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import site.easystartup.web.forum.domain.model.DiscussionStatus; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Date; +import java.util.List; + +@Data +@Builder +public class DiscussionRequest { + private long id; + @Size(min = 3, max = 100, message = "Title should be no less 3 and no more 100 signs") + @NotNull + private String title; + @NotNull + private String author; + @NotNull + private Date date; + @NotNull + private Date last_update; + private boolean pinned; + @NotNull + private DiscussionStatus status; + private long topic; + @NotNull + private List messages; +} diff --git a/src/main/java/site/easystartup/web/forum/domain/request/TopicRequest.java b/src/main/java/site/easystartup/web/forum/domain/request/TopicRequest.java new file mode 100644 index 0000000..ac021c1 --- /dev/null +++ b/src/main/java/site/easystartup/web/forum/domain/request/TopicRequest.java @@ -0,0 +1,23 @@ +package site.easystartup.web.forum.domain.request; + +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Date; + +@Data +@Builder +public class TopicRequest { + private long id; + @Size(min = 3, max = 100, message = "Title should be no less 3 and no more 100 signs") + @NotNull + private String title; + @NotNull + private String author; + private int size; + private String description; + @NotNull + private Date last_update; +} diff --git a/src/main/java/site/easystartup/web/forum/dto/DiscussionDto.java b/src/main/java/site/easystartup/web/forum/dto/DiscussionDto.java new file mode 100644 index 0000000..0a3375d --- /dev/null +++ b/src/main/java/site/easystartup/web/forum/dto/DiscussionDto.java @@ -0,0 +1,30 @@ +package site.easystartup.web.forum.dto; + +import lombok.Data; +import site.easystartup.web.forum.domain.model.DiscussionStatus; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Date; +import java.util.List; + +@Data +public class DiscussionDto { + private long id; + @Size(min = 3, max = 100, message = "Title should be no less 3 and no more 100 signs") + @NotNull + private String title; + @NotNull + private String author; + @NotNull + private Date date; + @NotNull + private Date last_update; + private boolean pinned; + @NotNull + private DiscussionStatus status; + private long topic; + @NotNull + private List messages; + +} diff --git a/src/main/java/site/easystartup/web/forum/dto/DiscussionMessageDto.java b/src/main/java/site/easystartup/web/forum/dto/DiscussionMessageDto.java new file mode 100644 index 0000000..3c8bb79 --- /dev/null +++ b/src/main/java/site/easystartup/web/forum/dto/DiscussionMessageDto.java @@ -0,0 +1,21 @@ +package site.easystartup.web.forum.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Date; + +@Data +public class DiscussionMessageDto { + private long id; + @Size(min = 3, max = 1024, message = "Text should be no less 3 and no more 1024 signs") + @NotNull + private String text; + @NotNull + private String sender; + @NotNull + private Date date; + private boolean edited; + private long discussion_id; +} diff --git a/src/main/java/site/easystartup/web/forum/dto/TopicDto.java b/src/main/java/site/easystartup/web/forum/dto/TopicDto.java new file mode 100644 index 0000000..8ed5fba --- /dev/null +++ b/src/main/java/site/easystartup/web/forum/dto/TopicDto.java @@ -0,0 +1,21 @@ +package site.easystartup.web.forum.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Date; + +@Data +public class TopicDto { + private long id; + @Size(min = 3, max = 100, message = "Title should be no less 3 and no more 100 signs") + @NotNull + private String title; + @NotNull + private String author; + private int size; + private String description; + @NotNull + private Date last_update; +} diff --git a/src/main/java/site/easystartup/web/forum/repo/DiscussionMessageRepo.java b/src/main/java/site/easystartup/web/forum/repo/DiscussionMessageRepo.java index 352ae9c..f62e058 100644 --- a/src/main/java/site/easystartup/web/forum/repo/DiscussionMessageRepo.java +++ b/src/main/java/site/easystartup/web/forum/repo/DiscussionMessageRepo.java @@ -1,7 +1,7 @@ package site.easystartup.web.forum.repo; import org.springframework.data.repository.CrudRepository; -import site.easystartup.web.forum.domain.DiscussionMessage; +import site.easystartup.web.forum.domain.model.DiscussionMessage; public interface DiscussionMessageRepo extends CrudRepository { } diff --git a/src/main/java/site/easystartup/web/forum/repo/DiscussionRepo.java b/src/main/java/site/easystartup/web/forum/repo/DiscussionRepo.java index 5585360..a036586 100644 --- a/src/main/java/site/easystartup/web/forum/repo/DiscussionRepo.java +++ b/src/main/java/site/easystartup/web/forum/repo/DiscussionRepo.java @@ -1,7 +1,7 @@ package site.easystartup.web.forum.repo; import org.springframework.data.repository.CrudRepository; -import site.easystartup.web.forum.domain.Discussion; +import site.easystartup.web.forum.domain.model.Discussion; public interface DiscussionRepo extends CrudRepository { } diff --git a/src/main/java/site/easystartup/web/forum/repo/TopicRepo.java b/src/main/java/site/easystartup/web/forum/repo/TopicRepo.java index 5cb6d89..35b91ce 100644 --- a/src/main/java/site/easystartup/web/forum/repo/TopicRepo.java +++ b/src/main/java/site/easystartup/web/forum/repo/TopicRepo.java @@ -1,7 +1,7 @@ package site.easystartup.web.forum.repo; import org.springframework.data.repository.CrudRepository; -import site.easystartup.web.forum.domain.Topic; +import site.easystartup.web.forum.domain.model.Topic; public interface TopicRepo extends CrudRepository { } diff --git a/src/main/java/site/easystartup/web/forum/service/ForumService.java b/src/main/java/site/easystartup/web/forum/service/ForumService.java index b2c0f23..d454804 100644 --- a/src/main/java/site/easystartup/web/forum/service/ForumService.java +++ b/src/main/java/site/easystartup/web/forum/service/ForumService.java @@ -2,18 +2,28 @@ package site.easystartup.web.forum.service; import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; +import lombok.val; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import site.easystartup.web.domain.Role; -import site.easystartup.web.domain.User; -import site.easystartup.web.forum.domain.Discussion; -import site.easystartup.web.forum.domain.DiscussionMessage; -import site.easystartup.web.forum.domain.DiscussionStatus; -import site.easystartup.web.forum.domain.Topic; +import site.easystartup.web.domain.model.User; +import site.easystartup.web.exception.NoPermissionException; +import site.easystartup.web.forum.domain.exception.DiscussionMessageNotFoundException; +import site.easystartup.web.forum.domain.exception.DiscussionNotFoundException; +import site.easystartup.web.forum.domain.exception.TopicNotFoundException; +import site.easystartup.web.forum.domain.model.Discussion; +import site.easystartup.web.forum.domain.model.DiscussionMessage; +import site.easystartup.web.forum.domain.model.DiscussionStatus; +import site.easystartup.web.forum.domain.model.Topic; +import site.easystartup.web.forum.domain.request.DiscussionMessageRequest; +import site.easystartup.web.forum.domain.request.DiscussionRequest; +import site.easystartup.web.forum.domain.request.TopicRequest; +import site.easystartup.web.forum.dto.DiscussionDto; import site.easystartup.web.forum.repo.DiscussionMessageRepo; import site.easystartup.web.forum.repo.DiscussionRepo; import site.easystartup.web.forum.repo.TopicRepo; +import site.easystartup.web.service.UserService; +import java.security.Principal; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -28,24 +38,31 @@ public class ForumService { private final DiscussionRepo discussionRepo; + private final UserService userService; + + public List getAllTopics() { + return (List) topicRepo.findAll(); + } + public List getMessagesByDiscussionId(long discussionId) { return Lists.newArrayList(discussionMessageRepo.findAll()).stream() .filter(m -> m.getDiscussion_id() == discussionId).toList(); } - public Discussion getDiscussionById(long discussionId) { - return discussionRepo.findById(discussionId).get(); + public Discussion getDiscussionById(long discussion_id) { + return discussionRepo.findById(discussion_id) + .orElseThrow(new DiscussionNotFoundException("Could not get discussion with id " + discussion_id)); } - public List getDiscussionsByAuthor(String author) { + public List getDiscussionsByAuthor(Principal principal) { return Lists.newArrayList(discussionRepo.findAll()).stream() - .filter(d -> d.getAuthor().equals(author)).toList(); + .filter(d -> d.getAuthor().equals(principal.getName())).toList(); } - public List getDiscussionsByMember(String member) { + public List getDiscussionsByMember(Principal principal) { return Lists.newArrayList(discussionRepo.findAll()).stream() .filter(d -> getMessagesByDiscussionId(d.getId()).stream() - .anyMatch(m -> m.getSender().equals(member))).toList(); + .anyMatch(m -> m.getSender().equals(principal.getName()))).toList(); } public List getPinnedDiscussionsByTopicId(long topic_id) { @@ -62,70 +79,119 @@ public class ForumService { return result; } - public void createTopic(String title, String description, User user) { - description = description == null ? "" : description; + public List getDiscussionsByPage(long topic_id, long page) { + List result = new ArrayList<>(); + if(page == 0) result.addAll(getPinnedDiscussionsByTopicId(topic_id)); + result.addAll(getSortedDiscussionsByTopicId(topic_id).subList((int)(15 * page), (int)(15 * page) + 15)); + return result; + } + + public Topic createTopic(TopicRequest topicRequest, Principal principal) { + String description = topicRequest.getDescription() == null ? "" : topicRequest.getDescription(); Topic topic = new Topic(); - topic.setTitle(title); + topic.setTitle(topic.getTitle()); topic.setDescription(description); - topic.setAuthor(user.getUsername()); + topic.setAuthor(principal.getName()); topic.setLast_update(new Date()); topic.setSize(0); topicRepo.save(topic); + return topic; } - public void createDiscussion(String title, long topic, User user) { + public Topic getTopicById(long id) { + return topicRepo.findById(id).orElseThrow(new TopicNotFoundException("Topic with id " + id + " dont exists!")); + } + + public Discussion createDiscussion(DiscussionRequest discussionRequest, long topic_id, Principal principal) { Discussion discussion = new Discussion(); - discussion.setAuthor(user.getUsername()); + discussion.setAuthor(principal.getName()); discussion.setDate(new Date()); - discussion.setTitle(title); - discussion.setTopic(topic); + discussion.setTitle(discussionRequest.getTitle()); + discussion.setTopic(topic_id); discussion.setMessages(new ArrayList<>()); discussion.setLast_update(new Date()); discussion.setStatus(DiscussionStatus.OPEN); discussion.setPinned(false); discussionRepo.save(discussion); + onDiscussionUpdate(discussion); + Topic topic = topicRepo.findById(topic_id) + .orElseThrow(new TopicNotFoundException("Topic with id " + topic_id + " dont exists!")); + topic.setSize(topic.getSize() + 1); + topicRepo.save(topic); + return discussion; } - public void editDiscussion(String title, long discussion_id, DiscussionStatus status, User user) { - Discussion discussion = discussionRepo.findById(discussion_id).orElseThrow(); - if(!(discussion.getAuthor().equals(user.getUsername()) || user.isModer())) throw new SecurityException(); + public Discussion editDiscussion(DiscussionRequest discussionRequest, long discussion_id, Principal principal) { + User user = userService.getUserByPrincipal(principal); + Discussion discussion = discussionRepo.findById(discussion_id) + .orElseThrow(new DiscussionNotFoundException("Could not get discussion with id " + discussion_id)); + if(!(discussion.getAuthor().equals(user.getUsername()) || user.isModer())) + throw new NoPermissionException(user.getUsername()); discussion.setAuthor(user.getUsername()); - discussion.setTitle(title); + discussion.setTitle(discussionRequest.getTitle()); discussion.setLast_update(new Date()); - discussion.setStatus(status); + discussion.setStatus(discussionRequest.getStatus()); discussionRepo.save(discussion); + onDiscussionUpdate(discussion); + return discussion; } - public void addDiscussionMessage(String text, long discussion_id, User user) { + public DiscussionMessage createDiscussionMessage(DiscussionMessageRequest messageRequest, long discussion_id, Principal principal) { DiscussionMessage message = new DiscussionMessage(); message.setDate(new Date()); message.setEdited(false); - message.setSender(user.getUsername()); - message.setText(text); + message.setSender(principal.getName()); + message.setText(messageRequest.getText()); message.setDiscussion_id(discussion_id); discussionMessageRepo.save(message); - Discussion discussion = discussionRepo.findById(discussion_id).orElseThrow(); + Discussion discussion = discussionRepo.findById(discussion_id) + .orElseThrow(new DiscussionNotFoundException("Could not get discussion with id " + discussion_id)); List newMsgs = discussion.getMessages(); newMsgs.add(message.getId()); discussion.setMessages(newMsgs); discussionRepo.save(discussion); + onDiscussionMessageUpdate(message); + return message; } - public void editDiscussionMessage(String text, long message_id, User user) { - DiscussionMessage message = discussionMessageRepo.findById(message_id).orElseThrow(); - if(!(message.getSender().equals(user.getUsername()) || user.isAdmin())) throw new SecurityException(); + public DiscussionMessage editDiscussionMessage(DiscussionMessageRequest messageRequest, long message_id, Principal principal) { + User user = userService.getUserByPrincipal(principal); + DiscussionMessage message = discussionMessageRepo.findById(message_id) + .orElseThrow(new DiscussionMessageNotFoundException("Could not get message with id " + message_id)); + if(!(message.getSender().equals(user.getUsername()) || user.isAdmin())) + throw new NoPermissionException(user.getUsername()); message.setEdited(true); - message.setText(text); + message.setText(messageRequest.getText()); discussionMessageRepo.save(message); + onDiscussionMessageUpdate(message); + return message; } public void deleteDiscussionMessage(long message_id, User user) { - DiscussionMessage message = discussionMessageRepo.findById(message_id).orElseThrow(); - if(!(message.getSender().equals(user.getUsername()) || user.isAdmin())) throw new SecurityException(); + DiscussionMessage message = discussionMessageRepo.findById(message_id) + .orElseThrow(new DiscussionMessageNotFoundException("Could not get message with id " + message_id)); + if(!(message.getSender().equals(user.getUsername()) || user.isAdmin())) + throw new NoPermissionException(user.getUsername()); discussionMessageRepo.delete(message); } public DiscussionMessage getDiscussionMessageById(long id) { - return discussionMessageRepo.findById(id).orElseThrow(); + return discussionMessageRepo.findById(id) + .orElseThrow(new DiscussionMessageNotFoundException("Could not get message with id " + id)); + } + + public void onDiscussionMessageUpdate(DiscussionMessage discussionMessage) { + onDiscussionUpdate(getDiscussionById(discussionMessage.getDiscussion_id())); + } + + public void onDiscussionUpdate(Discussion discussion) { + discussion.setLast_update(new Date()); + discussionRepo.save(discussion); + onTopicUpdate(getTopicById(discussion.getId())); + } + + public void onTopicUpdate(Topic topic) { + topic.setLast_update(new Date()); + topicRepo.save(topic); } } diff --git a/src/main/java/site/easystartup/web/project/controller/ProjectController.java b/src/main/java/site/easystartup/web/project/controller/ProjectController.java index 0c5c3c1..3fefcb2 100644 --- a/src/main/java/site/easystartup/web/project/controller/ProjectController.java +++ b/src/main/java/site/easystartup/web/project/controller/ProjectController.java @@ -6,12 +6,11 @@ import org.springframework.http.ResponseEntity; import org.springframework.util.ObjectUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.ModelAndView; import site.easystartup.web.project.domain.model.Project; -import site.easystartup.web.project.domain.payload.requst.ParticipantRequest; -import site.easystartup.web.project.domain.payload.requst.ProjectRequest; -import site.easystartup.web.project.domain.payload.response.ResponseMessage; -import site.easystartup.web.project.domain.validation.ResponseErrorValidation; +import site.easystartup.web.project.domain.requst.ParticipantRequest; +import site.easystartup.web.project.domain.requst.ProjectRequest; +import site.easystartup.web.domain.response.ResponseMessage; +import site.easystartup.web.domain.validation.ResponseErrorValidation; import site.easystartup.web.project.dto.ParticipantDto; import site.easystartup.web.project.dto.ProjectDto; import site.easystartup.web.project.service.ProjectService; diff --git a/src/main/java/site/easystartup/web/project/domain/model/Participant.java b/src/main/java/site/easystartup/web/project/domain/model/Participant.java index 6412561..59d58ba 100644 --- a/src/main/java/site/easystartup/web/project/domain/model/Participant.java +++ b/src/main/java/site/easystartup/web/project/domain/model/Participant.java @@ -2,7 +2,7 @@ package site.easystartup.web.project.domain.model; import lombok.*; import org.hibernate.Hibernate; -import site.easystartup.web.domain.User; +import site.easystartup.web.domain.model.User; import javax.persistence.*; import java.util.List; diff --git a/src/main/java/site/easystartup/web/project/domain/model/Project.java b/src/main/java/site/easystartup/web/project/domain/model/Project.java index 6df8106..49ed292 100644 --- a/src/main/java/site/easystartup/web/project/domain/model/Project.java +++ b/src/main/java/site/easystartup/web/project/domain/model/Project.java @@ -3,7 +3,7 @@ package site.easystartup.web.project.domain.model; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.*; import org.hibernate.Hibernate; -import site.easystartup.web.domain.User; +import site.easystartup.web.domain.model.User; import javax.persistence.*; import javax.validation.constraints.NotNull; diff --git a/src/main/java/site/easystartup/web/project/domain/payload/requst/ParticipantRequest.java b/src/main/java/site/easystartup/web/project/domain/requst/ParticipantRequest.java similarity index 77% rename from src/main/java/site/easystartup/web/project/domain/payload/requst/ParticipantRequest.java rename to src/main/java/site/easystartup/web/project/domain/requst/ParticipantRequest.java index 54c1360..0ba408e 100644 --- a/src/main/java/site/easystartup/web/project/domain/payload/requst/ParticipantRequest.java +++ b/src/main/java/site/easystartup/web/project/domain/requst/ParticipantRequest.java @@ -1,4 +1,4 @@ -package site.easystartup.web.project.domain.payload.requst; +package site.easystartup.web.project.domain.requst; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/src/main/java/site/easystartup/web/project/domain/payload/requst/ProjectRequest.java b/src/main/java/site/easystartup/web/project/domain/requst/ProjectRequest.java similarity index 93% rename from src/main/java/site/easystartup/web/project/domain/payload/requst/ProjectRequest.java rename to src/main/java/site/easystartup/web/project/domain/requst/ProjectRequest.java index cf01441..6c2d826 100644 --- a/src/main/java/site/easystartup/web/project/domain/payload/requst/ProjectRequest.java +++ b/src/main/java/site/easystartup/web/project/domain/requst/ProjectRequest.java @@ -1,4 +1,4 @@ -package site.easystartup.web.project.domain.payload.requst; +package site.easystartup.web.project.domain.requst; import lombok.Data; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/site/easystartup/web/project/dto/UserDto.java b/src/main/java/site/easystartup/web/project/dto/UserDto.java index 6677658..655ba7f 100644 --- a/src/main/java/site/easystartup/web/project/dto/UserDto.java +++ b/src/main/java/site/easystartup/web/project/dto/UserDto.java @@ -1,7 +1,7 @@ package site.easystartup.web.project.dto; import lombok.Data; -import site.easystartup.web.domain.Role; +import site.easystartup.web.domain.model.Role; import java.io.Serializable; import java.util.Set; diff --git a/src/main/java/site/easystartup/web/project/repo/ParticipantRepo.java b/src/main/java/site/easystartup/web/project/repo/ParticipantRepo.java index 7a3f563..b7e4b6f 100644 --- a/src/main/java/site/easystartup/web/project/repo/ParticipantRepo.java +++ b/src/main/java/site/easystartup/web/project/repo/ParticipantRepo.java @@ -12,5 +12,5 @@ import java.util.LinkedHashSet; @Repository public interface ParticipantRepo extends JpaRepository { @Query ("SELECT Project FROM Participant WHERE nameOfPosition = :nameOfPosition") - LinkedHashSet findAllByNameOfPosition(@Param("nameOfPosition") String nameOfPosition); + LinkedHashSet findAllByNameOfPosition(@Param("nameOfPosition") String name); } diff --git a/src/main/java/site/easystartup/web/project/repo/ProjectRepo.java b/src/main/java/site/easystartup/web/project/repo/ProjectRepo.java index 745b1be..508fc8c 100644 --- a/src/main/java/site/easystartup/web/project/repo/ProjectRepo.java +++ b/src/main/java/site/easystartup/web/project/repo/ProjectRepo.java @@ -4,11 +4,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import site.easystartup.web.domain.User; +import site.easystartup.web.domain.model.User; import site.easystartup.web.project.domain.model.Project; import java.util.List; -import java.util.Set; @Repository public interface ProjectRepo extends JpaRepository { diff --git a/src/main/java/site/easystartup/web/project/service/ProjectService.java b/src/main/java/site/easystartup/web/project/service/ProjectService.java index 9cca748..d28acab 100644 --- a/src/main/java/site/easystartup/web/project/service/ProjectService.java +++ b/src/main/java/site/easystartup/web/project/service/ProjectService.java @@ -3,12 +3,11 @@ package site.easystartup.web.project.service; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; -import site.easystartup.web.domain.User; +import site.easystartup.web.domain.model.User; import site.easystartup.web.project.domain.exception.ProjectNotFoundException; import site.easystartup.web.project.domain.model.Participant; import site.easystartup.web.project.domain.model.Project; -import site.easystartup.web.project.domain.payload.requst.ProjectRequest; -import site.easystartup.web.project.domain.payload.response.ResponseMessage; +import site.easystartup.web.project.domain.requst.ProjectRequest; import site.easystartup.web.project.repo.ParticipantRepo; import site.easystartup.web.project.repo.ProjectRepo; import site.easystartup.web.service.UserService; diff --git a/src/main/java/site/easystartup/web/repo/UserRepo.java b/src/main/java/site/easystartup/web/repo/UserRepo.java index cefee76..54391bf 100644 --- a/src/main/java/site/easystartup/web/repo/UserRepo.java +++ b/src/main/java/site/easystartup/web/repo/UserRepo.java @@ -1,7 +1,7 @@ package site.easystartup.web.repo; import org.springframework.data.jpa.repository.JpaRepository; -import site.easystartup.web.domain.User; +import site.easystartup.web.domain.model.User; public interface UserRepo extends JpaRepository { User findByUsername(String username); diff --git a/src/main/java/site/easystartup/web/service/UserService.java b/src/main/java/site/easystartup/web/service/UserService.java index 7d56357..6c66cb0 100644 --- a/src/main/java/site/easystartup/web/service/UserService.java +++ b/src/main/java/site/easystartup/web/service/UserService.java @@ -5,7 +5,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; -import site.easystartup.web.domain.User; +import site.easystartup.web.domain.model.User; import site.easystartup.web.repo.UserRepo; import java.security.Principal; @@ -22,12 +22,4 @@ public class UserService { public User getUserById(Long userId) { return userRepo.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User not found")); } - - public User getCurrentUser() { - Authentication auth = SecurityContextHolder.getContext().getAuthentication(); - if(auth.isAuthenticated()) throw new UserNotAuthenticatedException(); - org.springframework.security.core.userdetails.User user = (org.springframework.security.core.userdetails.User) - auth.getPrincipal(); - return userRepo.findByUsername(user.getUsername()); - } } diff --git a/src/main/java/site/easystartup/web/storage/controller/FileUploadController.java b/src/main/java/site/easystartup/web/storage/controller/FileUploadController.java index 4534288..58fcecd 100644 --- a/src/main/java/site/easystartup/web/storage/controller/FileUploadController.java +++ b/src/main/java/site/easystartup/web/storage/controller/FileUploadController.java @@ -10,7 +10,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder; -import site.easystartup.web.storage.service.StorageFileNotFoundException; +import site.easystartup.web.storage.domain.exception.StorageFileNotFoundException; import site.easystartup.web.storage.service.StorageService; import java.util.stream.Collectors; diff --git a/src/main/java/site/easystartup/web/storage/service/StorageFileNotFoundException.java b/src/main/java/site/easystartup/web/storage/domain/exception/StorageFileNotFoundException.java similarity index 78% rename from src/main/java/site/easystartup/web/storage/service/StorageFileNotFoundException.java rename to src/main/java/site/easystartup/web/storage/domain/exception/StorageFileNotFoundException.java index 4f8e7da..2b30196 100644 --- a/src/main/java/site/easystartup/web/storage/service/StorageFileNotFoundException.java +++ b/src/main/java/site/easystartup/web/storage/domain/exception/StorageFileNotFoundException.java @@ -1,4 +1,4 @@ -package site.easystartup.web.storage.service; +package site.easystartup.web.storage.domain.exception; public class StorageFileNotFoundException extends RuntimeException { public StorageFileNotFoundException(String filename) { diff --git a/src/main/resources/templates/discussion-create.html b/src/main/resources/templates/discussion-create.html index af99d90..7ea0ab4 100644 --- a/src/main/resources/templates/discussion-create.html +++ b/src/main/resources/templates/discussion-create.html @@ -1,9 +1,17 @@ + - 403 + Создание обсуждения +

Создание обсуждения

+
+

Название

+ + + +
\ No newline at end of file diff --git a/src/main/resources/templates/discussion-edit.html b/src/main/resources/templates/discussion-edit.html index e69de29..6a7011e 100644 --- a/src/main/resources/templates/discussion-edit.html +++ b/src/main/resources/templates/discussion-edit.html @@ -0,0 +1,21 @@ + + + + + + 403 + + +

Создание обсуждения

+
+

Название

+ + + +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/discussion-message-add.html b/src/main/resources/templates/discussion-message-add.html index e69de29..e139eed 100644 --- a/src/main/resources/templates/discussion-message-add.html +++ b/src/main/resources/templates/discussion-message-add.html @@ -0,0 +1,16 @@ + + + + + + Новое сообщение + + +

Отправка сообщения

+
+

Сообщение

+ + +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/discussion.html b/src/main/resources/templates/discussion.html index ac58142..1c3d200 100644 --- a/src/main/resources/templates/discussion.html +++ b/src/main/resources/templates/discussion.html @@ -1,16 +1,18 @@ + - 403 + Discussion

+

Сообщения

-

+

diff --git a/src/test/java/site/easystartup/web/FileUploadTests.java b/src/test/java/site/easystartup/web/FileUploadTests.java index 4d6e5b7..5a0cf20 100644 --- a/src/test/java/site/easystartup/web/FileUploadTests.java +++ b/src/test/java/site/easystartup/web/FileUploadTests.java @@ -10,7 +10,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.web.servlet.MockMvc; -import site.easystartup.web.storage.service.StorageFileNotFoundException; +import site.easystartup.web.storage.domain.exception.StorageFileNotFoundException; import site.easystartup.web.storage.service.StorageService; import java.nio.file.Files; @@ -35,7 +35,6 @@ public class FileUploadTests { } - @Autowired private MockMvc mvc; diff --git a/src/test/java/site/easystartup/web/ProjectServiceTests.java b/src/test/java/site/easystartup/web/ProjectServiceTests.java new file mode 100644 index 0000000..c904237 --- /dev/null +++ b/src/test/java/site/easystartup/web/ProjectServiceTests.java @@ -0,0 +1,69 @@ +package site.easystartup.web; + +import org.junit.jupiter.api.*; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockMultipartFile; +import site.easystartup.web.project.domain.model.Project; +import site.easystartup.web.project.domain.requst.ProjectRequest; +import site.easystartup.web.project.repo.ProjectRepo; +import site.easystartup.web.project.service.ProjectService; + +import java.security.Principal; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@AutoConfigureMockMvc(addFilters = false) +@SpringBootTest +@ExtendWith(MockitoExtension.class) +@DataJpaTest +public class ProjectServiceTests { + @Autowired + private ProjectService projectService; + + @Autowired + private ProjectRepo projectRepo; + + private Principal principal; + + private Project project; + + @BeforeEach + public void onStart() { + Mockito.doReturn("testUser").when(principal).getName(); + + MockMultipartFile file + = new MockMultipartFile( + "file", + "hello", + MediaType.TEXT_PLAIN_VALUE, + "Hello file".getBytes() + ); + + ProjectRequest projectRequest = new ProjectRequest(); + projectRequest.setDescription("testDesc"); + projectRequest.setTitle("testTitle"); + projectRequest.setCover(file); + projectRequest.setTechnology(new ArrayList<>()); + project = projectService.createProject(projectRequest, principal); + } + + @Test + public void shouldAllProjects() { + assertTrue(projectRepo.findAll().stream().anyMatch(p -> p.getTitle().equals("testTitle"))); + } + + @AfterEach + public void onEnd() { + projectRepo.delete(project); + } + + +}