diff --git a/demo/data.mv.db b/demo/data.mv.db index 3b01bba..f803822 100644 Binary files a/demo/data.mv.db and b/demo/data.mv.db differ diff --git a/demo/src/main/java/com/example/demo/DemoApplication.java b/demo/src/main/java/com/example/demo/DemoApplication.java index ce8607d..9bd34ec 100644 --- a/demo/src/main/java/com/example/demo/DemoApplication.java +++ b/demo/src/main/java/com/example/demo/DemoApplication.java @@ -66,6 +66,9 @@ public class DemoApplication implements CommandLineRunner { final var user1 = userService.create(new UserEntity("User1", "password", "mail1@gmail.com")); final var user2 = userService.create(new UserEntity("User2", "password", "mail2@gmail.com")); final var user3 = userService.create(new UserEntity("User3", "password", "mail3@gmail.com")); + final var admin = new UserEntity("admin", "admin", "admin@gmail.com"); + admin.setRole(UserRole.ADMIN); + userService.create(admin); log.info("Create default order values"); final var orders = List.of( diff --git a/demo/src/main/java/com/example/demo/core/api/PageAttributesMapper.java b/demo/src/main/java/com/example/demo/core/api/PageAttributesMapper.java index 4b5af2c..69697b3 100644 --- a/demo/src/main/java/com/example/demo/core/api/PageAttributesMapper.java +++ b/demo/src/main/java/com/example/demo/core/api/PageAttributesMapper.java @@ -11,10 +11,10 @@ public class PageAttributesMapper { } // Метод преобразования - public static Map toAttributes(Page page, Function mapper) { + public static Map toAttributes(String prefix, Page page, Function mapper) { return Map.of( - "items", page.getContent().stream().map(mapper::apply).toList(), - "currentPage", page.getNumber(), - "totalPages", page.getTotalPages()); + prefix + "Items", page.getContent().stream().map(mapper::apply).toList(), + prefix + "CurrentPage", page.getNumber(), + prefix + "TotalPages", page.getTotalPages()); } } diff --git a/demo/src/main/java/com/example/demo/messages/api/MessageController.java b/demo/src/main/java/com/example/demo/messages/api/MessageController.java new file mode 100644 index 0000000..57d3396 --- /dev/null +++ b/demo/src/main/java/com/example/demo/messages/api/MessageController.java @@ -0,0 +1,87 @@ +package com.example.demo.messages.api; + +import java.util.Map; + +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +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.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import com.example.demo.core.api.PageAttributesMapper; +import com.example.demo.core.configuration.Constants; +import com.example.demo.messages.model.MessageEntity; +import com.example.demo.messages.service.MessageService; + +// Контроллер для сущности "Сообщение" +@Controller +@RequestMapping(MessageController.URL) +public class MessageController { + // URL для доступа к методам контроллера + public static final String URL = Constants.ADMIN_PREFIX + "/message"; + + // Представление для отображения списка сообщений + private static final String MESSAGE_VIEW = "messages"; + + // Атрибут модели для пагинации + private static final String PAGE_ATTRIBUTE = "page"; + + // Бизнес-логика для сущности "Сообщение" + private final MessageService messageService; + + // Библиотека для преобразования сущности + private final ModelMapper modelMapper; + + // Конструктор + public MessageController(MessageService messageService, ModelMapper modelMapper) { + this.messageService = messageService; + this.modelMapper = modelMapper; + } + + // Преобразовать из сущности в DTO + private MessageDto toDto(MessageEntity entity) { + return modelMapper.map(entity, MessageDto.class); + } + + // Получить все элементы + @GetMapping + public String getAll( + @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, + Model model) { + final Map attributes = PageAttributesMapper.toAttributes( + "message", + messageService.getAll(0L, page, Constants.DEFAULT_PAGE_SIZE), this::toDto); + model.addAllAttributes(attributes); + model.addAttribute(PAGE_ATTRIBUTE, page); + return MESSAGE_VIEW; + } + + // Удалить элемент + @PostMapping("/delete/{id}") + public String delete( + @PathVariable(name = "id") Long id, + @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, + RedirectAttributes redirectAttributes) { + redirectAttributes.addAttribute(PAGE_ATTRIBUTE, page); + final var messageEntity = messageService.get(id); + messageService.delete(messageEntity.getUser().getId(), id); + return Constants.REDIRECT_VIEW + URL; + } + + // Опубликовать сообщение + @PostMapping("/publish/{id}") + public String publish( + @PathVariable(name = "id") Long id, + @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, + RedirectAttributes redirectAttributes) { + redirectAttributes.addAttribute(PAGE_ATTRIBUTE, page); + final var messageEntity = messageService.get(id); + messageEntity.setIsPublished(true); + messageService.update(messageEntity.getUser().getId(), id, messageEntity); + return Constants.REDIRECT_VIEW + URL; + } +} diff --git a/demo/src/main/java/com/example/demo/messages/api/MessageDto.java b/demo/src/main/java/com/example/demo/messages/api/MessageDto.java index 553c3cf..6c728db 100644 --- a/demo/src/main/java/com/example/demo/messages/api/MessageDto.java +++ b/demo/src/main/java/com/example/demo/messages/api/MessageDto.java @@ -4,9 +4,7 @@ import java.time.LocalDateTime; import com.fasterxml.jackson.annotation.JsonProperty; -import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; // DTO для сущности "Сообщение" public class MessageDto { @@ -14,8 +12,6 @@ public class MessageDto { private Long id; // Электронная почта отправителя - @NotNull - @Min(1) private String userEmail; // Текст сообщения diff --git a/demo/src/main/java/com/example/demo/messages/service/MessageService.java b/demo/src/main/java/com/example/demo/messages/service/MessageService.java index 1324713..07ae0c8 100644 --- a/demo/src/main/java/com/example/demo/messages/service/MessageService.java +++ b/demo/src/main/java/com/example/demo/messages/service/MessageService.java @@ -3,6 +3,7 @@ package com.example.demo.messages.service; import java.util.List; import java.util.stream.StreamSupport; +import org.hibernate.Hibernate; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; @@ -62,6 +63,15 @@ public class MessageService { .orElseThrow(() -> new NotFoundException(MessageEntity.class, id)); } + // Получить элемент по идентификатору + @Transactional(readOnly = true) + public MessageEntity get(Long id) { + MessageEntity message = repository.findById(id) + .orElseThrow(() -> new NotFoundException(MessageEntity.class, id)); + Hibernate.initialize(message.getUser().getMessages()); + return message; + } + // Создать элемент @Transactional public MessageEntity create(Long userId, MessageEntity entity) { @@ -80,6 +90,7 @@ public class MessageService { final MessageEntity existsEntity = get(userId, id); existsEntity.setUser(entity.getUser()); existsEntity.setText(entity.getText()); + existsEntity.setIsPublished(entity.getIsPublished()); return repository.save(existsEntity); } diff --git a/demo/src/main/java/com/example/demo/users/api/UserController.java b/demo/src/main/java/com/example/demo/users/api/UserController.java index 47c5a81..d0ee5ab 100644 --- a/demo/src/main/java/com/example/demo/users/api/UserController.java +++ b/demo/src/main/java/com/example/demo/users/api/UserController.java @@ -3,6 +3,7 @@ package com.example.demo.users.api; import java.util.Map; import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; @@ -11,7 +12,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import com.example.demo.core.api.PageAttributesMapper; @@ -22,8 +22,8 @@ import com.example.demo.users.service.UserService; import jakarta.validation.Valid; // Контроллер для сущности "Пользователь" -@RestController -@RequestMapping(UserController.URL + "/user") +@Controller +@RequestMapping(UserController.URL) public class UserController { // URL для доступа к методам контроллера public static final String URL = Constants.ADMIN_PREFIX + "/user"; @@ -68,6 +68,7 @@ public class UserController { @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, Model model) { final Map attributes = PageAttributesMapper.toAttributes( + "user", userService.getAll(page, Constants.DEFAULT_PAGE_SIZE), this::toDto); model.addAllAttributes(attributes); model.addAttribute(PAGE_ATTRIBUTE, page); diff --git a/demo/src/main/java/com/example/demo/users/api/UserMessageController.java b/demo/src/main/java/com/example/demo/users/api/UserMessageController.java new file mode 100644 index 0000000..3d89457 --- /dev/null +++ b/demo/src/main/java/com/example/demo/users/api/UserMessageController.java @@ -0,0 +1,85 @@ +package com.example.demo.users.api; + +import java.time.LocalDateTime; + +import org.modelmapper.ModelMapper; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import com.example.demo.core.configuration.Constants; +import com.example.demo.core.security.UserPrincipal; +import com.example.demo.messages.api.MessageDto; +import com.example.demo.messages.model.MessageEntity; +import com.example.demo.messages.service.MessageService; + +import jakarta.validation.Valid; + +// Контроллер для работы с корзиной покупок пользователя +@Controller +@RequestMapping(UserMessageController.URL) +public class UserMessageController { + // URL для доступа к методам контроллера + public static final String URL = "/message"; + + // Представление для написания сообщения + private static final String MESSAGE_EDIT_VIEW = "message-edit"; + + // Атрибут модели для обработки данных + private static final String MESSAGE_ATTRIBUTE = "message"; + + // Атрибут модели для пагинации + private static final String PAGE_ATTRIBUTE = "page"; + + // Бизнес-логика для сущости "Сообщение" + private final MessageService messageService; + + // Библиотека для преобразования сущности + private final ModelMapper modelMapper; + + public UserMessageController(MessageService messageService, ModelMapper modelMapper) { + this.messageService = messageService; + this.modelMapper = modelMapper; + } + + private MessageEntity toEntity(MessageDto dto) { + return modelMapper.map(dto, MessageEntity.class); + } + + // Отправить сообщение + @GetMapping("/send/") + public String sendMessage( + @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, + Model model) { + model.addAttribute(MESSAGE_ATTRIBUTE, new MessageDto()); + model.addAttribute(PAGE_ATTRIBUTE, page); + return MESSAGE_EDIT_VIEW; + } + + // Отправить сообщение + @PostMapping("/send/") + public String sendMessage( + @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, + @ModelAttribute(name = MESSAGE_ATTRIBUTE) @Valid MessageDto message, + BindingResult bindingResult, + Model model, + @AuthenticationPrincipal UserPrincipal principal, + RedirectAttributes redirectAttributes) { + if (bindingResult.hasErrors()) { + model.addAttribute(PAGE_ATTRIBUTE, page); + return MESSAGE_EDIT_VIEW; + } + + redirectAttributes.addAttribute(PAGE_ATTRIBUTE, page); + message.setDate(LocalDateTime.now()); + messageService.create(principal.getId(), toEntity(message)); + return Constants.REDIRECT_VIEW + "/"; + } +} diff --git a/demo/src/main/java/com/example/demo/users/api/UserProfileController.java b/demo/src/main/java/com/example/demo/users/api/UserProfileController.java index 619ce96..c7c38cd 100644 --- a/demo/src/main/java/com/example/demo/users/api/UserProfileController.java +++ b/demo/src/main/java/com/example/demo/users/api/UserProfileController.java @@ -87,6 +87,7 @@ public class UserProfileController { model.addAttribute(TYPEID_ATTRIBUTE, typeId); model.addAllAttributes(PageAttributesMapper.toAttributes( + "order", orderService.getAll(userId, typeId, page, Constants.DEFAULT_PAGE_SIZE), this::toDto)); @@ -101,6 +102,7 @@ public class UserProfileController { .toList()); model.addAllAttributes(PageAttributesMapper.toAttributes( + "message", messageService.getAll(userId, page, Constants.DEFAULT_PAGE_SIZE), this::toMessageDto)); return PROFILE_VIEW; diff --git a/demo/src/main/java/com/example/demo/users/service/UserService.java b/demo/src/main/java/com/example/demo/users/service/UserService.java index 8673bbe..ae3a8e4 100644 --- a/demo/src/main/java/com/example/demo/users/service/UserService.java +++ b/demo/src/main/java/com/example/demo/users/service/UserService.java @@ -107,7 +107,6 @@ public class UserService implements UserDetailsService { public UserEntity update(Long id, UserEntity entity) { final UserEntity existsEntity = get(id); existsEntity.setUsername(entity.getUsername()); - existsEntity.setPassword(entity.getPassword()); existsEntity.setEmail(entity.getEmail()); return repository.save(existsEntity); } diff --git a/demo/src/main/resources/templates/default.html b/demo/src/main/resources/templates/default.html index d18053a..359c0bf 100644 --- a/demo/src/main/resources/templates/default.html +++ b/demo/src/main/resources/templates/default.html @@ -40,7 +40,7 @@ - Список сообщений + Сообщения Консоль H2 diff --git a/demo/src/main/resources/templates/message-edit.html b/demo/src/main/resources/templates/message-edit.html new file mode 100644 index 0000000..e607b70 --- /dev/null +++ b/demo/src/main/resources/templates/message-edit.html @@ -0,0 +1,24 @@ + + + + + Отправить сообщение + + + +
+
+
+ + +
+
+
+ + Отмена +
+
+
+ + + \ No newline at end of file diff --git a/demo/src/main/resources/templates/messages.html b/demo/src/main/resources/templates/messages.html index ec1da15..c166b49 100644 --- a/demo/src/main/resources/templates/messages.html +++ b/demo/src/main/resources/templates/messages.html @@ -1,17 +1,17 @@ - + + + + Сообщения + - - +
+

Данные отсутствуют

-
-
- -
-
- +

Сообщения

+
@@ -19,28 +19,44 @@ + + + - + + + +
Отправитель Сообщение Дата отправкиОпубликовано
+ + +
+ + +
+
+
+ + +
+
- + url=${'admin/message'}, + totalPages=${messageTotalPages}, + currentPage=${messageCurrentPage}) }" /> -
- +
\ No newline at end of file diff --git a/demo/src/main/resources/templates/profile.html b/demo/src/main/resources/templates/profile.html index ebcb0b2..fc48b21 100644 --- a/demo/src/main/resources/templates/profile.html +++ b/demo/src/main/resources/templates/profile.html @@ -22,9 +22,9 @@
+ items=${orderItems}, + totalPages=${orderTotalPages}, + currentPage=${orderCurrentPage}) }" />
    @@ -36,10 +36,10 @@
