diff --git a/src/main/java/net/sytes/kashey/sweater/controller/ControllerUtils.java b/src/main/java/net/sytes/kashey/sweater/controller/ControllerUtils.java index 13d4aa7..f33bd9e 100644 --- a/src/main/java/net/sytes/kashey/sweater/controller/ControllerUtils.java +++ b/src/main/java/net/sytes/kashey/sweater/controller/ControllerUtils.java @@ -1,9 +1,15 @@ package net.sytes.kashey.sweater.controller; +import net.sytes.kashey.sweater.domain.Message; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; +import org.springframework.web.multipart.MultipartFile; +import java.io.File; +import java.io.IOException; import java.util.Map; +import java.util.Objects; +import java.util.UUID; import java.util.stream.Collector; import java.util.stream.Collectors; @@ -16,4 +22,17 @@ public class ControllerUtils { ); return bindingResult.getFieldErrors().stream().collect(collector); } + + static void saveFile(Message message, MultipartFile file, String uploadPath) throws IOException { + if (file != null && !Objects.requireNonNull(file.getOriginalFilename()).isEmpty()) { + File uploadDir = new File(uploadPath); // Директория на сервере, куда помещаем пришедший файл + if (!uploadDir.exists()) { + uploadDir.mkdirs(); + } + String uuidFile = UUID.randomUUID().toString(); + String resultFilename = uuidFile + "." + file.getOriginalFilename(); // случайный уид + имя файла с клиента + file.transferTo(new File(uploadPath + "/" + resultFilename)); // помещаем переименованный файл с клиента в директорию сервера + message.setFilename(resultFilename); + } + } } \ No newline at end of file diff --git a/src/main/java/net/sytes/kashey/sweater/controller/MainController.java b/src/main/java/net/sytes/kashey/sweater/controller/MainController.java index 1dfa3d0..526e754 100644 --- a/src/main/java/net/sytes/kashey/sweater/controller/MainController.java +++ b/src/main/java/net/sytes/kashey/sweater/controller/MainController.java @@ -14,11 +14,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; -import java.io.File; import java.io.IOException; import java.util.Map; -import java.util.Objects; -import java.util.UUID; @Controller public class MainController { @@ -64,18 +61,7 @@ public class MainController { model.mergeAttributes(errorsMap); model.addAttribute("message", message); } else { - - if (file != null && !Objects.requireNonNull(file.getOriginalFilename()).isEmpty()) { - File uploadDir = new File(uploadPath); // Директория на сервере, куда помещаем пришедший файл - if (!uploadDir.exists()) { - uploadDir.mkdirs(); - } - String uuidFile = UUID.randomUUID().toString(); - String resultFilename = uuidFile + "." + file.getOriginalFilename(); // случайный уид + имя файла с клиента - file.transferTo(new File(uploadPath + "/" + resultFilename)); // помещаем переименованный файл с клиента в директорию сервера - message.setFilename(resultFilename); - } - + ControllerUtils.saveFile(message, file, uploadPath); messageRepository.save(message); model.addAttribute("message", null); } diff --git a/src/main/java/net/sytes/kashey/sweater/controller/UserMessagesController.java b/src/main/java/net/sytes/kashey/sweater/controller/UserMessagesController.java new file mode 100644 index 0000000..a45227b --- /dev/null +++ b/src/main/java/net/sytes/kashey/sweater/controller/UserMessagesController.java @@ -0,0 +1,69 @@ +package net.sytes.kashey.sweater.controller; + + +import net.sytes.kashey.sweater.domain.Message; +import net.sytes.kashey.sweater.domain.User; +import net.sytes.kashey.sweater.repository.MessageRepository; +import net.sytes.kashey.sweater.security.CustomUserDetails; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +@Controller +@RequestMapping("/") +public class UserMessagesController { + + private final MessageRepository messageRepository; + + @Value("${upload.path}") + private String uploadPath; + + public UserMessagesController(MessageRepository messageRepository) { + + this.messageRepository = messageRepository; + } + + @GetMapping("/user-messages/{user}") + public String getUserMessages(@PathVariable User user, + @RequestParam(required = false) Message message, + @AuthenticationPrincipal CustomUserDetails customUserDetails, + Model model) { + + User currentUser = customUserDetails.getUser(); + model.addAttribute("isCurrentUser", user.equals(currentUser)); + model.addAttribute("messages", user.getMessages()); + model.addAttribute("message", message); + return "user_messages"; + } + + @PostMapping("/user-messages/{userId}") + public String getUserMessages(@AuthenticationPrincipal CustomUserDetails customUserDetails, + @PathVariable(name = "userId") Long userId, + @RequestParam(required = false) Message message, + @RequestParam String text, + @RequestParam String tag, + @RequestParam("file") MultipartFile file + ) throws IOException { + + User currentUser = customUserDetails.getUser(); + if (message.getAuthor().equals(currentUser)) { + if (!ObjectUtils.isEmpty(text)) { + message.setText(text); + } + + if (!ObjectUtils.isEmpty(tag)) { + message.setTag(tag); + } + + ControllerUtils.saveFile(message, file, uploadPath); + messageRepository.save(message); + } + return "redirect:/user-messages/" + userId; + } +} \ No newline at end of file diff --git a/src/main/java/net/sytes/kashey/sweater/domain/User.java b/src/main/java/net/sytes/kashey/sweater/domain/User.java index 3beaf47..d670228 100644 --- a/src/main/java/net/sytes/kashey/sweater/domain/User.java +++ b/src/main/java/net/sytes/kashey/sweater/domain/User.java @@ -6,11 +6,12 @@ import jakarta.validation.constraints.NotBlank; import java.io.Serial; import java.io.Serializable; +import java.util.Objects; import java.util.Set; @Entity @Table(name = "usr") -public class User implements Serializable { +public class User implements Serializable { @Serial private static final long serialVersionUID = 1L; @@ -34,6 +35,22 @@ public class User implements Serializable { @Enumerated(EnumType.STRING) private Set roles; + @OneToMany(mappedBy = "author", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private Set messages; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + public User() { } @@ -101,4 +118,12 @@ public class User implements Serializable { public void setActivationCode(String activationCode) { this.activationCode = activationCode; } + + public Set getMessages() { + return messages; + } + + public void setMessages(Set messages) { + this.messages = messages; + } } diff --git a/src/main/java/net/sytes/kashey/sweater/security/CustomUserDetails.java b/src/main/java/net/sytes/kashey/sweater/security/CustomUserDetails.java index c2d4c82..47ab097 100644 --- a/src/main/java/net/sytes/kashey/sweater/security/CustomUserDetails.java +++ b/src/main/java/net/sytes/kashey/sweater/security/CustomUserDetails.java @@ -65,4 +65,8 @@ public class CustomUserDetails implements UserDetails { public String getEmail() { return user.getEmail(); } + + public Long getId() { + return user.getId(); + } } \ No newline at end of file diff --git a/src/main/resources/templates/greeting.ftl b/src/main/resources/templates/greeting.ftl index dc0813e..12fff8e 100644 --- a/src/main/resources/templates/greeting.ftl +++ b/src/main/resources/templates/greeting.ftl @@ -1,6 +1,7 @@ <#import "parts/common.ftl" as com> +<#include "parts/security.ftl"> <@com.page> -
Hello, guest
+
Hello, <#if user??> ${name} <#else> guest
This is a simple version of Twitter
diff --git a/src/main/resources/templates/main.ftl b/src/main/resources/templates/main.ftl index 10f520e..500159a 100644 --- a/src/main/resources/templates/main.ftl +++ b/src/main/resources/templates/main.ftl @@ -7,63 +7,6 @@ - - -
-
-
-
- - <#if textError??> -
- ${textError} -
- -
-
- - <#if tagError??> -
- ${tagError} -
- -
-
-
- - -
-
- -
- -
-
-
-
-
- <#list messages as message> -
-
- <#if message.filename??> - - -
-
- ${message.text} - ${message.tag} -
- -
- <#else> - No messages found - -
+ <#include "parts/messageEditor.ftl"> + <#include "parts/messageList.ftl"> \ No newline at end of file diff --git a/src/main/resources/templates/parts/messageEditor.ftl b/src/main/resources/templates/parts/messageEditor.ftl new file mode 100644 index 0000000..35abfd4 --- /dev/null +++ b/src/main/resources/templates/parts/messageEditor.ftl @@ -0,0 +1,39 @@ + +
+
+
+
+ + <#if textError??> +
+ ${textError} +
+ +
+
+ + <#if tagError??> +
+ ${tagError} +
+ +
+
+
+ + +
+
+ + ${message.id}/> +
+ +
+
+
+
\ No newline at end of file diff --git a/src/main/resources/templates/parts/messageList.ftl b/src/main/resources/templates/parts/messageList.ftl new file mode 100644 index 0000000..5eeff32 --- /dev/null +++ b/src/main/resources/templates/parts/messageList.ftl @@ -0,0 +1,25 @@ +<#include "security.ftl"> + +
+ <#list messages as message> +
+
+ <#if message.filename??> + + +
+ ${message.text}
+ #${message.tag} +
+ +
+
+ <#else> +

No messages found

+ +
\ No newline at end of file diff --git a/src/main/resources/templates/parts/navbar.ftl b/src/main/resources/templates/parts/navbar.ftl index 5371439..cdfc125 100644 --- a/src/main/resources/templates/parts/navbar.ftl +++ b/src/main/resources/templates/parts/navbar.ftl @@ -17,10 +17,15 @@ + <#if user??> + + <#if isAdmin> - + <#if user??>