Added new requests

This commit is contained in:
Индекс Зиро 2025-02-18 20:34:33 +03:00
parent 0cfe30a008
commit 413d071443
12 changed files with 170 additions and 41 deletions

View File

@ -32,6 +32,9 @@ dependencies {
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.security:spring-security-test'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5'
}
tasks.named('test') {

View File

@ -0,0 +1,59 @@
package com.indexzero.finals.config;
import com.indexzero.finals.service.impl.UserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.boot.autoconfigure.security.servlet.PathRequest.toH2Console;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Autowired
private UserDetailsServiceImpl userDetailsService;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/v3/api-docs/**").permitAll()
.requestMatchers("/api/employee/login").authenticated()
.requestMatchers("/api/employee/profile").authenticated()
.anyRequest().authenticated()
)
.httpBasic(Customizer.withDefaults()).csrf(csrf -> csrf
.ignoringRequestMatchers(toH2Console())
.disable()).headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable));
return http.build();
}
@Bean
public AuthenticationProvider authenticationProvider(){
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setUserDetailsService(userDetailsService);
provider.setPasswordEncoder(passwordEncoder());
return provider;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}

View File

@ -1,5 +1,6 @@
package com.indexzero.finals.controller;
import com.indexzero.finals.dto.EmployeeDTO;
import com.indexzero.finals.entity.Code;
import com.indexzero.finals.entity.Employee;
import com.indexzero.finals.entity.Visit;
@ -8,39 +9,34 @@ import com.indexzero.finals.repository.EmployeeRepository;
import com.indexzero.finals.repository.VisitRepository;
import com.indexzero.finals.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api")
@RequestMapping("/api/employee")
public class EmployeeController {
@Autowired
EmployeeRepository employeeRepository;
@Autowired
CodeRepository codeRepository;
@Autowired
EmployeeService employeeService;
@Autowired
VisitRepository visitRepository;
@GetMapping("/{login}/auth")
public ResponseEntity<Object> Auth(@PathVariable String login) {
return employeeService.checkIfUserExists(login);
@PostMapping("/login")
public ResponseEntity<Object> login() {
return new ResponseEntity(HttpStatus.OK);
}
@GetMapping("/{login}/info")
public ResponseEntity<Employee> getInfo(@PathVariable String login) {
return employeeService.getUserInfo(login);
@PostMapping("/profile")
public ResponseEntity<EmployeeDTO> getInfo() {
return employeeService.getUserInfo(SecurityContextHolder.getContext().getAuthentication());
}
@PatchMapping("/{login}/open")
public ResponseEntity<Object> Open(@RequestParam Long code, @PathVariable String login) {
return employeeService.openTheDoor(login, code);
@PatchMapping("/open")
public ResponseEntity<Object> Open(@RequestParam Long code) {
return employeeService.openTheDoor(code, SecurityContextHolder.getContext().getAuthentication());
}
}

View File

@ -0,0 +1,13 @@
package com.indexzero.finals.dto;
import lombok.Data;
@Data
public class EmployeeDTO {
private long id;
private String login;
private String name;
private String authority;
private String position;
private String photoUrl;
}

View File

@ -2,11 +2,14 @@ package com.indexzero.finals.entity;
import jakarta.persistence.*;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import java.io.Serializable;
@Entity
@Data
@Table(name = "authority")
public class Authority {
public class Authority implements GrantedAuthority {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)

View File

@ -5,6 +5,9 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
@ -14,7 +17,7 @@ import java.util.Set;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
public class Employee implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
@ -41,4 +44,8 @@ public class Employee {
@OneToMany(mappedBy = "id")
List<Visit> visits;
@Override
public String getUsername() {
return this.login;
}
}

View File

@ -4,6 +4,7 @@ import jakarta.persistence.*;
import lombok.Data;
import org.apache.catalina.User;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@ -16,7 +17,7 @@ public class Visit {
private long id;
@Column(name = "visit_time")
private Date visitTime;
private LocalDateTime visitTime;
@Column(name = "type")
private String type;

View File

@ -5,4 +5,5 @@ import org.springframework.data.jpa.repository.JpaRepository;
public interface CodeRepository extends JpaRepository<Code, Long> {
boolean existsByValue(Long value);
Code findByValue(Long code);
}

View File

@ -1,10 +1,13 @@
package com.indexzero.finals.service;
import com.indexzero.finals.dto.EmployeeDTO;
import com.indexzero.finals.entity.Employee;
import org.apache.catalina.User;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
public interface EmployeeService {
ResponseEntity<Object> checkIfUserExists(String login);
ResponseEntity<Employee> getUserInfo(String login);
ResponseEntity<Object> openTheDoor(String login, Long code);
ResponseEntity<EmployeeDTO> getUserInfo(Authentication auth);
ResponseEntity<Object> openTheDoor(Long code, Authentication auth);
}

View File

@ -1,16 +1,21 @@
package com.indexzero.finals.service.impl;
import com.indexzero.finals.dto.EmployeeDTO;
import com.indexzero.finals.entity.Employee;
import com.indexzero.finals.entity.Visit;
import com.indexzero.finals.repository.CodeRepository;
import com.indexzero.finals.repository.EmployeeRepository;
import com.indexzero.finals.service.EmployeeService;
import com.indexzero.finals.util.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Service
public class EmployeeServiceImpl implements EmployeeService {
@ -33,29 +38,28 @@ public class EmployeeServiceImpl implements EmployeeService {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
}
public ResponseEntity<Employee> getUserInfo(String login) {
try {
if (employeeRepository.existsByLogin(login)) {
return new ResponseEntity<>(employeeRepository.findByLogin(login), HttpStatus.OK);
}
else {
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
}
}
catch(Exception e) {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
@Override
public ResponseEntity<EmployeeDTO> getUserInfo(Authentication auth) {
return new ResponseEntity<>(EmployeeMapper.convertToDTO(employeeRepository.findByLogin(auth.getName())), HttpStatus.OK);
}
public ResponseEntity<Object> openTheDoor(String login, Long code) {
public ResponseEntity<Object> openTheDoor(Long code, Authentication auth) {
try {
if(employeeRepository.existsByLogin(login)) {
if(codeRepository.findByValue(code).isActive()) {
if (codeRepository.existsByValue(Long.valueOf(code))) {
Employee employee = employeeRepository.findByLogin(login);
Employee employee = employeeRepository.findByLogin(auth.getName());
Visit visit = new Visit();
LocalDateTime time = LocalDateTime.now();
String formatted = time.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
formatted = formatted.split("\\.")[0];
// employee.setLastVisit(LocalDateTime.parse(formatted));
visit.setVisitTime(LocalDateTime.now());
visit.setType("smartphone");
List<Visit> v = employee.getVisits();
v.add(visit);
employee.setVisits(v);
employeeRepository.save(employee);
return new ResponseEntity<>(HttpStatus.OK);

View File

@ -0,0 +1,20 @@
package com.indexzero.finals.service.impl;
import com.indexzero.finals.repository.EmployeeRepository;
import com.indexzero.finals.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private EmployeeRepository employeeRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return employeeRepository.findByLogin(username);
}
}

View File

@ -0,0 +1,19 @@
package com.indexzero.finals.util;
import com.indexzero.finals.dto.EmployeeDTO;
import com.indexzero.finals.entity.Employee;
import lombok.experimental.UtilityClass;
@UtilityClass
public class EmployeeMapper {
public static EmployeeDTO convertToDTO(Employee user) {
EmployeeDTO employeeDTO = new EmployeeDTO();
employeeDTO.setId(user.getId());
employeeDTO.setLogin(user.getLogin());
employeeDTO.setAuthority(user.getAuthorities().iterator().next().getAuthority());
employeeDTO.setName(user.getName());
employeeDTO.setPosition(user.getPosition());
employeeDTO.setPhotoUrl(user.getPhotoUrl());
return employeeDTO;
}
}