- +
diff --git a/demo/src/main/resources/templates/type-edit.html b/demo/src/main/resources/templates/type-edit.html index 91f03ca..d069c04 100644 --- a/demo/src/main/resources/templates/type-edit.html +++ b/demo/src/main/resources/templates/type-edit.html @@ -2,7 +2,7 @@ - Редакторовать тип заказа + Редактировать тип заказа diff --git a/demo/src/main/resources/templates/user-edit.html b/demo/src/main/resources/templates/user-edit.html index a967148..8cb5a73 100644 --- a/demo/src/main/resources/templates/user-edit.html +++ b/demo/src/main/resources/templates/user-edit.html @@ -2,7 +2,7 @@ - Редакторовать пользователя + Редактировать пользователя @@ -14,12 +14,12 @@
- - -
+ + +
- +
diff --git a/demo/src/main/resources/templates/user-messages.html b/demo/src/main/resources/templates/user-messages.html new file mode 100644 index 0000000..5c3c570 --- /dev/null +++ b/demo/src/main/resources/templates/user-messages.html @@ -0,0 +1,45 @@ + + + + + + +

Данные отсутствуют

+ + + + + + + + + + + + + + + + + + + + + +
IDОтправительСообщениеДата отправкиОпубликовано
+ +
+
+ + + +
+ + + + \ No newline at end of file diff --git a/demo/src/main/resources/templates/user.html b/demo/src/main/resources/templates/user.html index d183859..f283313 100644 --- a/demo/src/main/resources/templates/user.html +++ b/demo/src/main/resources/templates/user.html @@ -7,7 +7,7 @@
- +

Данные отсутствуют

Пользователи

@@ -26,7 +26,7 @@ - + @@ -49,8 +49,8 @@
+ totalPages=${userTotalPages}, + currentPage=${userCurrentPage}) }" />