Change mapping to Rest
This commit is contained in:
1 parent
10a8502491
commit
e46e304975
43 files changed
+597
-206
No files matched your search
@@ -7,8 +7,8 @@ import org.springframework.stereotype.Controller;
|
|||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import site.easystartup.web.domain.Role;
|
import site.easystartup.web.domain.model.Role;
|
||||||
import site.easystartup.web.domain.User;
|
import site.easystartup.web.domain.model.User;
|
||||||
import site.easystartup.web.repo.UserRepo;
|
import site.easystartup.web.repo.UserRepo;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package site.easystartup.web.domain;
|
package site.easystartup.web.domain.model;
|
||||||
|
|
||||||
public enum Role {
|
public enum Role {
|
||||||
USER, PREMIUM, MODER, ADMIN;
|
USER, PREMIUM, MODER, ADMIN;
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package site.easystartup.web.domain;
|
package site.easystartup.web.domain.model;
|
||||||
|
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package site.easystartup.web.project.domain.payload.response;
|
package site.easystartup.web.domain.response;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
+1
-1
@@ -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.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,165 +2,158 @@ package site.easystartup.web.forum.controller;
|
|||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.val;
|
import lombok.val;
|
||||||
|
import org.modelmapper.ModelMapper;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.security.access.annotation.Secured;
|
import org.springframework.security.access.annotation.Secured;
|
||||||
import org.springframework.security.core.context.SecurityContextHolder;
|
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.util.ObjectUtils;
|
||||||
|
import org.springframework.validation.BindingResult;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import site.easystartup.web.domain.User;
|
import site.easystartup.web.domain.model.User;
|
||||||
import site.easystartup.web.forum.domain.Discussion;
|
import site.easystartup.web.domain.response.ResponseMessage;
|
||||||
import site.easystartup.web.forum.domain.DiscussionMessage;
|
import site.easystartup.web.domain.validation.ResponseErrorValidation;
|
||||||
import site.easystartup.web.forum.domain.DiscussionStatus;
|
import site.easystartup.web.forum.domain.model.Discussion;
|
||||||
import site.easystartup.web.forum.domain.Topic;
|
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.service.ForumService;
|
||||||
import site.easystartup.web.forum.repo.TopicRepo;
|
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 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)
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
public class ForumController {
|
public class ForumController {
|
||||||
private final TopicRepo topicRepo;
|
|
||||||
|
|
||||||
private final ForumService forumService;
|
private final ForumService forumService;
|
||||||
|
|
||||||
private final UserService userService;
|
private final UserService userService;
|
||||||
|
private final ModelMapper modelMapper;
|
||||||
|
private final ResponseErrorValidation responseErrorValidation;
|
||||||
|
|
||||||
@GetMapping("/forum")
|
@GetMapping("/")
|
||||||
public String forumMain(Model model) {
|
public ResponseEntity<List<TopicDto>> main(@Valid @RequestBody ProjectRequest projectRequest,
|
||||||
val topic = topicRepo.findAll();
|
BindingResult bindingResult,
|
||||||
model.addAttribute("topics", topic);
|
Principal principal) {
|
||||||
return "/forum";
|
val topics = forumService.getAllTopics()
|
||||||
|
.stream().map(topic -> modelMapper.map(topic, TopicDto.class)).collect(Collectors.toList());
|
||||||
|
return ResponseEntity.ok().body(topics);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/forum/my")
|
@GetMapping("/my")
|
||||||
public String forumMy(Model model) {
|
public ResponseEntity<List<DiscussionDto>> my(Principal principal) {
|
||||||
User user = userService.getCurrentUser();
|
val discussions = forumService.getDiscussionsByAuthor(principal)
|
||||||
val discussions = forumService.getDiscussionsByAuthor(user.getUsername());
|
.stream().map(discussion -> modelMapper.map(discussion, DiscussionDto.class)).toList();
|
||||||
model.addAttribute("discussions", discussions);
|
return ResponseEntity.ok().body(discussions);
|
||||||
return "/my-discussions";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/forum/new")
|
@GetMapping("/takepart")
|
||||||
public String forumNew() {
|
public ResponseEntity<List<DiscussionDto>> takePart(Principal principal) {
|
||||||
return "topic-new";
|
val discussions = forumService.getDiscussionsByMember(principal)
|
||||||
|
.stream().map(discussion -> modelMapper.map(discussion, DiscussionDto.class)).toList();
|
||||||
|
return ResponseEntity.ok().body(discussions);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Secured({"ADMIN", "MODER"})
|
@Secured({"ADMIN", "MODER"})
|
||||||
@PostMapping("/forum/new")
|
@PostMapping("/new")
|
||||||
public String forumNewTopic(@RequestParam String title,
|
public ResponseEntity<Object> forumNew(@Valid @RequestBody TopicRequest topicRequest,
|
||||||
@RequestParam String description) {
|
BindingResult bindingResult,
|
||||||
forumService.createTopic(title, description, userService.getCurrentUser());
|
Principal principal) {
|
||||||
return "/forum";
|
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}")
|
@GetMapping("/{topic_id}/{page_id}")
|
||||||
public String topicFirstPage(@PathVariable(value = "topic_id") long topic_id,
|
public ResponseEntity<List<DiscussionDto>> topicPage(@PathVariable long topic_id,
|
||||||
Model model) {
|
@PathVariable long page_id) {
|
||||||
val pinned_discussions = forumService.getPinnedDiscussionsByTopicId(topic_id);
|
List<DiscussionDto> discussions = forumService.getDiscussionsByPage(topic_id, page_id)
|
||||||
model.addAttribute("pinned_discussions", pinned_discussions);
|
.stream().map(discussion -> modelMapper.map(discussion, DiscussionDto.class)).toList();
|
||||||
val discussions = forumService.getSortedDiscussionsByTopicId(topic_id).subList(0, 14);
|
return ResponseEntity.ok().body(discussions);
|
||||||
model.addAttribute("discussions", discussions);
|
|
||||||
return "/topic-first";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/forum/{topic_id}/page/{page_index}")
|
@GetMapping("/discussion/{discussion_id}")
|
||||||
public String topicPage(@PathVariable(value = "topic_id") long topic_id,
|
public ResponseEntity<DiscussionDto> discussion(@PathVariable(value = "discussion_id") long discussion_id) {
|
||||||
@PathVariable(value = "page_index") long page_index,
|
return ResponseEntity.ok().body(modelMapper.map(forumService.getDiscussionById(discussion_id), DiscussionDto.class));
|
||||||
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("/forum/discussion/{discussion_id}")
|
@PostMapping("/{topic_id}/new")
|
||||||
public String discussion(@PathVariable(value = "discussion_id") long discussion_id,
|
public ResponseEntity<Object> discussionNew(@PathVariable long topic_id,
|
||||||
Model model) {
|
@Valid @RequestBody DiscussionRequest discussionRequest,
|
||||||
model.addAttribute("discussion", forumService.getDiscussionById(discussion_id));
|
BindingResult bindingResult,
|
||||||
model.addAttribute("messages ", forumService.getMessagesByDiscussionId(discussion_id));
|
Principal principal) {
|
||||||
return "/discussion";
|
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")
|
@PutMapping("/discussion/{discussion_id}/edit")
|
||||||
public String discussionCreate(@PathVariable long topic_id) {
|
public ResponseEntity<Object> discussionEdit(@Valid @RequestBody DiscussionRequest discussionRequest,
|
||||||
return "/discussion-create";
|
@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")
|
@PostMapping("/discussion/{discussion_id}/new")
|
||||||
public String discussionCreatePost(@PathVariable long topic_id,
|
public ResponseEntity<Object> messageAdd(@PathVariable long discussion_id,
|
||||||
@RequestParam String title) {
|
@Valid @RequestBody DiscussionMessageRequest messageRequest,
|
||||||
forumService.createDiscussion(title, topic_id, userService.getCurrentUser());
|
BindingResult bindingResult,
|
||||||
return "/discussion-create";
|
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")
|
@GetMapping("/message/{message_id}")
|
||||||
public String discussionEdit(@PathVariable long discussion_id, Model model) {
|
public ResponseEntity<DiscussionMessageDto> message(@PathVariable long message_id) {
|
||||||
Discussion discussion = forumService.getDiscussionById(discussion_id);
|
return ResponseEntity.ok().body(modelMapper.map(forumService.getDiscussionMessageById(message_id), DiscussionMessageDto.class));
|
||||||
User user = userService.getCurrentUser();
|
|
||||||
if(!(discussion.getAuthor().equals(user.getUsername()) || user.isModer())) return "/403-error";
|
|
||||||
model.addAttribute("discussion", discussion);
|
|
||||||
return "/discussion-edit";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/forum/discussion/{discussion_id}/edit")
|
@PutMapping("/message/{message_id}/edit")
|
||||||
public String discussionEditPost(@PathVariable long discussion_id,
|
public ResponseEntity<Object> messageEdit(@Valid @RequestBody DiscussionMessageRequest messageRequest,
|
||||||
@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,
|
|
||||||
@PathVariable long message_id,
|
@PathVariable long message_id,
|
||||||
Model model) {
|
BindingResult bindingResult,
|
||||||
|
Principal principal) {
|
||||||
|
val errors = responseErrorValidation.mapValidationService(bindingResult);
|
||||||
|
if (!ObjectUtils.isEmpty(errors)) return errors;
|
||||||
|
|
||||||
|
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<Object> messageDelete(@PathVariable long message_id, Principal principal) {
|
||||||
DiscussionMessage message = forumService.getDiscussionMessageById(message_id);
|
DiscussionMessage message = forumService.getDiscussionMessageById(message_id);
|
||||||
User user = userService.getCurrentUser();
|
User user = userService.getUserByPrincipal(principal);
|
||||||
if(!(message.getSender().equals(user.getUsername()) || user.isModer())) return "/403-error";
|
if(!(message.getSender().equals(user.getUsername()) || user.isModer()))
|
||||||
|
return ResponseEntity.ok(new ResponseMessage("No permissions!"));
|
||||||
model.addAttribute("discussion", forumService.getDiscussionById(discussion_id));
|
forumService.deleteDiscussionMessage(message_id, user);
|
||||||
model.addAttribute("messages ", forumService.getMessagesByDiscussionId(discussion_id));
|
return ResponseEntity.ok(new ResponseMessage("Message was deleted!"));
|
||||||
return "/discussion";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+21
@@ -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<DiscussionMessageNotFoundException> {
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
public DiscussionMessageNotFoundException(String message) {
|
||||||
|
super(message);
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DiscussionMessageNotFoundException get() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
+18
@@ -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<DiscussionNotFoundException> {
|
||||||
|
public DiscussionNotFoundException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DiscussionNotFoundException get() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<TopicNotFoundException> {
|
||||||
|
public TopicNotFoundException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TopicNotFoundException get() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
-1
@@ -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 lombok.*;
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
|
|
||||||
@@ -19,8 +20,15 @@ public class Discussion implements Comparable<Discussion>{
|
|||||||
private long id;
|
private long id;
|
||||||
private String title;
|
private String title;
|
||||||
private String author;
|
private String author;
|
||||||
|
|
||||||
|
@Column(name = "date", updatable = false)
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
private Date date;
|
private Date date;
|
||||||
|
|
||||||
|
@Column(name = "last_update")
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
private Date last_update;
|
private Date last_update;
|
||||||
|
|
||||||
private boolean pinned;
|
private boolean pinned;
|
||||||
private DiscussionStatus status;
|
private DiscussionStatus status;
|
||||||
private long topic;
|
private long topic;
|
||||||
+6
-1
@@ -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 lombok.*;
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
|
|
||||||
@@ -19,7 +20,11 @@ public class DiscussionMessage {
|
|||||||
@Column(columnDefinition="varchar(1024)")
|
@Column(columnDefinition="varchar(1024)")
|
||||||
private String text;
|
private String text;
|
||||||
private String sender;
|
private String sender;
|
||||||
|
|
||||||
|
@Column(name = "date", updatable = false)
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
private Date date;
|
private Date date;
|
||||||
|
|
||||||
private boolean edited;
|
private boolean edited;
|
||||||
private long discussion_id;
|
private long discussion_id;
|
||||||
|
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package site.easystartup.web.forum.domain;
|
package site.easystartup.web.forum.domain.model;
|
||||||
|
|
||||||
public enum DiscussionStatus {
|
public enum DiscussionStatus {
|
||||||
OPEN, CLOSED;
|
OPEN, CLOSED;
|
||||||
+6
-5
@@ -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 lombok.*;
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.*;
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.GenerationType;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@@ -23,6 +21,9 @@ public class Topic {
|
|||||||
private String author;
|
private String author;
|
||||||
private int size;
|
private int size;
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
|
@Column(name = "last_update")
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
private Date last_update;
|
private Date last_update;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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<Long> messages;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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<Long> messages;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package site.easystartup.web.forum.repo;
|
package site.easystartup.web.forum.repo;
|
||||||
|
|
||||||
import org.springframework.data.repository.CrudRepository;
|
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<DiscussionMessage, Long> {
|
public interface DiscussionMessageRepo extends CrudRepository<DiscussionMessage, Long> {
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package site.easystartup.web.forum.repo;
|
package site.easystartup.web.forum.repo;
|
||||||
|
|
||||||
import org.springframework.data.repository.CrudRepository;
|
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<Discussion, Long> {
|
public interface DiscussionRepo extends CrudRepository<Discussion, Long> {
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package site.easystartup.web.forum.repo;
|
package site.easystartup.web.forum.repo;
|
||||||
|
|
||||||
import org.springframework.data.repository.CrudRepository;
|
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<Topic, Long> {
|
public interface TopicRepo extends CrudRepository<Topic, Long> {
|
||||||
}
|
}
|
||||||
@@ -2,18 +2,28 @@ package site.easystartup.web.forum.service;
|
|||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.val;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import site.easystartup.web.domain.Role;
|
import site.easystartup.web.domain.model.User;
|
||||||
import site.easystartup.web.domain.User;
|
import site.easystartup.web.exception.NoPermissionException;
|
||||||
import site.easystartup.web.forum.domain.Discussion;
|
import site.easystartup.web.forum.domain.exception.DiscussionMessageNotFoundException;
|
||||||
import site.easystartup.web.forum.domain.DiscussionMessage;
|
import site.easystartup.web.forum.domain.exception.DiscussionNotFoundException;
|
||||||
import site.easystartup.web.forum.domain.DiscussionStatus;
|
import site.easystartup.web.forum.domain.exception.TopicNotFoundException;
|
||||||
import site.easystartup.web.forum.domain.Topic;
|
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.DiscussionMessageRepo;
|
||||||
import site.easystartup.web.forum.repo.DiscussionRepo;
|
import site.easystartup.web.forum.repo.DiscussionRepo;
|
||||||
import site.easystartup.web.forum.repo.TopicRepo;
|
import site.easystartup.web.forum.repo.TopicRepo;
|
||||||
|
import site.easystartup.web.service.UserService;
|
||||||
|
|
||||||
|
import java.security.Principal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@@ -28,24 +38,31 @@ public class ForumService {
|
|||||||
|
|
||||||
private final DiscussionRepo discussionRepo;
|
private final DiscussionRepo discussionRepo;
|
||||||
|
|
||||||
|
private final UserService userService;
|
||||||
|
|
||||||
|
public List<Topic> getAllTopics() {
|
||||||
|
return (List<Topic>) topicRepo.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
public List<DiscussionMessage> getMessagesByDiscussionId(long discussionId) {
|
public List<DiscussionMessage> getMessagesByDiscussionId(long discussionId) {
|
||||||
return Lists.newArrayList(discussionMessageRepo.findAll()).stream()
|
return Lists.newArrayList(discussionMessageRepo.findAll()).stream()
|
||||||
.filter(m -> m.getDiscussion_id() == discussionId).toList();
|
.filter(m -> m.getDiscussion_id() == discussionId).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Discussion getDiscussionById(long discussionId) {
|
public Discussion getDiscussionById(long discussion_id) {
|
||||||
return discussionRepo.findById(discussionId).get();
|
return discussionRepo.findById(discussion_id)
|
||||||
|
.orElseThrow(new DiscussionNotFoundException("Could not get discussion with id " + discussion_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Discussion> getDiscussionsByAuthor(String author) {
|
public List<Discussion> getDiscussionsByAuthor(Principal principal) {
|
||||||
return Lists.newArrayList(discussionRepo.findAll()).stream()
|
return Lists.newArrayList(discussionRepo.findAll()).stream()
|
||||||
.filter(d -> d.getAuthor().equals(author)).toList();
|
.filter(d -> d.getAuthor().equals(principal.getName())).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Discussion> getDiscussionsByMember(String member) {
|
public List<Discussion> getDiscussionsByMember(Principal principal) {
|
||||||
return Lists.newArrayList(discussionRepo.findAll()).stream()
|
return Lists.newArrayList(discussionRepo.findAll()).stream()
|
||||||
.filter(d -> getMessagesByDiscussionId(d.getId()).stream()
|
.filter(d -> getMessagesByDiscussionId(d.getId()).stream()
|
||||||
.anyMatch(m -> m.getSender().equals(member))).toList();
|
.anyMatch(m -> m.getSender().equals(principal.getName()))).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Discussion> getPinnedDiscussionsByTopicId(long topic_id) {
|
public List<Discussion> getPinnedDiscussionsByTopicId(long topic_id) {
|
||||||
@@ -62,70 +79,119 @@ public class ForumService {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void createTopic(String title, String description, User user) {
|
public List<Discussion> getDiscussionsByPage(long topic_id, long page) {
|
||||||
description = description == null ? "" : description;
|
List<Discussion> 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 topic = new Topic();
|
||||||
topic.setTitle(title);
|
topic.setTitle(topic.getTitle());
|
||||||
topic.setDescription(description);
|
topic.setDescription(description);
|
||||||
topic.setAuthor(user.getUsername());
|
topic.setAuthor(principal.getName());
|
||||||
topic.setLast_update(new Date());
|
topic.setLast_update(new Date());
|
||||||
topic.setSize(0);
|
topic.setSize(0);
|
||||||
topicRepo.save(topic);
|
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 discussion = new Discussion();
|
||||||
discussion.setAuthor(user.getUsername());
|
discussion.setAuthor(principal.getName());
|
||||||
discussion.setDate(new Date());
|
discussion.setDate(new Date());
|
||||||
discussion.setTitle(title);
|
discussion.setTitle(discussionRequest.getTitle());
|
||||||
discussion.setTopic(topic);
|
discussion.setTopic(topic_id);
|
||||||
discussion.setMessages(new ArrayList<>());
|
discussion.setMessages(new ArrayList<>());
|
||||||
discussion.setLast_update(new Date());
|
discussion.setLast_update(new Date());
|
||||||
discussion.setStatus(DiscussionStatus.OPEN);
|
discussion.setStatus(DiscussionStatus.OPEN);
|
||||||
discussion.setPinned(false);
|
discussion.setPinned(false);
|
||||||
discussionRepo.save(discussion);
|
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) {
|
public Discussion editDiscussion(DiscussionRequest discussionRequest, long discussion_id, Principal principal) {
|
||||||
Discussion discussion = discussionRepo.findById(discussion_id).orElseThrow();
|
User user = userService.getUserByPrincipal(principal);
|
||||||
if(!(discussion.getAuthor().equals(user.getUsername()) || user.isModer())) throw new SecurityException();
|
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.setAuthor(user.getUsername());
|
||||||
discussion.setTitle(title);
|
discussion.setTitle(discussionRequest.getTitle());
|
||||||
discussion.setLast_update(new Date());
|
discussion.setLast_update(new Date());
|
||||||
discussion.setStatus(status);
|
discussion.setStatus(discussionRequest.getStatus());
|
||||||
discussionRepo.save(discussion);
|
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();
|
DiscussionMessage message = new DiscussionMessage();
|
||||||
message.setDate(new Date());
|
message.setDate(new Date());
|
||||||
message.setEdited(false);
|
message.setEdited(false);
|
||||||
message.setSender(user.getUsername());
|
message.setSender(principal.getName());
|
||||||
message.setText(text);
|
message.setText(messageRequest.getText());
|
||||||
message.setDiscussion_id(discussion_id);
|
message.setDiscussion_id(discussion_id);
|
||||||
discussionMessageRepo.save(message);
|
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<Long> newMsgs = discussion.getMessages();
|
List<Long> newMsgs = discussion.getMessages();
|
||||||
newMsgs.add(message.getId());
|
newMsgs.add(message.getId());
|
||||||
discussion.setMessages(newMsgs);
|
discussion.setMessages(newMsgs);
|
||||||
discussionRepo.save(discussion);
|
discussionRepo.save(discussion);
|
||||||
|
onDiscussionMessageUpdate(message);
|
||||||
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void editDiscussionMessage(String text, long message_id, User user) {
|
public DiscussionMessage editDiscussionMessage(DiscussionMessageRequest messageRequest, long message_id, Principal principal) {
|
||||||
DiscussionMessage message = discussionMessageRepo.findById(message_id).orElseThrow();
|
User user = userService.getUserByPrincipal(principal);
|
||||||
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());
|
||||||
message.setEdited(true);
|
message.setEdited(true);
|
||||||
message.setText(text);
|
message.setText(messageRequest.getText());
|
||||||
discussionMessageRepo.save(message);
|
discussionMessageRepo.save(message);
|
||||||
|
onDiscussionMessageUpdate(message);
|
||||||
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteDiscussionMessage(long message_id, User user) {
|
public void deleteDiscussionMessage(long message_id, User user) {
|
||||||
DiscussionMessage message = discussionMessageRepo.findById(message_id).orElseThrow();
|
DiscussionMessage message = discussionMessageRepo.findById(message_id)
|
||||||
if(!(message.getSender().equals(user.getUsername()) || user.isAdmin())) throw new SecurityException();
|
.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);
|
discussionMessageRepo.delete(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DiscussionMessage getDiscussionMessageById(long id) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,12 +6,11 @@ import org.springframework.http.ResponseEntity;
|
|||||||
import org.springframework.util.ObjectUtils;
|
import org.springframework.util.ObjectUtils;
|
||||||
import org.springframework.validation.BindingResult;
|
import org.springframework.validation.BindingResult;
|
||||||
import org.springframework.web.bind.annotation.*;
|
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.model.Project;
|
||||||
import site.easystartup.web.project.domain.payload.requst.ParticipantRequest;
|
import site.easystartup.web.project.domain.requst.ParticipantRequest;
|
||||||
import site.easystartup.web.project.domain.payload.requst.ProjectRequest;
|
import site.easystartup.web.project.domain.requst.ProjectRequest;
|
||||||
import site.easystartup.web.project.domain.payload.response.ResponseMessage;
|
import site.easystartup.web.domain.response.ResponseMessage;
|
||||||
import site.easystartup.web.project.domain.validation.ResponseErrorValidation;
|
import site.easystartup.web.domain.validation.ResponseErrorValidation;
|
||||||
import site.easystartup.web.project.dto.ParticipantDto;
|
import site.easystartup.web.project.dto.ParticipantDto;
|
||||||
import site.easystartup.web.project.dto.ProjectDto;
|
import site.easystartup.web.project.dto.ProjectDto;
|
||||||
import site.easystartup.web.project.service.ProjectService;
|
import site.easystartup.web.project.service.ProjectService;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package site.easystartup.web.project.domain.model;
|
|||||||
|
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
import site.easystartup.web.domain.User;
|
import site.easystartup.web.domain.model.User;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package site.easystartup.web.project.domain.model;
|
|||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
import site.easystartup.web.domain.User;
|
import site.easystartup.web.domain.model.User;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package site.easystartup.web.project.domain.payload.requst;
|
package site.easystartup.web.project.domain.requst;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package site.easystartup.web.project.domain.payload.requst;
|
package site.easystartup.web.project.domain.requst;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package site.easystartup.web.project.dto;
|
package site.easystartup.web.project.dto;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import site.easystartup.web.domain.Role;
|
import site.easystartup.web.domain.model.Role;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|||||||
@@ -12,5 +12,5 @@ import java.util.LinkedHashSet;
|
|||||||
@Repository
|
@Repository
|
||||||
public interface ParticipantRepo extends JpaRepository<Participant, Long> {
|
public interface ParticipantRepo extends JpaRepository<Participant, Long> {
|
||||||
@Query ("SELECT Project FROM Participant WHERE nameOfPosition = :nameOfPosition")
|
@Query ("SELECT Project FROM Participant WHERE nameOfPosition = :nameOfPosition")
|
||||||
LinkedHashSet<Project> findAllByNameOfPosition(@Param("nameOfPosition") String nameOfPosition);
|
LinkedHashSet<Project> findAllByNameOfPosition(@Param("nameOfPosition") String name);
|
||||||
}
|
}
|
||||||
@@ -4,11 +4,10 @@ import org.springframework.data.jpa.repository.JpaRepository;
|
|||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.data.repository.query.Param;
|
import org.springframework.data.repository.query.Param;
|
||||||
import org.springframework.stereotype.Repository;
|
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 site.easystartup.web.project.domain.model.Project;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface ProjectRepo extends JpaRepository<Project, Long> {
|
public interface ProjectRepo extends JpaRepository<Project, Long> {
|
||||||
|
|||||||
@@ -3,12 +3,11 @@ package site.easystartup.web.project.service;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.modelmapper.ModelMapper;
|
import org.modelmapper.ModelMapper;
|
||||||
import org.springframework.stereotype.Service;
|
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.exception.ProjectNotFoundException;
|
||||||
import site.easystartup.web.project.domain.model.Participant;
|
import site.easystartup.web.project.domain.model.Participant;
|
||||||
import site.easystartup.web.project.domain.model.Project;
|
import site.easystartup.web.project.domain.model.Project;
|
||||||
import site.easystartup.web.project.domain.payload.requst.ProjectRequest;
|
import site.easystartup.web.project.domain.requst.ProjectRequest;
|
||||||
import site.easystartup.web.project.domain.payload.response.ResponseMessage;
|
|
||||||
import site.easystartup.web.project.repo.ParticipantRepo;
|
import site.easystartup.web.project.repo.ParticipantRepo;
|
||||||
import site.easystartup.web.project.repo.ProjectRepo;
|
import site.easystartup.web.project.repo.ProjectRepo;
|
||||||
import site.easystartup.web.service.UserService;
|
import site.easystartup.web.service.UserService;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package site.easystartup.web.repo;
|
package site.easystartup.web.repo;
|
||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
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, Long> {
|
public interface UserRepo extends JpaRepository<User, Long> {
|
||||||
User findByUsername(String username);
|
User findByUsername(String username);
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import org.springframework.security.core.Authentication;
|
|||||||
import org.springframework.security.core.context.SecurityContextHolder;
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||||
import org.springframework.stereotype.Service;
|
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 site.easystartup.web.repo.UserRepo;
|
||||||
|
|
||||||
import java.security.Principal;
|
import java.security.Principal;
|
||||||
@@ -22,12 +22,4 @@ public class UserService {
|
|||||||
public User getUserById(Long userId) {
|
public User getUserById(Long userId) {
|
||||||
return userRepo.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User not found"));
|
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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -10,7 +10,7 @@ import org.springframework.ui.Model;
|
|||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder;
|
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 site.easystartup.web.storage.service.StorageService;
|
||||||
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package site.easystartup.web.storage.service;
|
package site.easystartup.web.storage.domain.exception;
|
||||||
|
|
||||||
public class StorageFileNotFoundException extends RuntimeException {
|
public class StorageFileNotFoundException extends RuntimeException {
|
||||||
public StorageFileNotFoundException(String filename) {
|
public StorageFileNotFoundException(String filename) {
|
||||||
@@ -1,9 +1,17 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>403</title>
|
<title>Создание обсуждения</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<p>Создание обсуждения</p>
|
||||||
|
<form th:action="'/forum/' + ${topic_id} '/edit'" method="post">
|
||||||
|
<p>Название</p>
|
||||||
|
<input type="text" name="title">
|
||||||
|
<input type="submit" th:text="Отправить">
|
||||||
|
|
||||||
|
</form>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>403</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>Создание обсуждения</p>
|
||||||
|
<form th:action="'/forum/discussion/' + ${discussion.id} '/create'" method="post">
|
||||||
|
<p>Название</p>
|
||||||
|
<input type="text" th:value="${discussion.title}" name="title">
|
||||||
|
<label>
|
||||||
|
<p>Статус обсуждения</p>
|
||||||
|
<input name="type" type="radio" value="OPEN" th:text="Открыто" checked>
|
||||||
|
<input name="type" type="radio" value="CLOSED" th:text="Закрыто">
|
||||||
|
</label>
|
||||||
|
<input type="submit" th:text="Отправить">
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Новое сообщение</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>Отправка сообщения</p>
|
||||||
|
<form th:action="'/forum/discussion/' + ${discussion_id} '/add'" method="post">
|
||||||
|
<p>Сообщение</p>
|
||||||
|
<input type="text" name="title">
|
||||||
|
<input type="submit" th:text="Отправить">
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,16 +1,18 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>403</title>
|
<title>Discussion</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div>
|
<div>
|
||||||
<h1 th:text="${discussion.title} + ' (созданно ' + ${#dates.format(el.last_update, 'hh:mm dd MMM yyyy')}"/>
|
<h1 th:text="${discussion.title} + ' (созданно ' + ${#dates.format(el.last_update, 'hh:mm dd MMM yyyy')}"/>
|
||||||
|
<p th:text="'Автор: ' + ${discussion.author}"/>
|
||||||
</div>
|
</div>
|
||||||
<h2>Сообщения</h2>
|
<h2>Сообщения</h2>
|
||||||
<div th:each="el : ${messages}">
|
<div th:each="el : ${messages}">
|
||||||
<h2 th:text="${el.}"/>
|
<h2 th:text="${el.text}"/>
|
||||||
<p th:text="'Автор: ' + ${el.author}"/>
|
<p th:text="'Автор: ' + ${el.author}"/>
|
||||||
<p th:text="'Дата создания: ' + ${#dates.format(el.date, 'hh:mm dd MMM yyyy')}"/>
|
<p th:text="'Дата создания: ' + ${#dates.format(el.date, 'hh:mm dd MMM yyyy')}"/>
|
||||||
<p th:text="'Последнее обновление: ' + ${#dates.format(el.last_update, 'hh:mm dd MMM yyyy')}"/>
|
<p th:text="'Последнее обновление: ' + ${#dates.format(el.last_update, 'hh:mm dd MMM yyyy')}"/>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import org.springframework.boot.test.mock.mockito.MockBean;
|
|||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.mock.web.MockMultipartFile;
|
import org.springframework.mock.web.MockMultipartFile;
|
||||||
import org.springframework.test.web.servlet.MockMvc;
|
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 site.easystartup.web.storage.service.StorageService;
|
||||||
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
@@ -35,7 +35,6 @@ public class FileUploadTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private MockMvc mvc;
|
private MockMvc mvc;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Reference in new issue
Block a user