feat: create employee service, office service

This commit is contained in:
Petr Rudichev 2025-02-19 13:00:12 +03:00
parent be035d4a82
commit 66d9676911
4 changed files with 186 additions and 0 deletions

View File

@ -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<Office, Long> {
Optional<Office> findByName(String name);
}

View File

@ -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<Position, Long> {
Optional<Position> findByName(String name);
}

View File

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

View File

@ -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<EmployeeItemDTO> getAll() {
return employeeRepository.findAll().stream().map(EmployeeItemMapper::convertToDTO).collect(Collectors.toList());
}
@Override
@LogExample
public List<EmployeeItemDTO> 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<Employee> employeeEmail = employeeRepository.findByEmail(employeeCreateDTO.getEmail());
Optional<Employee> 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<Employee> employeeEmail = employeeRepository.findByEmail(employeeDTO.getEmail());
Optional<Employee> 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<Visit> 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("Пользователь не может находится в суперпозиция");
}
}