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.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,4 +1,4 @@
package site.easystartup.web.domain;
package site.easystartup.web.domain.model;
public enum Role {
USER, PREMIUM, MODER, ADMIN;
@@ -1,4 +1,4 @@
package site.easystartup.web.domain;
package site.easystartup.web.domain.model;
import lombok.*;
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;
@@ -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!"));
}
@@ -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 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;
@@ -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,4 +1,4 @@
package site.easystartup.web.forum.domain;
package site.easystartup.web.forum.domain.model;
public enum DiscussionStatus {
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 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,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,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,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) {