LabWork02 Add UserEntity

This commit is contained in:
parent 6f0a431bd9
commit 6137e97499
12 changed files with 443 additions and 81 deletions

View File

@ -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"));
}
}
}

View File

@ -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<MessageDto> getAll() {
return messageService.getAll().stream().map(this::toDto).toList();
public List<MessageDto> getAll(@RequestParam(name = "senderId", defaultValue = "0") Long senderId) {
return messageService.getAll(senderId).stream().map(this::toDto).toList();
}
// Получить элемент по идентификатору

View File

@ -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;
}
// Получить текст сообщения

View File

@ -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);
}

View File

@ -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<MessageEntity> getAll() {
return repository.getAll();
// Получить все элементы или по заданному фильтру
public List<MessageEntity> 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);
}

View File

@ -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<UserDto> 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));
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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<UserEntity> {
}

View File

@ -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<UserEntity> 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);
}
}

View File

@ -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());
}
}

View File

@ -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());
}
}