diff --git a/src/main/java/com/example/nto/repository/OfficeRepository.java b/src/main/java/com/example/nto/repository/OfficeRepository.java index abf71a7..af6c7e5 100644 --- a/src/main/java/com/example/nto/repository/OfficeRepository.java +++ b/src/main/java/com/example/nto/repository/OfficeRepository.java @@ -3,5 +3,8 @@ package com.example.nto.repository; import com.example.nto.domain.entity.Office; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface OfficeRepository extends JpaRepository { + Optional findByName(String name); } diff --git a/src/main/java/com/example/nto/repository/PositionRepository.java b/src/main/java/com/example/nto/repository/PositionRepository.java index 56ac264..aba1527 100644 --- a/src/main/java/com/example/nto/repository/PositionRepository.java +++ b/src/main/java/com/example/nto/repository/PositionRepository.java @@ -3,5 +3,8 @@ package com.example.nto.repository; import com.example.nto.domain.entity.Position; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface PositionRepository extends JpaRepository { + Optional findByName(String name); } diff --git a/src/main/java/com/example/nto/service/EmployeeService.java b/src/main/java/com/example/nto/service/EmployeeService.java new file mode 100644 index 0000000..59c5558 --- /dev/null +++ b/src/main/java/com/example/nto/service/EmployeeService.java @@ -0,0 +1,24 @@ +package com.example.nto.service; + +import com.example.nto.dto.entity.employee.EmployeeCreateDTO; +import com.example.nto.dto.entity.employee.EmployeeDTO; +import com.example.nto.dto.entity.employee.EmployeeItemDTO; + +import java.util.List; + +public interface EmployeeService { + List getAll(); + List getWorkingEmployee(boolean isWorking); + + EmployeeDTO getById(long employeeId); + EmployeeDTO getByEmail(String email); + EmployeeDTO getByTelephone(String telephone); + + + EmployeeDTO create(EmployeeCreateDTO employeeCreateDTO); + EmployeeDTO update(long employeeId, EmployeeDTO employeeDTO); + void delete(long employeeId); + + void patchProfileImage(long employeeId, String imageUrl); + void patchBlockEmployee(long employeeId, boolean blockStatus); +} diff --git a/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java b/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java new file mode 100644 index 0000000..81d92f4 --- /dev/null +++ b/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java @@ -0,0 +1,156 @@ +package com.example.nto.service.impl; + +import com.example.nto.aspect.annotation.LogExample; +import com.example.nto.domain.entity.*; +import com.example.nto.domain.exception.ConflictResourceException; +import com.example.nto.domain.exception.ResourceNotFoundException; +import com.example.nto.dto.entity.employee.EmployeeCreateDTO; +import com.example.nto.dto.entity.employee.EmployeeDTO; +import com.example.nto.dto.entity.employee.EmployeeItemDTO; +import com.example.nto.dto.mappers.employee.EmployeeCreateMapper; +import com.example.nto.dto.mappers.employee.EmployeeItemMapper; +import com.example.nto.dto.mappers.employee.EmployeeMapper; +import com.example.nto.repository.EmployeeRepository; +import com.example.nto.repository.OfficeRepository; +import com.example.nto.repository.PositionRepository; +import com.example.nto.repository.RoleRepository; +import com.example.nto.service.EmployeeService; +import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class EmployeeServiceImpl implements EmployeeService { + private final EmployeeRepository employeeRepository; + private final OfficeRepository officeRepository; + private final RoleRepository roleRepository; + private final PositionRepository positionRepository; + private final PasswordEncoder passwordEncoder; + + @Override + @LogExample + public List getAll() { + return employeeRepository.findAll().stream().map(EmployeeItemMapper::convertToDTO).collect(Collectors.toList()); + } + + @Override + @LogExample + public List getWorkingEmployee(boolean isWorking) { + return employeeRepository.findAll().stream().filter(employee -> checkWorking(employee, isWorking)) + .map(EmployeeItemMapper::convertToDTO).collect(Collectors.toList()); + } + + @Override + @LogExample + public EmployeeDTO getById(long employeeId) { + return employeeRepository.findById(employeeId).map(EmployeeMapper::convertToDTO) + .orElseThrow(() -> new ResourceNotFoundException("Работник с id (" + employeeId + ") не найден!")); + } + + @Override + @LogExample + public EmployeeDTO getByEmail(String email) { + return employeeRepository.findByEmail(email).map(EmployeeMapper::convertToDTO) + .orElseThrow(() -> new ResourceNotFoundException("Работник с email (" + email + ") не найден!")); + } + + @Override + @LogExample + public EmployeeDTO getByTelephone(String telephone) { + return employeeRepository.findByTelephone(telephone).map(EmployeeMapper::convertToDTO) + .orElseThrow(() -> new ResourceNotFoundException("Работник с telephone (" + telephone + ") не найден!")); + } + + @Override + @LogExample + public EmployeeDTO create(EmployeeCreateDTO employeeCreateDTO) { + Optional employeeEmail = employeeRepository.findByEmail(employeeCreateDTO.getEmail()); + Optional employeeTelephone = employeeRepository.findByTelephone(employeeCreateDTO.getTelephone()); + + if (employeeEmail.isPresent() || employeeTelephone.isPresent()) { + throw new ConflictResourceException("Пользователь с таким email или телефоном уже существует!"); + } + + Office office = officeRepository.findByName(employeeCreateDTO.getOfficeName()) + .orElseThrow(() -> new ResourceNotFoundException("Офис с именем (" + employeeCreateDTO.getOfficeName() + ") не найден!")); + Position position = positionRepository.findByName(employeeCreateDTO.getPositionName()) + .orElseThrow(() -> new ResourceNotFoundException("Позиция с именем (" + employeeCreateDTO.getPositionName() + ") не найден!")); + Role role = roleRepository.findByRoleName(employeeCreateDTO.getRole()) + .orElseThrow(() -> new ResourceNotFoundException("Роль с названием (" + employeeCreateDTO.getRole() + ") не найден!")); + + return EmployeeMapper.convertToDTO(employeeRepository.save( + EmployeeCreateMapper.convertFromDTO(employeeCreateDTO, passwordEncoder.encode(employeeCreateDTO.getPassword()), office, position, role))); + } + + @Override + @LogExample + public EmployeeDTO update(long employeeId, EmployeeDTO employeeDTO) { + Employee employee = employeeRepository.findById(employeeId) + .orElseThrow(() -> new ResourceNotFoundException("Работник с id (" + employeeId + ") не найден!")); + + Optional employeeEmail = employeeRepository.findByEmail(employeeDTO.getEmail()); + Optional employeeTelephone = employeeRepository.findByTelephone(employeeDTO.getTelephone()); + + if (employeeEmail.isPresent() || employeeTelephone.isPresent()) { + throw new ConflictResourceException("Пользователь с таким email или телефоном уже существует!"); + } + + Office office = officeRepository.findByName(employeeDTO.getOfficeName()) + .orElseThrow(() -> new ResourceNotFoundException("Офис с именем (" + employeeDTO.getOfficeName() + ") не найден!")); + Position position = positionRepository.findByName(employeeDTO.getPositionName()) + .orElseThrow(() -> new ResourceNotFoundException("Позиция с именем (" + employeeDTO.getPositionName() + ") не найден!")); + + employee.setName(employeeDTO.getName()); + employee.setSurname(employeeDTO.getSurname()); + employee.setPatronymic(employeeDTO.getPatronymic()); + employee.setAboutMe(employeeDTO.getAboutMe()); + employee.setTelephone(employee.getTelephone()); + employee.setEmail(employee.getEmail()); + employee.setOffice(office); + employee.setPosition(position); + + // profileImageUrl меняется в отдельном эндпоинте + + employee.setBlocked(employeeDTO.isBlocked()); + + return EmployeeMapper.convertToDTO(employeeRepository.save(employee)); + } + + @Override + @LogExample + public void delete(long employeeId) { + employeeRepository.findById(employeeId).orElseThrow(() -> new ResourceNotFoundException("Работник с id (" + employeeId + ") не найден!")); + employeeRepository.deleteById(employeeId); + } + + @Override + @LogExample + public void patchProfileImage(long employeeId, String imageUrl) { + Employee employee = employeeRepository.findById(employeeId) + .orElseThrow(() -> new ResourceNotFoundException("Работник с id (" + employeeId + ") не найден!")); + employee.setProfileImageUrl(imageUrl); + employeeRepository.save(employee); + } + + @Override + @LogExample + public void patchBlockEmployee(long employeeId, boolean blockStatus) { + Employee employee = employeeRepository.findById(employeeId) + .orElseThrow(() -> new ResourceNotFoundException("Работник с id (" + employeeId + ") не найден!")); + employee.setBlocked(blockStatus); + employeeRepository.save(employee); + } + + private static boolean checkWorking(Employee employee, boolean isWorking) { + List visits = employee.getVisits().stream().filter(visit -> !visit.isFinished()).collect(Collectors.toList()); + + if (visits.isEmpty()) return !isWorking; + else if (visits.size() == 1) return isWorking; + else throw new IllegalStateException("Пользователь не может находится в суперпозиция"); + } +}