From 3587ec2acf4b341e7505b1a7aaaaad9963c5655f Mon Sep 17 00:00:00 2001 From: Factorino73 Date: Tue, 21 May 2024 03:36:56 +0400 Subject: [PATCH] LabWork04-05 / Add additions --- demo/data.mv.db | Bin 61440 -> 73728 bytes .../com/example/demo/DemoApplication.java | 8 ++++---- .../demo/messages/api/MessageController.java | 19 +++++++++++++++++- .../repository/MessageRepository.java | 11 +++++++++- .../demo/messages/service/MessageService.java | 12 ++++++++--- .../src/main/resources/templates/default.html | 8 ++++++-- .../main/resources/templates/messages.html | 12 +++++------ 7 files changed, 53 insertions(+), 17 deletions(-) diff --git a/demo/data.mv.db b/demo/data.mv.db index eb3861e47975edbfd47b91bd9119553614d8a205..8ad8b613ca5f1c5ff00eec80b337ab95497a4dcd 100644 GIT binary patch literal 73728 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 E|HUxtEdT%j literal 61440 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 Iz!As(A4nrdivR!s diff --git a/demo/src/main/java/com/example/demo/DemoApplication.java b/demo/src/main/java/com/example/demo/DemoApplication.java index 9bd34ec..a8d11dc 100644 --- a/demo/src/main/java/com/example/demo/DemoApplication.java +++ b/demo/src/main/java/com/example/demo/DemoApplication.java @@ -84,21 +84,21 @@ public class DemoApplication implements CommandLineRunner { log.info("Create default messages values"); final var messages1 = List.of( - new MessageEntity("Message1", LocalDateTime.now(), false), + new MessageEntity("Message1", LocalDateTime.now(), true), new MessageEntity("Message2", LocalDateTime.now(), false), - new MessageEntity("Message3", LocalDateTime.now(), false) + new MessageEntity("Message3", LocalDateTime.now(), true) ); messages1.forEach(message -> messageService.create(user1.getId(), message)); final var messages2 = List.of( new MessageEntity("Message4", LocalDateTime.now(), false), - new MessageEntity("Message5", LocalDateTime.now(), false) + new MessageEntity("Message5", LocalDateTime.now(), true) ); messages2.forEach(message -> messageService.create(user2.getId(), message)); final var messages3 = List.of( new MessageEntity("Message6", LocalDateTime.now(), false), - new MessageEntity("Message7", LocalDateTime.now(), false) + new MessageEntity("Message7", LocalDateTime.now(), true) ); messages3.forEach(message -> messageService.create(user3.getId(), message)); } 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 index 57d3396..a63394a 100644 --- a/demo/src/main/java/com/example/demo/messages/api/MessageController.java +++ b/demo/src/main/java/com/example/demo/messages/api/MessageController.java @@ -3,6 +3,7 @@ package com.example.demo.messages.api; import java.util.Map; import org.modelmapper.ModelMapper; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -22,7 +23,7 @@ import com.example.demo.messages.service.MessageService; @RequestMapping(MessageController.URL) public class MessageController { // URL для доступа к методам контроллера - public static final String URL = Constants.ADMIN_PREFIX + "/message"; + public static final String URL = "/message"; // Представление для отображения списка сообщений private static final String MESSAGE_VIEW = "messages"; @@ -48,6 +49,7 @@ public class MessageController { } // Получить все элементы + @PreAuthorize("hasRole('ADMIN')") @GetMapping public String getAll( @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, @@ -60,7 +62,21 @@ public class MessageController { return MESSAGE_VIEW; } + // Получить опубликованные сообщения с пагинацией + @GetMapping("/published") + public String getPublishedMessages( + @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, + Model model) { + final Map attributes = PageAttributesMapper.toAttributes( + "message", + messageService.getPublishedMessages(page, Constants.DEFAULT_PAGE_SIZE), this::toDto); + model.addAllAttributes(attributes); + model.addAttribute(PAGE_ATTRIBUTE, page); + return MESSAGE_VIEW; + } + // Удалить элемент + @PreAuthorize("hasRole('ADMIN')") @PostMapping("/delete/{id}") public String delete( @PathVariable(name = "id") Long id, @@ -73,6 +89,7 @@ public class MessageController { } // Опубликовать сообщение + @PreAuthorize("hasRole('ADMIN')") @PostMapping("/publish/{id}") public String publish( @PathVariable(name = "id") Long id, diff --git a/demo/src/main/java/com/example/demo/messages/repository/MessageRepository.java b/demo/src/main/java/com/example/demo/messages/repository/MessageRepository.java index 1c8789a..d5512a3 100644 --- a/demo/src/main/java/com/example/demo/messages/repository/MessageRepository.java +++ b/demo/src/main/java/com/example/demo/messages/repository/MessageRepository.java @@ -5,15 +5,21 @@ import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; import com.example.demo.messages.model.MessageEntity; // Хранилище для сущности "Сообщение" public interface MessageRepository extends CrudRepository, PagingAndSortingRepository { // Получить сообщение по пользователю и идентификатору - Optional findOnyByUserIdAndId(Long userId, Long id); + Optional findOneByUserIdAndId(Long userId, Long id); + + // Получить сообщение по идентификатору с предварительной загрузкой связанных сущностей + @Query("SELECT m FROM MessageEntity m JOIN FETCH m.user u LEFT JOIN FETCH u.messages WHERE m.id = :id") + Optional findByIdWithUser(@Param("id") Long id); // Получить список всех сообщений (с пагинацией) Page findAll(Pageable pageable); @@ -23,4 +29,7 @@ public interface MessageRepository extends CrudRepository, // Получить список сообщений по пользователю (с пагинацией) Page findByUserId(Long userId, Pageable pageable); + + // Получить все опубликованные сообщения (с пагинацией) + Page findByIsPublishedTrue(Pageable pageable); } 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 07ae0c8..3639f49 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 @@ -55,20 +55,26 @@ public class MessageService { } } + // Получить страницу опубликованных сообщений + @Transactional(readOnly = true) + public Page getPublishedMessages(int page, int size) { + final PageRequest pageRequest = PageRequest.of(page, size); + return repository.findByIsPublishedTrue(pageRequest); + } + // Получить элемент по идентификатору @Transactional(readOnly = true) public MessageEntity get(Long userId, Long id) { userService.get(userId); - return repository.findOnyByUserIdAndId(userId, id) + return repository.findOneByUserIdAndId(userId, id) .orElseThrow(() -> new NotFoundException(MessageEntity.class, id)); } // Получить элемент по идентификатору @Transactional(readOnly = true) public MessageEntity get(Long id) { - MessageEntity message = repository.findById(id) + MessageEntity message = repository.findByIdWithUser(id) .orElseThrow(() -> new NotFoundException(MessageEntity.class, id)); - Hibernate.initialize(message.getUser().getMessages()); return message; } diff --git a/demo/src/main/resources/templates/default.html b/demo/src/main/resources/templates/default.html index 25d38eb..cdc2f45 100644 --- a/demo/src/main/resources/templates/default.html +++ b/demo/src/main/resources/templates/default.html @@ -42,12 +42,16 @@ th:classappend="${activeLink.startsWith('/admin/type') ? 'active' : ''}"> Types - + Messages Console H2 + + Published messages +