Added User API

This commit is contained in:
redtea committed 2022-08-31 16:29:11 +03:00
1 parent 6daa2dea77
commit 4daf890555
7 files changed
+152 -19

No files matched your search

@@ -36,7 +36,7 @@ public class ChatService {
public List<ChatMessage> getChatMessages(String sender, String recipient, Principal principal) { public List<ChatMessage> getChatMessages(String sender, String recipient, Principal principal) {
if(!getChatRoom(sender, recipient).getSender().equals(principal.getName()) if(!getChatRoom(sender, recipient).getSender().equals(principal.getName())
|| !(userService.getUserByPrincipal(principal)).isAdmin()) && !(userService.getUserByPrincipal(principal)).isAdmin())
throw new NoPermissionException( throw new NoPermissionException(
String.format("User %s dont have perms to see chat %s / %s", sender, recipient)); String.format("User %s dont have perms to see chat %s / %s", sender, recipient));
@@ -49,7 +49,7 @@ public class ChatService {
public List<ChatRoom> getChats(String sender, Principal principal) { public List<ChatRoom> getChats(String sender, Principal principal) {
if(!principal.getName().equals(sender) if(!principal.getName().equals(sender)
|| !(userService.getUserByPrincipal(principal)).isAdmin()) && !(userService.getUserByPrincipal(principal)).isAdmin())
throw new NoPermissionException( throw new NoPermissionException(
String.format("User %s dont have perms to see chats %s", sender)); String.format("User %s dont have perms to see chats %s", sender));
@@ -84,7 +84,7 @@ public class ChatService {
public List<ChatMessage> getByChatId(String chat_id, Principal principal) { public List<ChatMessage> getByChatId(String chat_id, Principal principal) {
if(!getChatRoom(chat_id).getSender().equals(principal.getName()) if(!getChatRoom(chat_id).getSender().equals(principal.getName())
|| !(userService.getUserByPrincipal(principal)).isAdmin()) && !(userService.getUserByPrincipal(principal)).isAdmin())
throw new NoPermissionException( throw new NoPermissionException(
String.format("User %s dont have perms to see chat %s", principal.getName(), chat_id)); String.format("User %s dont have perms to see chat %s", principal.getName(), chat_id));
@@ -0,0 +1,52 @@
package site.easystartup.web.controller;
import lombok.RequiredArgsConstructor;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import site.easystartup.web.domain.model.User;
import site.easystartup.web.domain.validation.ResponseErrorValidation;
import site.easystartup.web.dto.UserDto;
import site.easystartup.web.exception.NoPermissionException;
import site.easystartup.web.forum.domain.model.Topic;
import site.easystartup.web.project.domain.model.Project;
import site.easystartup.web.project.dto.ProjectDto;
import site.easystartup.web.project.service.ProjectService;
import site.easystartup.web.request.UserRequest;
import site.easystartup.web.service.UserService;
import java.security.Principal;
@RestController
@RequiredArgsConstructor(onConstructor_ = @Autowired)
public class UserController {
private final UserService userService;
private final ModelMapper modelMapper;
private final ResponseErrorValidation responseErrorValidation;
@GetMapping("/user/{username}")
public ResponseEntity<UserDto> user(@PathVariable String username) {
return ResponseEntity.ok().body(modelMapper.map(userService.getUserByUsername(username), UserDto.class));
}
@PostMapping("/user/{username}/edit")
public ResponseEntity<Object> userEdit(@PathVariable String username, UserRequest userRequest,
BindingResult bindingResult, Principal principal) {
if(!principal.getName().equals(username) && !userService.getUserByPrincipal(principal).isAdmin())
throw new NoPermissionException(String.format("User %s can not edit profile of user %s", principal.getName(),
username));
var errors = responseErrorValidation.mapValidationService(bindingResult);
if (!ObjectUtils.isEmpty(errors)) return errors;
User editedUser = userService.editUser(username, userRequest);
return ResponseEntity.ok().body(modelMapper.map(editedUser, UserDto.class));
}
}
@@ -0,0 +1,25 @@
package site.easystartup.web.dto;
import lombok.Data;
import site.easystartup.web.domain.model.Role;
import site.easystartup.web.project.domain.model.Participant;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
@Data
public class UserDto implements Serializable {
private long id;
private String username;
private boolean active;
private String full_name;
private String status;
private String iconPath;
private String email;
private Set<String> tags;
private Set<String> professions;
private Set<Long> projects;
private List<Participant> requests;
private Set<Role> roles;
}
@@ -42,21 +42,21 @@ public class ForumController {
public ResponseEntity<List<TopicDto>> main(@Valid @RequestBody ProjectRequest projectRequest, public ResponseEntity<List<TopicDto>> main(@Valid @RequestBody ProjectRequest projectRequest,
BindingResult bindingResult, BindingResult bindingResult,
Principal principal) { Principal principal) {
val topics = forumService.getAllTopics() var topics = forumService.getAllTopics()
.stream().map(topic -> modelMapper.map(topic, TopicDto.class)).collect(Collectors.toList()); .stream().map(topic -> modelMapper.map(topic, TopicDto.class)).collect(Collectors.toList());
return ResponseEntity.ok().body(topics); return ResponseEntity.ok().body(topics);
} }
@GetMapping("/my") @GetMapping("/my")
public ResponseEntity<List<DiscussionDto>> my(Principal principal) { public ResponseEntity<List<DiscussionDto>> my(Principal principal) {
val discussions = forumService.getDiscussionsByAuthor(principal) var discussions = forumService.getDiscussionsByAuthor(principal)
.stream().map(discussion -> modelMapper.map(discussion, DiscussionDto.class)).toList(); .stream().map(discussion -> modelMapper.map(discussion, DiscussionDto.class)).toList();
return ResponseEntity.ok().body(discussions); return ResponseEntity.ok().body(discussions);
} }
@GetMapping("/takepart") @GetMapping("/takepart")
public ResponseEntity<List<DiscussionDto>> takePart(Principal principal) { public ResponseEntity<List<DiscussionDto>> takePart(Principal principal) {
val discussions = forumService.getDiscussionsByMember(principal) var discussions = forumService.getDiscussionsByMember(principal)
.stream().map(discussion -> modelMapper.map(discussion, DiscussionDto.class)).toList(); .stream().map(discussion -> modelMapper.map(discussion, DiscussionDto.class)).toList();
return ResponseEntity.ok().body(discussions); return ResponseEntity.ok().body(discussions);
} }
@@ -66,7 +66,7 @@ public class ForumController {
public ResponseEntity<Object> forumNew(@Valid @RequestBody TopicRequest topicRequest, public ResponseEntity<Object> forumNew(@Valid @RequestBody TopicRequest topicRequest,
BindingResult bindingResult, BindingResult bindingResult,
Principal principal) { Principal principal) {
val errors = responseErrorValidation.mapValidationService(bindingResult); var errors = responseErrorValidation.mapValidationService(bindingResult);
if (!ObjectUtils.isEmpty(errors)) return errors; if (!ObjectUtils.isEmpty(errors)) return errors;
Topic topic = forumService.createTopic(topicRequest, principal); Topic topic = forumService.createTopic(topicRequest, principal);
@@ -91,10 +91,10 @@ public class ForumController {
@Valid @RequestBody DiscussionRequest discussionRequest, @Valid @RequestBody DiscussionRequest discussionRequest,
BindingResult bindingResult, BindingResult bindingResult,
Principal principal) { Principal principal) {
val errors = responseErrorValidation.mapValidationService(bindingResult); var errors = responseErrorValidation.mapValidationService(bindingResult);
if (!ObjectUtils.isEmpty(errors)) return errors; if (!ObjectUtils.isEmpty(errors)) return errors;
val discussion = forumService.createDiscussion(discussionRequest, topic_id, principal); var discussion = forumService.createDiscussion(discussionRequest, topic_id, principal);
return ResponseEntity.ok().body(modelMapper.map(discussion, DiscussionDto.class)); return ResponseEntity.ok().body(modelMapper.map(discussion, DiscussionDto.class));
} }
@@ -103,10 +103,10 @@ public class ForumController {
@PathVariable long discussion_id, @PathVariable long discussion_id,
BindingResult bindingResult, BindingResult bindingResult,
Principal principal) { Principal principal) {
val errors = responseErrorValidation.mapValidationService(bindingResult); var errors = responseErrorValidation.mapValidationService(bindingResult);
if (!ObjectUtils.isEmpty(errors)) return errors; if (!ObjectUtils.isEmpty(errors)) return errors;
val discussionUpdated = forumService.editDiscussion(discussionRequest, discussion_id, principal); var discussionUpdated = forumService.editDiscussion(discussionRequest, discussion_id, principal);
return ResponseEntity.ok().body(modelMapper.map(discussionUpdated, DiscussionDto.class)); return ResponseEntity.ok().body(modelMapper.map(discussionUpdated, DiscussionDto.class));
} }
@@ -115,10 +115,10 @@ public class ForumController {
@Valid @RequestBody DiscussionMessageRequest messageRequest, @Valid @RequestBody DiscussionMessageRequest messageRequest,
BindingResult bindingResult, BindingResult bindingResult,
Principal principal) { Principal principal) {
val errors = responseErrorValidation.mapValidationService(bindingResult); var errors = responseErrorValidation.mapValidationService(bindingResult);
if (!ObjectUtils.isEmpty(errors)) return errors; if (!ObjectUtils.isEmpty(errors)) return errors;
val discussionMessage = forumService.createDiscussionMessage(messageRequest, discussion_id, principal); var discussionMessage = forumService.createDiscussionMessage(messageRequest, discussion_id, principal);
return ResponseEntity.ok().body(modelMapper.map(discussionMessage, DiscussionMessageDto.class)); return ResponseEntity.ok().body(modelMapper.map(discussionMessage, DiscussionMessageDto.class));
} }
@@ -132,10 +132,10 @@ public class ForumController {
@PathVariable long message_id, @PathVariable long message_id,
BindingResult bindingResult, BindingResult bindingResult,
Principal principal) { Principal principal) {
val errors = responseErrorValidation.mapValidationService(bindingResult); var errors = responseErrorValidation.mapValidationService(bindingResult);
if (!ObjectUtils.isEmpty(errors)) return errors; if (!ObjectUtils.isEmpty(errors)) return errors;
val messageUpdated = forumService.editDiscussionMessage(messageRequest, message_id, principal); var messageUpdated = forumService.editDiscussionMessage(messageRequest, message_id, principal);
return ResponseEntity.ok().body(modelMapper.map(messageUpdated, DiscussionMessageDto.class)); return ResponseEntity.ok().body(modelMapper.map(messageUpdated, DiscussionMessageDto.class));
} }
@@ -143,7 +143,7 @@ public class ForumController {
public ResponseEntity<Object> messageDelete(@PathVariable long message_id, Principal principal) { public ResponseEntity<Object> messageDelete(@PathVariable long message_id, Principal principal) {
DiscussionMessage message = forumService.getDiscussionMessageById(message_id); DiscussionMessage message = forumService.getDiscussionMessageById(message_id);
User user = userService.getUserByPrincipal(principal); User user = userService.getUserByPrincipal(principal);
if(!(message.getSender().equals(user.getUsername()) || user.isModer())) if(!(message.getSender().equals(user.getUsername()) && user.isModer()))
return ResponseEntity.ok(new MessageResponse("No permissions!")); return ResponseEntity.ok(new MessageResponse("No permissions!"));
forumService.deleteDiscussionMessage(message_id, user); forumService.deleteDiscussionMessage(message_id, user);
return ResponseEntity.ok(new MessageResponse("Message was deleted!")); return ResponseEntity.ok(new MessageResponse("Message was deleted!"));
@@ -131,7 +131,7 @@ public class ForumService {
User user = userService.getUserByPrincipal(principal); User user = userService.getUserByPrincipal(principal);
Discussion discussion = discussionRepo.findById(discussion_id) Discussion discussion = discussionRepo.findById(discussion_id)
.orElseThrow(new DiscussionNotFoundException("Could not get discussion with id " + discussion_id)); .orElseThrow(new DiscussionNotFoundException("Could not get discussion with id " + discussion_id));
if(!(discussion.getAuthor().equals(user.getUsername()) || user.isModer())) if(!(discussion.getAuthor().equals(user.getUsername()) && user.isModer()))
throw new NoPermissionException(user.getUsername()); throw new NoPermissionException(user.getUsername());
discussion.setAuthor(user.getUsername()); discussion.setAuthor(user.getUsername());
discussion.setTitle(discussionRequest.getTitle()); discussion.setTitle(discussionRequest.getTitle());
@@ -164,7 +164,7 @@ public class ForumService {
User user = userService.getUserByPrincipal(principal); User user = userService.getUserByPrincipal(principal);
DiscussionMessage message = discussionMessageRepo.findById(message_id) DiscussionMessage message = discussionMessageRepo.findById(message_id)
.orElseThrow(new DiscussionMessageNotFoundException("Could not get message with id " + message_id)); .orElseThrow(new DiscussionMessageNotFoundException("Could not get message with id " + message_id));
if(!(message.getSender().equals(user.getUsername()) || user.isAdmin())) if(!(message.getSender().equals(user.getUsername()) && user.isAdmin()))
throw new NoPermissionException(user.getUsername()); throw new NoPermissionException(user.getUsername());
message.setEdited(true); message.setEdited(true);
message.setText(messageRequest.getText()); message.setText(messageRequest.getText());
@@ -176,7 +176,7 @@ public class ForumService {
public void deleteDiscussionMessage(long message_id, User user) { public void deleteDiscussionMessage(long message_id, User user) {
DiscussionMessage message = discussionMessageRepo.findById(message_id) DiscussionMessage message = discussionMessageRepo.findById(message_id)
.orElseThrow(new DiscussionMessageNotFoundException("Could not get message with id " + message_id)); .orElseThrow(new DiscussionMessageNotFoundException("Could not get message with id " + message_id));
if(!(message.getSender().equals(user.getUsername()) || user.isAdmin())) if(!(message.getSender().equals(user.getUsername()) && user.isAdmin()))
throw new NoPermissionException(user.getUsername()); throw new NoPermissionException(user.getUsername());
discussionMessageRepo.delete(message); discussionMessageRepo.delete(message);
} }
@@ -0,0 +1,40 @@
package site.easystartup.web.request;
import lombok.Data;
import site.easystartup.web.domain.model.Role;
import site.easystartup.web.project.domain.model.Participant;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
import java.util.Set;
@Data
public class UserRequest {
private long id;
private String username;
@NotNull
private boolean active;
@NotNull
private String full_name;
@Size(max = 60, message = "Status should be no more 60 signs")
@NotNull
private String status;
private String iconPath;
@Email(message = "It should have email format")
@NotBlank(message = "Email is required")
private String email;
private Set<String> tags;
private Set<String> professions;
private Set<Long> projects;
private List<Participant> requests;
private Set<Role> roles;
}
@@ -7,8 +7,10 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import site.easystartup.web.domain.model.User; import site.easystartup.web.domain.model.User;
import site.easystartup.web.repo.UserRepo; import site.easystartup.web.repo.UserRepo;
import site.easystartup.web.request.UserRequest;
import java.security.Principal; import java.security.Principal;
import java.util.TreeSet;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -26,4 +28,18 @@ public class UserService {
public User getUserByUsername(String username) { public User getUserByUsername(String username) {
return userRepo.findUserByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); return userRepo.findUserByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found"));
} }
public User editUser(String username, UserRequest userRequest) {
User user = userRepo.findByUsername(username);
user.setActive(userRequest.isActive());
user.setFull_name(userRequest.getFull_name());
user.setStatus(userRequest.getStatus());
user.setIconPath(user.getIconPath() == null ? user.getIconPath() : userRequest.getIconPath());
user.setEmail(userRequest.getEmail() == null ? user.getEmail() : userRequest.getEmail());
user.setTags(userRequest.getTags() == null ? user.getTags() : userRequest.getTags());
user.setProfessions(userRequest.getProfessions() == null ? user.getProfessions() : userRequest.getProfessions());
user.setProjects(userRequest.getProjects() == null ? user.getProjects() : userRequest.getProjects());
user.setRequests(userRequest.getRequests() == null ? user.getRequests() : userRequest.getRequests());
return userRepo.save(user);
}
} }