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.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;
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package site.easystartup.web.domain;
|
||||
package site.easystartup.web.domain.model;
|
||||
|
||||
public enum Role {
|
||||
USER, PREMIUM, MODER, ADMIN;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package site.easystartup.web.domain;
|
||||
package site.easystartup.web.domain.model;
|
||||
|
||||
import lombok.*;
|
||||
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;
|
||||
|
||||
+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.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.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<List<TopicDto>> 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<List<DiscussionDto>> 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<List<DiscussionDto>> 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<Object> 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<List<DiscussionDto>> topicPage(@PathVariable long topic_id,
|
||||
@PathVariable long page_id) {
|
||||
List<DiscussionDto> 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<DiscussionDto> 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<Object> 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<Object> 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<Object> 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<DiscussionMessageDto> 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<Object> 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<Object> 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!"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
+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 org.hibernate.Hibernate;
|
||||
|
||||
@@ -19,8 +20,15 @@ public class Discussion implements Comparable<Discussion>{
|
||||
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;
|
||||
+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 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;
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package site.easystartup.web.forum.domain;
|
||||
package site.easystartup.web.forum.domain.model;
|
||||
|
||||
public enum DiscussionStatus {
|
||||
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 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
|
||||
@@ -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;
|
||||
|
||||
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> {
|
||||
}
|
||||
@@ -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<Discussion, Long> {
|
||||
}
|
||||
@@ -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<Topic, Long> {
|
||||
}
|
||||
@@ -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<Topic> getAllTopics() {
|
||||
return (List<Topic>) topicRepo.findAll();
|
||||
}
|
||||
|
||||
public List<DiscussionMessage> 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<Discussion> getDiscussionsByAuthor(String author) {
|
||||
public List<Discussion> 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<Discussion> getDiscussionsByMember(String member) {
|
||||
public List<Discussion> 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<Discussion> 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<Discussion> getDiscussionsByPage(long topic_id, long page) {
|
||||
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.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<Long> 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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
+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.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.RequiredArgsConstructor;
|
||||
@@ -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;
|
||||
|
||||
@@ -12,5 +12,5 @@ import java.util.LinkedHashSet;
|
||||
@Repository
|
||||
public interface ParticipantRepo extends JpaRepository<Participant, Long> {
|
||||
@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.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<Project, Long> {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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, Long> {
|
||||
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.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());
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
+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 StorageFileNotFoundException(String filename) {
|
||||
@@ -1,9 +1,17 @@
|
||||
<!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>
|
||||
<title>Создание обсуждения</title>
|
||||
</head>
|
||||
<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>
|
||||
</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>
|
||||
<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>
|
||||
<title>Discussion</title>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<h1 th:text="${discussion.title} + ' (созданно ' + ${#dates.format(el.last_update, 'hh:mm dd MMM yyyy')}"/>
|
||||
<p th:text="'Автор: ' + ${discussion.author}"/>
|
||||
</div>
|
||||
<h2>Сообщения</h2>
|
||||
<div th:each="el : ${messages}">
|
||||
<h2 th:text="${el.}"/>
|
||||
<h2 th:text="${el.text}"/>
|
||||
<p th:text="'Автор: ' + ${el.author}"/>
|
||||
<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')}"/>
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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