Change mapping to Rest

This commit is contained in:
redtea committed 2022-08-30 23:26:56 +03:00
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,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,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,4 +1,4 @@
package site.easystartup.web.project.domain.payload.response; package site.easystartup.web.domain.response;
import lombok.Data; import lombok.Data;
@@ -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,
DiscussionMessage message = forumService.getDiscussionMessageById(message_id); Principal principal) {
User user = userService.getCurrentUser(); val errors = responseErrorValidation.mapValidationService(bindingResult);
if(!(message.getSender().equals(user.getUsername()) || user.isModer())) return "/403-error"; if (!ObjectUtils.isEmpty(errors)) return errors;
model.addAttribute("discussion", forumService.getDiscussionById(discussion_id)); val messageUpdated = forumService.editDiscussionMessage(messageRequest, message_id, principal);
model.addAttribute("messages ", forumService.getMessagesByDiscussionId(discussion_id)); return ResponseEntity.ok().body(modelMapper.map(messageUpdated, DiscussionMessageDto.class));
return "/discussion"; }
@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!"));
} }
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
@@ -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,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;
@@ -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,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,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,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>
+4 -2
View File
@@ -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);
}
}