From 6acc58cb591d05d5bffc88013f608b7a514a56a7 Mon Sep 17 00:00:00 2001 From: Gnazarov Date: Thu, 20 Feb 2025 15:10:21 +0300 Subject: [PATCH] Checkpoint 5. +fix; +find by qr-code --- .../example/nto/config/WebSecurityConfig.java | 2 + .../nto/controller/EmployeeController.java | 6 +++ .../java/com/example/nto/dto/CodeDTO.java | 8 ++++ .../java/com/example/nto/entity/Employee.java | 4 ++ .../AuthorityNotFoundException.java | 7 +++ .../nto/exceptions/CodeNotFoundException.java | 7 +++ .../handler/GlobalExceptionHandler.java | 11 +++++ .../nto/repository/AuthorityRepository.java | 7 ++- .../nto/repository/CodeRepository.java | 3 ++ .../nto/repository/EmployeeRepository.java | 4 ++ .../example/nto/service/EmployeeService.java | 3 ++ .../nto/service/impl/EmployeeServiceImpl.java | 44 ++++++++++++++++--- src/main/resources/application.yml | 2 +- src/main/resources/data.sql | 24 +++++----- src/main/resources/schema.sql | 4 +- 15 files changed, 114 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/example/nto/dto/CodeDTO.java create mode 100644 src/main/java/com/example/nto/exceptions/AuthorityNotFoundException.java create mode 100644 src/main/java/com/example/nto/exceptions/CodeNotFoundException.java diff --git a/src/main/java/com/example/nto/config/WebSecurityConfig.java b/src/main/java/com/example/nto/config/WebSecurityConfig.java index d626bc9..fd04c44 100644 --- a/src/main/java/com/example/nto/config/WebSecurityConfig.java +++ b/src/main/java/com/example/nto/config/WebSecurityConfig.java @@ -24,6 +24,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .csrf().disable() .authorizeRequests() .antMatchers("/api/employee/registration").hasAuthority("ROLE_ADMIN") + .antMatchers("/api/employee/login").hasAnyAuthority("ROLE_EMPLOYEE", "ROLE_ADMIN") + .antMatchers("/api/employee/**").authenticated() .anyRequest().authenticated() .and() .httpBasic() diff --git a/src/main/java/com/example/nto/controller/EmployeeController.java b/src/main/java/com/example/nto/controller/EmployeeController.java index 45698b5..809839e 100644 --- a/src/main/java/com/example/nto/controller/EmployeeController.java +++ b/src/main/java/com/example/nto/controller/EmployeeController.java @@ -1,6 +1,7 @@ package com.example.nto.controller; +import com.example.nto.dto.CodeDTO; import com.example.nto.dto.EmployeeDTO; import com.example.nto.dto.RegisterDTO; import com.example.nto.entity.Code; @@ -98,4 +99,9 @@ public class EmployeeController { return ResponseEntity.status(HttpStatus.OK).body(service.findEmployeeDTOByUsername(authentication.getName())); } + @GetMapping("/qr-code") + public ResponseEntity getEmployeeByCode(@RequestBody CodeDTO dto){ + return ResponseEntity.status(HttpStatus.OK).body(service.findEmployeeByCode(dto)); + } + } diff --git a/src/main/java/com/example/nto/dto/CodeDTO.java b/src/main/java/com/example/nto/dto/CodeDTO.java new file mode 100644 index 0000000..e588124 --- /dev/null +++ b/src/main/java/com/example/nto/dto/CodeDTO.java @@ -0,0 +1,8 @@ +package com.example.nto.dto; + +import lombok.Data; + +@Data +public class CodeDTO { + private long value; +} diff --git a/src/main/java/com/example/nto/entity/Employee.java b/src/main/java/com/example/nto/entity/Employee.java index 9983c71..0db6dca 100644 --- a/src/main/java/com/example/nto/entity/Employee.java +++ b/src/main/java/com/example/nto/entity/Employee.java @@ -47,6 +47,10 @@ public class Employee implements UserDetails { // @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) // @JoinTable(name = "Employee_AUTHORITIES") + @OneToOne + @JoinColumn(name = "code_id", referencedColumnName = "id") + private Code code; + @Override public boolean isAccountNonExpired() { return true; diff --git a/src/main/java/com/example/nto/exceptions/AuthorityNotFoundException.java b/src/main/java/com/example/nto/exceptions/AuthorityNotFoundException.java new file mode 100644 index 0000000..b46b303 --- /dev/null +++ b/src/main/java/com/example/nto/exceptions/AuthorityNotFoundException.java @@ -0,0 +1,7 @@ +package com.example.nto.exceptions; + +public class AuthorityNotFoundException extends RuntimeException { + public AuthorityNotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/nto/exceptions/CodeNotFoundException.java b/src/main/java/com/example/nto/exceptions/CodeNotFoundException.java new file mode 100644 index 0000000..956f980 --- /dev/null +++ b/src/main/java/com/example/nto/exceptions/CodeNotFoundException.java @@ -0,0 +1,7 @@ +package com.example.nto.exceptions; + +public class CodeNotFoundException extends RuntimeException { + public CodeNotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/nto/exceptions/handler/GlobalExceptionHandler.java b/src/main/java/com/example/nto/exceptions/handler/GlobalExceptionHandler.java index 568d760..e9e4841 100644 --- a/src/main/java/com/example/nto/exceptions/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/example/nto/exceptions/handler/GlobalExceptionHandler.java @@ -1,5 +1,7 @@ package com.example.nto.exceptions.handler; +import com.example.nto.exceptions.AuthorityNotFoundException; +import com.example.nto.exceptions.CodeNotFoundException; import com.example.nto.exceptions.EmployeeAlreadyExistException; import com.example.nto.exceptions.EmployeeNotFoundException; import org.springframework.http.HttpStatus; @@ -19,5 +21,14 @@ public class GlobalExceptionHandler { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage()); } + @ExceptionHandler(AuthorityNotFoundException.class) + public ResponseEntity authorityNotFoundExceptionHandler(AuthorityNotFoundException e){ + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage()); + } + + @ExceptionHandler(CodeNotFoundException.class) + public ResponseEntity codeNotFoundExceptionHandler(CodeNotFoundException e){ + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage()); + } } diff --git a/src/main/java/com/example/nto/repository/AuthorityRepository.java b/src/main/java/com/example/nto/repository/AuthorityRepository.java index 300c92b..047e9b1 100644 --- a/src/main/java/com/example/nto/repository/AuthorityRepository.java +++ b/src/main/java/com/example/nto/repository/AuthorityRepository.java @@ -1,7 +1,10 @@ package com.example.nto.repository; -import com.example.nto.entity.Employee; +import com.example.nto.entity.Authority; import org.springframework.data.jpa.repository.JpaRepository; -public interface AuthorityRepository extends JpaRepository { +import java.util.Optional; + +public interface AuthorityRepository extends JpaRepository { + Optional findByAuthority(String authority); } diff --git a/src/main/java/com/example/nto/repository/CodeRepository.java b/src/main/java/com/example/nto/repository/CodeRepository.java index 4ca3152..7e0e14e 100644 --- a/src/main/java/com/example/nto/repository/CodeRepository.java +++ b/src/main/java/com/example/nto/repository/CodeRepository.java @@ -3,5 +3,8 @@ package com.example.nto.repository; import com.example.nto.entity.Code; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface CodeRepository extends JpaRepository { + Optional findByValue(long value); } diff --git a/src/main/java/com/example/nto/repository/EmployeeRepository.java b/src/main/java/com/example/nto/repository/EmployeeRepository.java index 831d011..2a18e99 100644 --- a/src/main/java/com/example/nto/repository/EmployeeRepository.java +++ b/src/main/java/com/example/nto/repository/EmployeeRepository.java @@ -1,5 +1,6 @@ package com.example.nto.repository; +import com.example.nto.entity.Code; import com.example.nto.entity.Employee; import org.springframework.data.jpa.repository.JpaRepository; @@ -7,4 +8,7 @@ import java.util.Optional; public interface EmployeeRepository extends JpaRepository { public Optional findEmployeeByUsername(String login); + + public Optional findEmployeeByCode(Code code); + } diff --git a/src/main/java/com/example/nto/service/EmployeeService.java b/src/main/java/com/example/nto/service/EmployeeService.java index f8a49a8..9ca6446 100644 --- a/src/main/java/com/example/nto/service/EmployeeService.java +++ b/src/main/java/com/example/nto/service/EmployeeService.java @@ -1,5 +1,6 @@ package com.example.nto.service; +import com.example.nto.dto.CodeDTO; import com.example.nto.dto.EmployeeDTO; import com.example.nto.dto.RegisterDTO; import com.example.nto.entity.Employee; @@ -12,4 +13,6 @@ public interface EmployeeService { public Employee findEmployeeByUsername(String login); EmployeeDTO createEmployee(RegisterDTO dto); + + EmployeeDTO findEmployeeByCode(CodeDTO dto); } diff --git a/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java b/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java index 8c68a7a..aaec22d 100644 --- a/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java +++ b/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java @@ -1,10 +1,17 @@ package com.example.nto.service.impl; +import com.example.nto.dto.CodeDTO; import com.example.nto.dto.EmployeeDTO; import com.example.nto.dto.RegisterDTO; +import com.example.nto.entity.Authority; +import com.example.nto.entity.Code; import com.example.nto.entity.Employee; +import com.example.nto.exceptions.AuthorityNotFoundException; +import com.example.nto.exceptions.CodeNotFoundException; import com.example.nto.exceptions.EmployeeAlreadyExistException; import com.example.nto.exceptions.EmployeeNotFoundException; +import com.example.nto.repository.AuthorityRepository; +import com.example.nto.repository.CodeRepository; import com.example.nto.repository.EmployeeRepository; import com.example.nto.service.EmployeeService; import com.example.nto.util.EmployeeMapper; @@ -14,39 +21,47 @@ import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.Optional; +import java.util.Set; @Service @AllArgsConstructor public class EmployeeServiceImpl implements EmployeeService { - private EmployeeRepository repository; + private EmployeeRepository employeeRepository; private final PasswordEncoder passwordEncoder; + private final AuthorityRepository authorityRepository; + private final CodeRepository codeRepository; @Override public void updateLocalTime(Employee employee) { employee.setLastVisit(LocalDateTime.now().toString()); - repository.save(employee); + employeeRepository.save(employee); } @Override public Employee findEmployeeByUsername(String login) { - return repository.findEmployeeByUsername(login).orElseThrow(() -> new EmployeeNotFoundException("Employee with username "+login+" not found")); + return employeeRepository.findEmployeeByUsername(login).orElseThrow(() -> new EmployeeNotFoundException("Employee with username "+login+" not found")); } public EmployeeDTO findEmployeeDTOByUsername(String login) { - return EmployeeMapper.convertToDTO(repository.findEmployeeByUsername(login).orElseThrow(() -> new EmployeeNotFoundException("Employee with username "+login+" not found"))); + return EmployeeMapper.convertToDTO(employeeRepository.findEmployeeByUsername(login).orElseThrow(() -> new EmployeeNotFoundException("Employee with username "+login+" not found"))); } @Override public EmployeeDTO createEmployee(RegisterDTO dto) { - Optional optionalEmployee = repository.findEmployeeByUsername(dto.getUsername()); + Optional optionalEmployee = employeeRepository.findEmployeeByUsername(dto.getUsername()); if(optionalEmployee.isPresent()){ throw new EmployeeAlreadyExistException("Employee with username " + dto.getUsername() +" already exist"); } + Optional optionalAuthority = authorityRepository.findByAuthority("ROLE_EMPLOYEE"); + if(optionalAuthority.isEmpty()){ + throw new AuthorityNotFoundException("Authority not found"); + } + Employee employee = new Employee(); employee.setName(dto.getName()); employee.setUsername(dto.getUsername()); @@ -58,7 +73,24 @@ public class EmployeeServiceImpl implements EmployeeService { employee.setJobPos(dto.getJobPos()); employee.setLastVisit(LocalDateTime.now().toString()); - return EmployeeMapper.convertToDTO(repository.save(employee)); + employee.setAuthorities(Set.of(optionalAuthority.get())); + + return EmployeeMapper.convertToDTO(employeeRepository.save(employee)); + } + + @Override + public EmployeeDTO findEmployeeByCode(CodeDTO dto) { + Optional optionalCode = codeRepository.findByValue(dto.getValue()); + if(optionalCode.isEmpty()){ + throw new CodeNotFoundException("Qr-Code "+dto.getValue()+" not found"); + } + + Optional optionalEmployee = employeeRepository.findEmployeeByCode(optionalCode.get()); + if(optionalEmployee.isEmpty()){ + throw new EmployeeNotFoundException("Employee by qr-code "+dto.getValue()+" not found"); + } + + return EmployeeMapper.convertToDTO(optionalEmployee.get()); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c5e1217..2f826e8 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -30,7 +30,7 @@ spring: hibernate: #ddl-auto: none - ddl-auto: update + ddl-auto: none # Показываем запросы show-sql: true diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 2f4de38..9871a7c 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -3,21 +3,21 @@ VALUES (1, 'ROLE_EMPLOYEE'), (2, 'ROLE_ADMIN'); -INSERT INTO employee (id, username, password, name, photo, job_pos, last_visit) +INSERT INTO code (id, value) VALUES -(1, 'pivanov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Иванов Петр Федорович', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Разработчик', '2024-02-12T08:30'), -(2, 'ipetrov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Петров Иван Константинович', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Аналитик', '2024-02-13T08:35'), -(3, 'asemenov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Семенов Анатолий Анатольевич', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Разработчик', '2024-02-13T08:31'), -(4, 'afedorov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Федоров Александр Сергеевич', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Тестировщик', '2024-02-12T08:36'), -(5, 'gnazarov', '$2a$12$QH3S01HpdzDARg4qrZ4Qee9SkFmxmau2SiEvsSg5M17K2vBBm673O', 'Назаров Г. Н.', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Администратор', '2024-02-12T08:36'); +(1, 1234567890123456789), +(2, 9223372036854775807), +(3, 1122334455667788990), +(4, 998877665544332211), +(5, 5566778899001122334); -INSERT INTO code (value) +INSERT INTO employee (username, password, name, photo, job_pos, last_visit, code_id) VALUES -(1234567890123456789), -(9223372036854775807), -(1122334455667788990), -(998877665544332211), -(5566778899001122334); +('pivanov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Иванов Петр Федорович', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Разработчик', '2024-02-12T08:30', 3), +('ipetrov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Петров Иван Константинович', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Аналитик', '2024-02-13T08:35', 2), +('asemenov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Семенов Анатолий Анатольевич', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Разработчик', '2024-02-13T08:31', 4), +('afedorov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Федоров Александр Сергеевич', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Тестировщик', '2024-02-12T08:36', 1), +('gnazarov', '$2a$12$QH3S01HpdzDARg4qrZ4Qee9SkFmxmau2SiEvsSg5M17K2vBBm673O', 'Назаров Г. Н.', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Администратор', '2024-02-12T08:36', 5); INSERT INTO employee_authorities(employee_id, authorities_id) VALUES diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 0735c75..6dccb65 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -8,9 +8,11 @@ password VARCHAR(255), name VARCHAR(255), photo VARCHAR(255), job_pos VARCHAR(255), -last_visit VARCHAR(255) +last_visit VARCHAR(255), --authorities_id BIGINT NOT NULL, --CONSTRAINT fk_employee_authorities FOREIGN KEY(authorities_id) REFERENCES authorities(id) +code_id BIGINT NOT NULL, +CONSTRAINT fk_employee_code FOREIGN KEY(code_id) REFERENCES code(id) ); CREATE TABLE IF NOT EXISTS employee_authorities(