diff --git a/demo/src/main/java/com/example/demo/DemoApplication.java b/demo/src/main/java/com/example/demo/DemoApplication.java index d04e803..fd27f3c 100644 --- a/demo/src/main/java/com/example/demo/DemoApplication.java +++ b/demo/src/main/java/com/example/demo/DemoApplication.java @@ -10,8 +10,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import com.example.demo.items.model.ItemEntity; import com.example.demo.items.service.ItemService; +import com.example.demo.messages.model.MessageEntity; +import com.example.demo.messages.service.MessageService; import com.example.demo.types.model.TypeEntity; import com.example.demo.types.service.TypeService; +import com.example.demo.users.model.UserEntity; +import com.example.demo.users.service.UserService; @SpringBootApplication public class DemoApplication implements CommandLineRunner { @@ -24,10 +28,18 @@ public class DemoApplication implements CommandLineRunner { // Бизнес-логика для сущности "Заказ" (Заказ, содержащий книги) private final ItemService itemService; + // Бизнес-логика для сущности "Пользователь" + private final UserService userService; + + // Бизнес-логика для сущности "Сообщение" + private final MessageService messageService; + // Конструктор - public DemoApplication(TypeService typeService, ItemService itemService) { + public DemoApplication(TypeService typeService, ItemService itemService, UserService userService, MessageService messageService) { this.typeService = typeService; this.itemService = itemService; + this.userService = userService; + this.messageService = messageService; } // Входная точка программы @@ -51,6 +63,20 @@ public class DemoApplication implements CommandLineRunner { itemService.create(new ItemEntity(null, type2, 15.00, 6)); itemService.create(new ItemEntity(null, type3, 80.00, 6)); itemService.create(new ItemEntity(null, type3, 64.00, 3)); + + log.info("Create default users values"); + final var user1 = userService.create(new UserEntity(null, "User1", "password1", "mail1@gmail.com")); + final var user2 = userService.create(new UserEntity(null, "User2", "password2", "mail2@gmail.com")); + final var user3 = userService.create(new UserEntity(null, "User3", "password3", "mail3@gmail.com")); + + log.info("Create default messages values"); + messageService.create(new MessageEntity(null, user1, "Message1")); + messageService.create(new MessageEntity(null, user1, "Message2")); + messageService.create(new MessageEntity(null, user2, "Message3")); + messageService.create(new MessageEntity(null, user2, "Message4")); + messageService.create(new MessageEntity(null, user2, "Message5")); + messageService.create(new MessageEntity(null, user3, "Message6")); + messageService.create(new MessageEntity(null, user3, "Message7")); } } } 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 ff981c7..3fb75c9 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 @@ -10,11 +10,13 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.example.demo.core.configuration.Constants; import com.example.demo.messages.model.MessageEntity; import com.example.demo.messages.service.MessageService; +import com.example.demo.users.service.UserService; import jakarta.validation.Valid; @@ -25,12 +27,16 @@ public class MessageController { // Бизнес-логика для сущности "Сообщение" private final MessageService messageService; + // Бизнес-логика для сущности "Пользователь" + private final UserService userService; + // Библиотека для преобразования сущности private final ModelMapper modelMapper; // Конструктор - public MessageController(MessageService messageService, ModelMapper modelMapper) { + public MessageController(MessageService messageService, UserService userService, ModelMapper modelMapper) { this.messageService = messageService; + this.userService = userService; this.modelMapper = modelMapper; } @@ -41,13 +47,15 @@ public class MessageController { // Преобразовать из DTO в сущность private MessageEntity toEntity(@Valid MessageDto dto) { - return modelMapper.map(dto, MessageEntity.class); + final MessageEntity entity = modelMapper.map(dto, MessageEntity.class); + entity.setSender(userService.get(dto.getSenderId())); + return entity; } // Получить все элементы @GetMapping - public List getAll() { - return messageService.getAll().stream().map(this::toDto).toList(); + public List getAll(@RequestParam(name = "senderId", defaultValue = "0") Long senderId) { + return messageService.getAll(senderId).stream().map(this::toDto).toList(); } // Получить элемент по идентификатору 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 4c1451c..a7decc0 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 @@ -5,6 +5,7 @@ import java.util.Date; import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; // DTO для сущности "Сообщение" @@ -13,24 +14,17 @@ public class MessageDto { @JsonProperty(access = JsonProperty.Access.READ_ONLY) private Long id; - // Имя отправителя + // Идентификатор отправителя сообщения @NotNull @Min(1) - private String name; - - // Электронный адрес почты отправителя - @NotNull - @Min(1) - private String email; + private Long senderId; // Текст сообщения - @NotNull - @Min(1) + @NotBlank private String text; // Дата отправки - @NotNull - @Min(1) + @NotBlank private Date date; // Получить идентификатор @@ -43,24 +37,14 @@ public class MessageDto { this.id = id; } - // Получить имя отправителя - public String getName() { - return name; + // Получить идентификатор отправителя сообщения + public Long getSenderId() { + return senderId; } - // Установить имя отправителя - public void setName(String name) { - this.name = name; - } - - // Получить электронный адрес почты отправителя - public String getEmail() { - return email; - } - - // Установить электронный адрес почты отправителя - public void setEmail(String email) { - this.email = email; + // Установить идентификатор отправителя сообщения + public void setSenderId(Long senderId) { + this.senderId = senderId; } // Получить текст сообщения diff --git a/demo/src/main/java/com/example/demo/messages/model/MessageEntity.java b/demo/src/main/java/com/example/demo/messages/model/MessageEntity.java index 0738dec..6eee9ae 100644 --- a/demo/src/main/java/com/example/demo/messages/model/MessageEntity.java +++ b/demo/src/main/java/com/example/demo/messages/model/MessageEntity.java @@ -4,14 +4,12 @@ import java.util.Date; import java.util.Objects; import com.example.demo.core.model.BaseEntity; +import com.example.demo.users.model.UserEntity; // Сущность "Сообщение" public class MessageEntity extends BaseEntity { - // Имя отправителя - private String name; - - // Электронный адрес почты отправителя - private String email; + // Отправитель сообщения + private UserEntity sender; // Текст сообщения private String text; @@ -25,32 +23,21 @@ public class MessageEntity extends BaseEntity { } // Конструктор с параметрами для создания объекта - public MessageEntity(Long id, String name, String email, String text) { + public MessageEntity(Long id, UserEntity sender, String text) { super(id); - this.name = name; - this.email = email; + this.sender = sender; this.text = text; this.date = new Date(); } - // Получить имя отправителя - public String getName() { - return name; + // Получить отправителя + public UserEntity getSender() { + return sender; } - // Установить имя отправителя - public void setName(String name) { - this.name = name; - } - - // Получить электронный адрес почты отправителя - public String getEmail() { - return email; - } - - // Установить электронный адрес почты отправителя - public void setEmail(String email) { - this.email = email; + // Установить отправителя + public void setSender(UserEntity sender) { + this.sender = sender; } // Получить текст сообщения @@ -76,7 +63,7 @@ public class MessageEntity extends BaseEntity { // Получить хэш-код объекта @Override public int hashCode() { - return Objects.hash(id, name, email, text, date); + return Objects.hash(id, sender, text, date); } // Сравнить объекты @@ -88,8 +75,7 @@ public class MessageEntity extends BaseEntity { return false; final MessageEntity other = (MessageEntity) obj; return Objects.equals(other.getId(), id) - && Objects.equals(other.getName(), name) - && Objects.equals(other.getEmail(), email) + && Objects.equals(other.getSender(), sender) && Objects.equals(other.getText(), text) && Objects.equals(other.getDate(), date); } 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 b8be1ef..cb63e9d 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 @@ -1,6 +1,7 @@ package com.example.demo.messages.service; import java.util.List; +import java.util.Objects; import java.util.Optional; import org.springframework.stereotype.Service; @@ -20,9 +21,14 @@ public class MessageService { this.repository = repository; } - // Получить все элементы - public List getAll() { - return repository.getAll(); + // Получить все элементы или по заданному фильтру + public List getAll(Long senderId) { + if (Objects.equals(senderId, 0L)) { + return repository.getAll(); + } + return repository.getAll().stream() + .filter(item -> item.getSender().getId().equals(senderId)) + .toList(); } // Получить элемент по идентификатору @@ -39,8 +45,7 @@ public class MessageService { // Изменить элемент public MessageEntity update(Long id, MessageEntity entity) { final MessageEntity existsEntity = get(id); - existsEntity.setName(entity.getName()); - existsEntity.setEmail(entity.getEmail()); + existsEntity.setSender(entity.getSender()); existsEntity.setText(entity.getText()); return repository.update(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 new file mode 100644 index 0000000..7a9600d --- /dev/null +++ b/demo/src/main/java/com/example/demo/users/api/UserController.java @@ -0,0 +1,76 @@ +package com.example.demo.users.api; + +import java.util.List; + +import org.modelmapper.ModelMapper; +import org.springframework.web.bind.annotation.DeleteMapping; +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.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.demo.core.configuration.Constants; +import com.example.demo.users.model.UserEntity; +import com.example.demo.users.service.UserService; + +import jakarta.validation.Valid; + +// Контроллер для сущности "Пользователь" +@RestController +@RequestMapping(Constants.API_URL + "/user") +public class UserController { + // Бизнес-логика для сущности "Пользователь" + private final UserService userService; + + // Библиотека для преобразования сущности + private final ModelMapper modelMapper; + + // Конструктор + public UserController(UserService userService, ModelMapper modelMapper) { + this.userService = userService; + this.modelMapper = modelMapper; + } + + // Преобразовать из сущности в DTO + private UserDto toDto(UserEntity entity) { + return modelMapper.map(entity, UserDto.class); + } + + // Преобразовать из DTO в сущность + private UserEntity toEntity(@Valid UserDto dto) { + return modelMapper.map(dto, UserEntity.class); + } + + // Получить все элементы + @GetMapping + public List getAll() { + return userService.getAll().stream().map(this::toDto).toList(); + } + + // Получить элемент по идентификатору + @GetMapping("/{id}") + public UserDto get(@PathVariable(name = "id") Long id) { + return toDto(userService.get(id)); + } + + // Создать элемент + @PostMapping + public UserDto create(@RequestBody @Valid UserDto dto) { + return toDto(userService.create(toEntity(dto))); + } + + // Изменить элемент + @PutMapping("/{id}") + public UserDto update(@PathVariable(name = "id") Long id, @RequestBody @Valid UserDto dto) { + return toDto(userService.update(id, toEntity(dto))); + } + + // Удалить элемент + @DeleteMapping("/{id}") + public UserDto delete(@PathVariable(name = "id") Long id) { + return toDto(userService.delete(id)); + } +} diff --git a/demo/src/main/java/com/example/demo/users/api/UserDto.java b/demo/src/main/java/com/example/demo/users/api/UserDto.java new file mode 100644 index 0000000..db60ffc --- /dev/null +++ b/demo/src/main/java/com/example/demo/users/api/UserDto.java @@ -0,0 +1,64 @@ +package com.example.demo.users.api; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jakarta.validation.constraints.NotBlank; + +// DTO для сущности "Пользователь" +public class UserDto { + // Идентфикатор + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Long id; + + // Имя/логин пользователя + @NotBlank + private String username; + + // Пароль пользователя + @NotBlank + private String password; + + // Электронный адрес почты пользователя + @NotBlank + private String email; + + // Получить идентификатор + public Long getId() { + return id; + } + + // Установить идентификатор + public void setId(Long id) { + this.id = id; + } + + // Получить имя/логин пользователя + public String getUsername() { + return username; + } + + // Установить имя/логин пользователя + public void setUsername(String username) { + this.username = username; + } + + // Получить пароль пользователя + public String getPassword() { + return password; + } + + // Установить пароль пользователя + public void setPassword(String password) { + this.password = password; + } + + // Получить электронный адрес почты пользователя + public String getEmail() { + return email; + } + + // Установить электронный адрес почты пользователя + public void setEmail(String email) { + this.email = email; + } +} diff --git a/demo/src/main/java/com/example/demo/users/model/UserEntity.java b/demo/src/main/java/com/example/demo/users/model/UserEntity.java new file mode 100644 index 0000000..d32c51a --- /dev/null +++ b/demo/src/main/java/com/example/demo/users/model/UserEntity.java @@ -0,0 +1,80 @@ +package com.example.demo.users.model; + +import java.util.Objects; + +import com.example.demo.core.model.BaseEntity; + +// Сущность "Пользователь" +public class UserEntity extends BaseEntity { + // Имя/логин пользователя + private String username; + + // Пароль пользователя + private String password; + + // Электронный адрес почты пользователя + private String email; + + // Конструктор по умолчанию + public UserEntity() { + super(); + } + + // Конструктор с параметрами для создания объекта + public UserEntity(Long id, String username, String password, String email) { + super(id); + this.username = username; + this.password = password; + this.email = email; + } + + // Получить имя/логин пользователя + public String getUsername() { + return username; + } + + // Установить имя/логин пользователя + public void setUsername(String username) { + this.username = username; + } + + // Получить пароль пользователя + public String getPassword() { + return password; + } + + // Установить пароль пользователя + public void setPassword(String password) { + this.password = password; + } + + // Получить электронный адрес почты пользователя + public String getEmail() { + return email; + } + + // Установить электронный адрес почты пользователя + public void setEmail(String email) { + this.email = email; + } + + // Получить хэш-код объекта + @Override + public int hashCode() { + return Objects.hash(id, username, password, email); + } + + // Сравнить объекты + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + final UserEntity other = (UserEntity) obj; + return Objects.equals(other.getId(), id) + && Objects.equals(other.getUsername(), username) + && Objects.equals(other.getPassword(), password) + && Objects.equals(other.getEmail(), email); + } +} diff --git a/demo/src/main/java/com/example/demo/users/repository/UserRepository.java b/demo/src/main/java/com/example/demo/users/repository/UserRepository.java new file mode 100644 index 0000000..fcff015 --- /dev/null +++ b/demo/src/main/java/com/example/demo/users/repository/UserRepository.java @@ -0,0 +1,11 @@ +package com.example.demo.users.repository; + +import org.springframework.stereotype.Repository; + +import com.example.demo.core.repository.MapRepository; +import com.example.demo.users.model.UserEntity; + +// Хранилище для сущности "Пользователь" +@Repository +public class UserRepository extends MapRepository { +} 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 new file mode 100644 index 0000000..d619c85 --- /dev/null +++ b/demo/src/main/java/com/example/demo/users/service/UserService.java @@ -0,0 +1,53 @@ +package com.example.demo.users.service; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.users.model.UserEntity; +import com.example.demo.users.repository.UserRepository; + +// Бизнес-логика для сущности "Пользователь" +@Service +public class UserService { + // Хранилище элементов + private final UserRepository repository; + + // Конструктор + public UserService(UserRepository repository) { + this.repository = repository; + } + + // Получить все элементы + public List getAll() { + return repository.getAll(); + } + + // Получить элемент по идентификатору + public UserEntity get(Long id) { + return Optional.ofNullable(repository.get(id)) + .orElseThrow(() -> new NotFoundException(id)); + } + + // Создать элемент + public UserEntity create(UserEntity entity) { + return repository.create(entity); + } + + // Изменить элемент + 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.update(existsEntity); + } + + // Удалить элемент + public UserEntity delete(Long id) { + final UserEntity existsEntity = get(id); + return repository.delete(existsEntity); + } +} diff --git a/demo/src/test/java/com/example/demo/MessageServiceTests.java b/demo/src/test/java/com/example/demo/MessageServiceTests.java index edb48db..21e93ba 100644 --- a/demo/src/test/java/com/example/demo/MessageServiceTests.java +++ b/demo/src/test/java/com/example/demo/MessageServiceTests.java @@ -11,6 +11,8 @@ import org.springframework.boot.test.context.SpringBootTest; import com.example.demo.core.error.NotFoundException; import com.example.demo.messages.model.MessageEntity; import com.example.demo.messages.service.MessageService; +import com.example.demo.users.model.UserEntity; +import com.example.demo.users.service.UserService; @SpringBootTest @TestMethodOrder(OrderAnnotation.class) @@ -18,6 +20,9 @@ public class MessageServiceTests { @Autowired private MessageService messageService; + @Autowired + private UserService userService; + @Test void getTest() { Assertions.assertThrows(NotFoundException.class, () -> messageService.get(0L)); @@ -26,40 +31,39 @@ public class MessageServiceTests { @Test @Order(1) void createTest() { - messageService.create(new MessageEntity(null, "Владимир", "vladimir@mail.ru", "Текст")); - messageService.create(new MessageEntity(null, "Путин", "putin@mail.ru", "Молодец")); - final MessageEntity last = messageService.create(new MessageEntity(null, "Политик", "lider@mail.ru", "Борец")); + final UserEntity sender = userService.create(new UserEntity(null, "User1", "password1", "mail1@gmail.com")); + messageService.create(new MessageEntity(null, sender, "Message1")); + messageService.create(new MessageEntity(null, sender, "Message2")); + final MessageEntity last = messageService.create(new MessageEntity(null, sender, "Message3")); - Assertions.assertEquals(3, messageService.getAll().size()); + Assertions.assertEquals(3, messageService.getAll(0l).size()); Assertions.assertEquals(last, messageService.get(3L)); } @Test @Order(2) void updateTest() { - final String test = "TEST"; - final String email = "masenkin73@gmail.com"; - final String text = "aboba"; + final UserEntity sender = userService.create(new UserEntity(null, "TESTuser", "password", "mail@gmail.com")); final MessageEntity entity = messageService.get(3L); - final String oldName = entity.getName(); - final MessageEntity newEntity = messageService.update(3L, new MessageEntity(1L, test, email, text)); + final String oldText = entity.getText(); + final MessageEntity newEntity = messageService.update(3L, new MessageEntity(1L, sender, "textMessage")); - Assertions.assertEquals(3, messageService.getAll().size()); + Assertions.assertEquals(3, messageService.getAll(0L).size()); Assertions.assertEquals(newEntity, messageService.get(3L)); - Assertions.assertEquals(test, newEntity.getName()); - Assertions.assertNotEquals(oldName, newEntity.getName()); + Assertions.assertEquals("textMessage", newEntity.getText()); + Assertions.assertNotEquals(oldText, newEntity.getText()); } @Test @Order(3) void deleteTest() { messageService.delete(3L); - Assertions.assertEquals(2, messageService.getAll().size()); - final MessageEntity last = messageService.get(2L); - Assertions.assertEquals(2L, last.getId()); + Assertions.assertEquals(2, messageService.getAll(0L).size()); + Assertions.assertThrows(NotFoundException.class, () -> messageService.get(3L)); - final MessageEntity newEntity = messageService.create(new MessageEntity(null, "name", "address@email.com", "text")); - Assertions.assertEquals(3, messageService.getAll().size()); + final UserEntity sender = userService.create(new UserEntity(null, "User1", "password1", "mail1@gmail.com")); + final MessageEntity newEntity = messageService.create(new MessageEntity(null, sender, "Message")); + Assertions.assertEquals(3, messageService.getAll(0L).size()); Assertions.assertEquals(4L, newEntity.getId()); } } diff --git a/demo/src/test/java/com/example/demo/UserServiceTests.java b/demo/src/test/java/com/example/demo/UserServiceTests.java new file mode 100644 index 0000000..b2d7cd9 --- /dev/null +++ b/demo/src/test/java/com/example/demo/UserServiceTests.java @@ -0,0 +1,65 @@ +package com.example.demo; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.users.model.UserEntity; +import com.example.demo.users.service.UserService; + +@SpringBootTest +@TestMethodOrder(OrderAnnotation.class) +public class UserServiceTests { + @Autowired + private UserService userService; + + @Test + void getTest() { + Assertions.assertThrows(NotFoundException.class, () -> userService.get(0L)); + } + + @Test + @Order(1) + void createTest() { + userService.create(new UserEntity(null, "User1", "password1", "mail1@gmail.com")); + userService.create(new UserEntity(null, "User2", "password2", "mail2@gmail.com")); + final UserEntity last = userService.create(new UserEntity(null, "User3", "password3", "mail3@gmail.com")); + + Assertions.assertEquals(3, userService.getAll().size()); + Assertions.assertEquals(last, userService.get(3L)); + } + + @Test + @Order(2) + void updateTest() { + final String test = "TEST"; + final String password = "qwerty"; + final String email = "mail@xmail.ru"; + final UserEntity entity = userService.get(3L); + final String oldUsername = entity.getUsername(); + final UserEntity newEntity = userService.update(3L, new UserEntity(1L, test, password, email)); + + Assertions.assertEquals(3, userService.getAll().size()); + Assertions.assertEquals(newEntity, userService.get(3L)); + Assertions.assertEquals(test, newEntity.getUsername()); + Assertions.assertNotEquals(oldUsername, newEntity.getUsername()); + } + + @Test + @Order(3) + void deleteTest() { + userService.delete(3L); + Assertions.assertEquals(2, userService.getAll().size()); + final UserEntity last = userService.get(2L); + Assertions.assertEquals(2L, last.getId()); + + final UserEntity newEntity = userService.create(new UserEntity(null, "User4", "password4", "mail4@gmail.com")); + Assertions.assertEquals(3, userService.getAll().size()); + Assertions.assertEquals(4L, newEntity.getId()); + } +}