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.model.ItemEntity;
import com.example.demo.items.service.ItemService; 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.model.TypeEntity;
import com.example.demo.types.service.TypeService; import com.example.demo.types.service.TypeService;
import com.example.demo.users.model.UserEntity;
import com.example.demo.users.service.UserService;
@SpringBootApplication @SpringBootApplication
public class DemoApplication implements CommandLineRunner { public class DemoApplication implements CommandLineRunner {
@ -24,10 +28,18 @@ public class DemoApplication implements CommandLineRunner {
// Бизнес-логика для сущности "Заказ" (Заказ, содержащий книги) // Бизнес-логика для сущности "Заказ" (Заказ, содержащий книги)
private final ItemService itemService; 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.typeService = typeService;
this.itemService = itemService; 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, type2, 15.00, 6));
itemService.create(new ItemEntity(null, type3, 80.00, 6)); itemService.create(new ItemEntity(null, type3, 80.00, 6));
itemService.create(new ItemEntity(null, type3, 64.00, 3)); 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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; 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.bind.annotation.RestController;
import com.example.demo.core.configuration.Constants; import com.example.demo.core.configuration.Constants;
import com.example.demo.messages.model.MessageEntity; import com.example.demo.messages.model.MessageEntity;
import com.example.demo.messages.service.MessageService; import com.example.demo.messages.service.MessageService;
import com.example.demo.users.service.UserService;
import jakarta.validation.Valid; import jakarta.validation.Valid;
@ -25,12 +27,16 @@ public class MessageController {
// Бизнес-логика для сущности "Сообщение" // Бизнес-логика для сущности "Сообщение"
private final MessageService messageService; private final MessageService messageService;
// Бизнес-логика для сущности "Пользователь"
private final UserService userService;
// Библиотека для преобразования сущности // Библиотека для преобразования сущности
private final ModelMapper modelMapper; private final ModelMapper modelMapper;
// Конструктор // Конструктор
public MessageController(MessageService messageService, ModelMapper modelMapper) { public MessageController(MessageService messageService, UserService userService, ModelMapper modelMapper) {
this.messageService = messageService; this.messageService = messageService;
this.userService = userService;
this.modelMapper = modelMapper; this.modelMapper = modelMapper;
} }
@ -41,13 +47,15 @@ public class MessageController {
// Преобразовать из DTO в сущность // Преобразовать из DTO в сущность
private MessageEntity toEntity(@Valid MessageDto 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 @GetMapping
public List<MessageDto> getAll() { public List<MessageDto> getAll(@RequestParam(name = "senderId", defaultValue = "0") Long senderId) {
return messageService.getAll().stream().map(this::toDto).toList(); 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 com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
// DTO для сущности "Сообщение" // DTO для сущности "Сообщение"
@ -13,24 +14,17 @@ public class MessageDto {
@JsonProperty(access = JsonProperty.Access.READ_ONLY) @JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long id; private Long id;
// Имя отправителя // Идентификатор отправителя сообщения
@NotNull @NotNull
@Min(1) @Min(1)
private String name; private Long senderId;
// Электронный адрес почты отправителя
@NotNull
@Min(1)
private String email;
// Текст сообщения // Текст сообщения
@NotNull @NotBlank
@Min(1)
private String text; private String text;
// Дата отправки // Дата отправки
@NotNull @NotBlank
@Min(1)
private Date date; private Date date;
// Получить идентификатор // Получить идентификатор
@ -43,24 +37,14 @@ public class MessageDto {
this.id = id; this.id = id;
} }
// Получить имя отправителя // Получить идентификатор отправителя сообщения
public String getName() { public Long getSenderId() {
return name; return senderId;
} }
// Установить имя отправителя // Установить идентификатор отправителя сообщения
public void setName(String name) { public void setSenderId(Long senderId) {
this.name = name; this.senderId = senderId;
}
// Получить электронный адрес почты отправителя
public String getEmail() {
return email;
}
// Установить электронный адрес почты отправителя
public void setEmail(String email) {
this.email = email;
} }
// Получить текст сообщения // Получить текст сообщения

View File

@ -4,14 +4,12 @@ import java.util.Date;
import java.util.Objects; import java.util.Objects;
import com.example.demo.core.model.BaseEntity; import com.example.demo.core.model.BaseEntity;
import com.example.demo.users.model.UserEntity;
// Сущность "Сообщение" // Сущность "Сообщение"
public class MessageEntity extends BaseEntity { public class MessageEntity extends BaseEntity {
// Имя отправителя // Отправитель сообщения
private String name; private UserEntity sender;
// Электронный адрес почты отправителя
private String email;
// Текст сообщения // Текст сообщения
private String text; 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); super(id);
this.name = name; this.sender = sender;
this.email = email;
this.text = text; this.text = text;
this.date = new Date(); this.date = new Date();
} }
// Получить имя отправителя // Получить отправителя
public String getName() { public UserEntity getSender() {
return name; return sender;
} }
// Установить имя отправителя // Установить отправителя
public void setName(String name) { public void setSender(UserEntity sender) {
this.name = name; this.sender = sender;
}
// Получить электронный адрес почты отправителя
public String getEmail() {
return email;
}
// Установить электронный адрес почты отправителя
public void setEmail(String email) {
this.email = email;
} }
// Получить текст сообщения // Получить текст сообщения
@ -76,7 +63,7 @@ public class MessageEntity extends BaseEntity {
// Получить хэш-код объекта // Получить хэш-код объекта
@Override @Override
public int hashCode() { 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; return false;
final MessageEntity other = (MessageEntity) obj; final MessageEntity other = (MessageEntity) obj;
return Objects.equals(other.getId(), id) return Objects.equals(other.getId(), id)
&& Objects.equals(other.getName(), name) && Objects.equals(other.getSender(), sender)
&& Objects.equals(other.getEmail(), email)
&& Objects.equals(other.getText(), text) && Objects.equals(other.getText(), text)
&& Objects.equals(other.getDate(), date); && Objects.equals(other.getDate(), date);
} }

View File

@ -1,6 +1,7 @@
package com.example.demo.messages.service; package com.example.demo.messages.service;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -20,10 +21,15 @@ public class MessageService {
this.repository = repository; this.repository = repository;
} }
// Получить все элементы // Получить все элементы или по заданному фильтру
public List<MessageEntity> getAll() { public List<MessageEntity> getAll(Long senderId) {
if (Objects.equals(senderId, 0L)) {
return repository.getAll(); return repository.getAll();
} }
return repository.getAll().stream()
.filter(item -> item.getSender().getId().equals(senderId))
.toList();
}
// Получить элемент по идентификатору // Получить элемент по идентификатору
public MessageEntity get(Long id) { public MessageEntity get(Long id) {
@ -39,8 +45,7 @@ public class MessageService {
// Изменить элемент // Изменить элемент
public MessageEntity update(Long id, MessageEntity entity) { public MessageEntity update(Long id, MessageEntity entity) {
final MessageEntity existsEntity = get(id); final MessageEntity existsEntity = get(id);
existsEntity.setName(entity.getName()); existsEntity.setSender(entity.getSender());
existsEntity.setEmail(entity.getEmail());
existsEntity.setText(entity.getText()); existsEntity.setText(entity.getText());
return repository.update(existsEntity); 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.core.error.NotFoundException;
import com.example.demo.messages.model.MessageEntity; import com.example.demo.messages.model.MessageEntity;
import com.example.demo.messages.service.MessageService; import com.example.demo.messages.service.MessageService;
import com.example.demo.users.model.UserEntity;
import com.example.demo.users.service.UserService;
@SpringBootTest @SpringBootTest
@TestMethodOrder(OrderAnnotation.class) @TestMethodOrder(OrderAnnotation.class)
@ -18,6 +20,9 @@ public class MessageServiceTests {
@Autowired @Autowired
private MessageService messageService; private MessageService messageService;
@Autowired
private UserService userService;
@Test @Test
void getTest() { void getTest() {
Assertions.assertThrows(NotFoundException.class, () -> messageService.get(0L)); Assertions.assertThrows(NotFoundException.class, () -> messageService.get(0L));
@ -26,40 +31,39 @@ public class MessageServiceTests {
@Test @Test
@Order(1) @Order(1)
void createTest() { void createTest() {
messageService.create(new MessageEntity(null, "Владимир", "vladimir@mail.ru", "Текст")); final UserEntity sender = userService.create(new UserEntity(null, "User1", "password1", "mail1@gmail.com"));
messageService.create(new MessageEntity(null, "Путин", "putin@mail.ru", "Молодец")); messageService.create(new MessageEntity(null, sender, "Message1"));
final MessageEntity last = messageService.create(new MessageEntity(null, "Политик", "lider@mail.ru", "Борец")); 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)); Assertions.assertEquals(last, messageService.get(3L));
} }
@Test @Test
@Order(2) @Order(2)
void updateTest() { void updateTest() {
final String test = "TEST"; final UserEntity sender = userService.create(new UserEntity(null, "TESTuser", "password", "mail@gmail.com"));
final String email = "masenkin73@gmail.com";
final String text = "aboba";
final MessageEntity entity = messageService.get(3L); final MessageEntity entity = messageService.get(3L);
final String oldName = entity.getName(); final String oldText = entity.getText();
final MessageEntity newEntity = messageService.update(3L, new MessageEntity(1L, test, email, text)); 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(newEntity, messageService.get(3L));
Assertions.assertEquals(test, newEntity.getName()); Assertions.assertEquals("textMessage", newEntity.getText());
Assertions.assertNotEquals(oldName, newEntity.getName()); Assertions.assertNotEquals(oldText, newEntity.getText());
} }
@Test @Test
@Order(3) @Order(3)
void deleteTest() { void deleteTest() {
messageService.delete(3L); messageService.delete(3L);
Assertions.assertEquals(2, messageService.getAll().size()); Assertions.assertEquals(2, messageService.getAll(0L).size());
final MessageEntity last = messageService.get(2L); Assertions.assertThrows(NotFoundException.class, () -> messageService.get(3L));
Assertions.assertEquals(2L, last.getId());
final MessageEntity newEntity = messageService.create(new MessageEntity(null, "name", "address@email.com", "text")); final UserEntity sender = userService.create(new UserEntity(null, "User1", "password1", "mail1@gmail.com"));
Assertions.assertEquals(3, messageService.getAll().size()); final MessageEntity newEntity = messageService.create(new MessageEntity(null, sender, "Message"));
Assertions.assertEquals(3, messageService.getAll(0L).size());
Assertions.assertEquals(4L, newEntity.getId()); 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());
}
}