From dcfa2f0cac57ba9d879fe6445430ded2e31c9b4b Mon Sep 17 00:00:00 2001 From: SunZar Date: Wed, 19 Feb 2025 18:38:14 +0300 Subject: [PATCH] Initial Commit --- .gitignore | 38 +++++++++++ .idea/.gitignore | 3 + .idea/encodings.xml | 7 ++ .idea/misc.xml | 14 ++++ .idea/vcs.xml | 7 ++ pom.xml | 61 +++++++++++++++++ src/main/java/org/example/App.java | 11 +++ .../org/example/config/WebSecurityConfig.java | 41 ++++++++++++ .../example/controller/UserController.java | 51 ++++++++++++++ src/main/java/org/example/dto/CodeDTO.java | 9 +++ src/main/java/org/example/dto/PassingDTO.java | 13 ++++ src/main/java/org/example/dto/UserDTO.java | 13 ++++ src/main/java/org/example/entity/Code.java | 17 +++++ src/main/java/org/example/entity/Passing.java | 26 +++++++ src/main/java/org/example/entity/User.java | 67 +++++++++++++++++++ .../exception/UserNotFoundException.java | 7 ++ .../handler/GlobalExceptionHandler.java | 15 +++++ .../example/repository/CodeRepository.java | 10 +++ .../example/repository/PassingRepository.java | 15 +++++ .../example/repository/UserRepository.java | 11 +++ .../org/example/service/PassingService.java | 11 +++ .../java/org/example/service/UserService.java | 11 +++ .../service/impl/PassingServiceImpl.java | 27 ++++++++ .../service/impl/UserDetailsServiceImpl.java | 29 ++++++++ .../example/service/impl/UserServiceImpl.java | 46 +++++++++++++ .../java/org/example/util/PassingMapper.java | 19 ++++++ .../java/org/example/util/UserMapper.java | 20 ++++++ src/main/resources/application.yml | 22 ++++++ .../1.0/2025-02-18--0001-user.xml | 38 +++++++++++ .../1.0/2025-02-18--0002-code.xml | 23 +++++++ .../1.0/2025-02-19--0003-passing.xml | 33 +++++++++ .../1.0/2025-02-19--0006-position.xml | 24 +++++++ .../1.0/2025-02-19--0007-user-position.xml | 27 ++++++++ .../1.0/2025-02-19-0004-input-type.xml | 24 +++++++ .../1.0/2025-02-19-0005-authority.xml | 25 +++++++ .../1.0/2025-02-19-0008-user-authority.xml | 27 ++++++++ .../data/2025-02-18--0001-user-data.xml | 11 +++ .../data/2025-02-18--0002-code-data.xml | 11 +++ .../data/2025-02-19-0003-input-type-data.xml | 11 +++ .../data/2025-02-19-0004-passing-data.xml | 11 +++ .../data/2025-02-19-0005-authority-data.xml | 11 +++ .../data/2025-02-19-0006-position-data.xml | 11 +++ .../2025-02-19-0007-user-position-data.xml | 11 +++ .../2025-02-19-0008-user-authority-data.xml | 11 +++ .../data/csv/2025-02-18--0001-user-data.csv | 5 ++ .../data/csv/2025-02-18--0002-code-data.csv | 6 ++ .../csv/2025-02-19--0003-input-type-data.csv | 3 + .../csv/2025-02-19--0004-passing-data.csv | 4 ++ .../csv/2025-02-19--0005-authority-data.csv | 3 + .../csv/2025-02-19--0006-position-data.csv | 4 ++ .../2025-02-19--0007-user-position-data.csv | 5 ++ .../2025-02-19-0008-user-authority-data.csv | 5 ++ .../db.changelog/db.changelog-master.xml | 26 +++++++ 53 files changed, 991 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 pom.xml create mode 100644 src/main/java/org/example/App.java create mode 100644 src/main/java/org/example/config/WebSecurityConfig.java create mode 100644 src/main/java/org/example/controller/UserController.java create mode 100644 src/main/java/org/example/dto/CodeDTO.java create mode 100644 src/main/java/org/example/dto/PassingDTO.java create mode 100644 src/main/java/org/example/dto/UserDTO.java create mode 100644 src/main/java/org/example/entity/Code.java create mode 100644 src/main/java/org/example/entity/Passing.java create mode 100644 src/main/java/org/example/entity/User.java create mode 100644 src/main/java/org/example/exception/UserNotFoundException.java create mode 100644 src/main/java/org/example/exception/handler/GlobalExceptionHandler.java create mode 100644 src/main/java/org/example/repository/CodeRepository.java create mode 100644 src/main/java/org/example/repository/PassingRepository.java create mode 100644 src/main/java/org/example/repository/UserRepository.java create mode 100644 src/main/java/org/example/service/PassingService.java create mode 100644 src/main/java/org/example/service/UserService.java create mode 100644 src/main/java/org/example/service/impl/PassingServiceImpl.java create mode 100644 src/main/java/org/example/service/impl/UserDetailsServiceImpl.java create mode 100644 src/main/java/org/example/service/impl/UserServiceImpl.java create mode 100644 src/main/java/org/example/util/PassingMapper.java create mode 100644 src/main/java/org/example/util/UserMapper.java create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/db.changelog/1.0/2025-02-18--0001-user.xml create mode 100644 src/main/resources/db.changelog/1.0/2025-02-18--0002-code.xml create mode 100644 src/main/resources/db.changelog/1.0/2025-02-19--0003-passing.xml create mode 100644 src/main/resources/db.changelog/1.0/2025-02-19--0006-position.xml create mode 100644 src/main/resources/db.changelog/1.0/2025-02-19--0007-user-position.xml create mode 100644 src/main/resources/db.changelog/1.0/2025-02-19-0004-input-type.xml create mode 100644 src/main/resources/db.changelog/1.0/2025-02-19-0005-authority.xml create mode 100644 src/main/resources/db.changelog/1.0/2025-02-19-0008-user-authority.xml create mode 100644 src/main/resources/db.changelog/data/2025-02-18--0001-user-data.xml create mode 100644 src/main/resources/db.changelog/data/2025-02-18--0002-code-data.xml create mode 100644 src/main/resources/db.changelog/data/2025-02-19-0003-input-type-data.xml create mode 100644 src/main/resources/db.changelog/data/2025-02-19-0004-passing-data.xml create mode 100644 src/main/resources/db.changelog/data/2025-02-19-0005-authority-data.xml create mode 100644 src/main/resources/db.changelog/data/2025-02-19-0006-position-data.xml create mode 100644 src/main/resources/db.changelog/data/2025-02-19-0007-user-position-data.xml create mode 100644 src/main/resources/db.changelog/data/2025-02-19-0008-user-authority-data.xml create mode 100644 src/main/resources/db.changelog/data/csv/2025-02-18--0001-user-data.csv create mode 100644 src/main/resources/db.changelog/data/csv/2025-02-18--0002-code-data.csv create mode 100644 src/main/resources/db.changelog/data/csv/2025-02-19--0003-input-type-data.csv create mode 100644 src/main/resources/db.changelog/data/csv/2025-02-19--0004-passing-data.csv create mode 100644 src/main/resources/db.changelog/data/csv/2025-02-19--0005-authority-data.csv create mode 100644 src/main/resources/db.changelog/data/csv/2025-02-19--0006-position-data.csv create mode 100644 src/main/resources/db.changelog/data/csv/2025-02-19--0007-user-position-data.csv create mode 100644 src/main/resources/db.changelog/data/csv/2025-02-19-0008-user-authority-data.csv create mode 100644 src/main/resources/db.changelog/db.changelog-master.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..accd629 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..8306744 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4fc6153 --- /dev/null +++ b/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + org.example + Android-Bootcamp-2025-Backend + 1.0-SNAPSHOT + + + 11 + 11 + UTF-8 + + + + org.springframework.boot + spring-boot-starter-parent + 2.5.5 + + + + + com.h2database + h2 + + + + org.liquibase + liquibase-core + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.projectlombok + lombok + + + + org.springdoc + springdoc-openapi-ui + 1.7.0 + + + + org.springframework.boot + spring-boot-starter-security + + + + \ No newline at end of file diff --git a/src/main/java/org/example/App.java b/src/main/java/org/example/App.java new file mode 100644 index 0000000..ce30cee --- /dev/null +++ b/src/main/java/org/example/App.java @@ -0,0 +1,11 @@ +package org.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class App { + public static void main(String[] args) { + SpringApplication.run(App.class, args); + } +} diff --git a/src/main/java/org/example/config/WebSecurityConfig.java b/src/main/java/org/example/config/WebSecurityConfig.java new file mode 100644 index 0000000..de05fb4 --- /dev/null +++ b/src/main/java/org/example/config/WebSecurityConfig.java @@ -0,0 +1,41 @@ +package org.example.config; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +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.configuration.WebSecurityConfiguration; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +@EnableWebSecurity +@RequiredArgsConstructor +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + private final UserDetailsService userDetailsService; + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .csrf().disable() + .authorizeRequests() + .antMatchers("/api/**").permitAll() +// .antMatchers("api/{username}/passing").hasAuthority("ROLE_ADMIN") +// .antMatchers("api/{username}/**").hasAnyAuthority("ROLE_USER", "ROLE_ADMIN") + .anyRequest().authenticated() + .and().httpBasic().and().headers().frameOptions().disable(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); + } + + private PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/src/main/java/org/example/controller/UserController.java b/src/main/java/org/example/controller/UserController.java new file mode 100644 index 0000000..1259ec0 --- /dev/null +++ b/src/main/java/org/example/controller/UserController.java @@ -0,0 +1,51 @@ +package org.example.controller; + +import lombok.RequiredArgsConstructor; +import org.example.dto.PassingDTO; +import org.example.dto.UserDTO; +import org.example.service.PassingService; +import org.example.service.UserService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("api/{username}") +@RequiredArgsConstructor +public class UserController { + + private final UserService userService; + private final PassingService passingService; + + @GetMapping("/auth") + public ResponseEntity getUserByUsername(@PathVariable String username) { + UserDTO userDTO = userService.getUserByUsername(username); + return ResponseEntity.ok("данный логин существует - можно пользоваться приложением"); + } + + @GetMapping("/info") + public ResponseEntity getUserInfoByUsername(@PathVariable String username) { + return ResponseEntity.ok(userService.getUserInfoByUsername(username)); + } + + @PatchMapping("/open") + public ResponseEntity patchUserByUsername(@PathVariable String username) { + UserDTO userDTO = userService.patchUserByUsername(username); + return ResponseEntity.ok("дверь открылась"); + } + + @GetMapping("/passing") + public ResponseEntity getPassingByUsername(@PathVariable String username) { + return ResponseEntity.ok(passingService.getPassingByUsername(username)); + } + + @GetMapping("/passing/paginated") + public ResponseEntity> getAllPassingPaginated( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "1") int size) { + Pageable pageable = PageRequest.of(page, size); + return ResponseEntity.ok(passingService.getAllPassingPaginated(pageable)); + } +} diff --git a/src/main/java/org/example/dto/CodeDTO.java b/src/main/java/org/example/dto/CodeDTO.java new file mode 100644 index 0000000..893416c --- /dev/null +++ b/src/main/java/org/example/dto/CodeDTO.java @@ -0,0 +1,9 @@ +package org.example.dto; + +import lombok.Data; + +@Data +public class CodeDTO { + private Long Id; + private Long code; +} diff --git a/src/main/java/org/example/dto/PassingDTO.java b/src/main/java/org/example/dto/PassingDTO.java new file mode 100644 index 0000000..fa3cf39 --- /dev/null +++ b/src/main/java/org/example/dto/PassingDTO.java @@ -0,0 +1,13 @@ +package org.example.dto; + +import lombok.Data; +import org.hibernate.mapping.Set; + +@Data +public class PassingDTO { + private Long id; + private String Username; + private String type; + private String time; + private Long code; +} diff --git a/src/main/java/org/example/dto/UserDTO.java b/src/main/java/org/example/dto/UserDTO.java new file mode 100644 index 0000000..e5a9b89 --- /dev/null +++ b/src/main/java/org/example/dto/UserDTO.java @@ -0,0 +1,13 @@ +package org.example.dto; + +import lombok.Data; + +@Data +public class UserDTO { + private Long id; + private String username; + private String name; + private String photo; + private String position; +// private String lastVisit; +} diff --git a/src/main/java/org/example/entity/Code.java b/src/main/java/org/example/entity/Code.java new file mode 100644 index 0000000..4035417 --- /dev/null +++ b/src/main/java/org/example/entity/Code.java @@ -0,0 +1,17 @@ +package org.example.entity; + +import lombok.Data; + +import javax.persistence.*; + +@Data +@Entity +@Table(name = "code") +public class Code { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "code") + private Long code; +} diff --git a/src/main/java/org/example/entity/Passing.java b/src/main/java/org/example/entity/Passing.java new file mode 100644 index 0000000..9924e79 --- /dev/null +++ b/src/main/java/org/example/entity/Passing.java @@ -0,0 +1,26 @@ +package org.example.entity; + +import lombok.Data; + +import javax.persistence.*; + +@Data +@Entity +@Table(name = "passing") +public class Passing { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @JoinColumn(name = "username") + private String username; + + @Column(name = "time") + private String time; + + @Column(name = "type") + private String type; + + @Column(name = "code") + private Long code; +} diff --git a/src/main/java/org/example/entity/User.java b/src/main/java/org/example/entity/User.java new file mode 100644 index 0000000..723194c --- /dev/null +++ b/src/main/java/org/example/entity/User.java @@ -0,0 +1,67 @@ +package org.example.entity; + +import liquibase.pro.packaged.C; +import lombok.Data; +import lombok.Generated; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import javax.persistence.*; +import java.util.Collection; +import java.util.List; + +@Data +@Entity +@Table(name = "user") +public class User implements UserDetails{ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "username") + private String username; + + @Column(name = "password") + private String password; + + @Column(name = "name") + private String name; + + @Column(name = "photo") + private String photo; + + @Column(name = "position") + private String position; + + // @Column(name = "lastVisit") +// private String lastVisit; + + @Override + public Collection getAuthorities() { + return List.of(); + } + + + @Override + public boolean isAccountNonExpired() { + return false; + } + + @Override + public boolean isAccountNonLocked() { + return false; + } + + @Override + public boolean isCredentialsNonExpired() { + return false; + } + + @Override + public boolean isEnabled() { + return false; + } + + + +} diff --git a/src/main/java/org/example/exception/UserNotFoundException.java b/src/main/java/org/example/exception/UserNotFoundException.java new file mode 100644 index 0000000..c79755d --- /dev/null +++ b/src/main/java/org/example/exception/UserNotFoundException.java @@ -0,0 +1,7 @@ +package org.example.exception; + +public class UserNotFoundException extends RuntimeException { + public UserNotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/org/example/exception/handler/GlobalExceptionHandler.java b/src/main/java/org/example/exception/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..a040486 --- /dev/null +++ b/src/main/java/org/example/exception/handler/GlobalExceptionHandler.java @@ -0,0 +1,15 @@ +package org.example.exception.handler; + +import org.example.exception.UserNotFoundException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExceptionHandler extends RuntimeException { + @ExceptionHandler(UserNotFoundException.class) + public ResponseEntity handleUserNotFoundException(UserNotFoundException e) { + return new ResponseEntity<>(e.getMessage(), HttpStatus.NOT_FOUND); + } +} diff --git a/src/main/java/org/example/repository/CodeRepository.java b/src/main/java/org/example/repository/CodeRepository.java new file mode 100644 index 0000000..12a069f --- /dev/null +++ b/src/main/java/org/example/repository/CodeRepository.java @@ -0,0 +1,10 @@ +package org.example.repository; + +import org.example.entity.Code; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface CodeRepository extends JpaRepository { + Optional findByCode(Long code); +} diff --git a/src/main/java/org/example/repository/PassingRepository.java b/src/main/java/org/example/repository/PassingRepository.java new file mode 100644 index 0000000..12e34d3 --- /dev/null +++ b/src/main/java/org/example/repository/PassingRepository.java @@ -0,0 +1,15 @@ +package org.example.repository; + +import org.example.entity.Passing; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface PassingRepository extends JpaRepository { + Optional findByUsername(String login); + + @Override + Page findAll(Pageable pageable); +} diff --git a/src/main/java/org/example/repository/UserRepository.java b/src/main/java/org/example/repository/UserRepository.java new file mode 100644 index 0000000..1a9c28c --- /dev/null +++ b/src/main/java/org/example/repository/UserRepository.java @@ -0,0 +1,11 @@ +package org.example.repository; + +import org.example.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByUsername(String username); + +} diff --git a/src/main/java/org/example/service/PassingService.java b/src/main/java/org/example/service/PassingService.java new file mode 100644 index 0000000..fba4489 --- /dev/null +++ b/src/main/java/org/example/service/PassingService.java @@ -0,0 +1,11 @@ +package org.example.service; + +import org.example.dto.PassingDTO; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface PassingService { + PassingDTO getPassingByUsername(String username); + + Page getAllPassingPaginated(Pageable pageable); +} diff --git a/src/main/java/org/example/service/UserService.java b/src/main/java/org/example/service/UserService.java new file mode 100644 index 0000000..c70c162 --- /dev/null +++ b/src/main/java/org/example/service/UserService.java @@ -0,0 +1,11 @@ +package org.example.service; + +import org.example.dto.UserDTO; + +public interface UserService { + UserDTO getUserByUsername(String username); + + UserDTO getUserInfoByUsername(String username); + + UserDTO patchUserByUsername(String username); +} diff --git a/src/main/java/org/example/service/impl/PassingServiceImpl.java b/src/main/java/org/example/service/impl/PassingServiceImpl.java new file mode 100644 index 0000000..df265df --- /dev/null +++ b/src/main/java/org/example/service/impl/PassingServiceImpl.java @@ -0,0 +1,27 @@ +package org.example.service.impl; + +import lombok.RequiredArgsConstructor; +import org.example.dto.PassingDTO; +import org.example.exception.UserNotFoundException; +import org.example.repository.PassingRepository; +import org.example.service.PassingService; +import org.example.util.PassingMapper; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PassingServiceImpl implements PassingService { + private final PassingRepository passingRepository; + @Override + public PassingDTO getPassingByUsername(String Username) { + return passingRepository.findByUsername(Username).map(PassingMapper::convertToDto).orElseThrow(() -> new UserNotFoundException("Посещения не найдены")); + + } + + @Override + public Page getAllPassingPaginated(Pageable pageable) { + return passingRepository.findAll(pageable).map(PassingMapper::convertToDto); + } +} diff --git a/src/main/java/org/example/service/impl/UserDetailsServiceImpl.java b/src/main/java/org/example/service/impl/UserDetailsServiceImpl.java new file mode 100644 index 0000000..7e0c898 --- /dev/null +++ b/src/main/java/org/example/service/impl/UserDetailsServiceImpl.java @@ -0,0 +1,29 @@ +package org.example.service.impl; + +import lombok.RequiredArgsConstructor; +import org.example.entity.User; +import org.example.repository.UserRepository; +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; + +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class UserDetailsServiceImpl implements UserDetailsService { + + private final UserRepository userRepository; + + @Override + public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { + Optional optionalUser = userRepository.findByUsername(s); + + if (optionalUser.isEmpty()) { + throw new UsernameNotFoundException("Пользователь не найден"); + } + + return optionalUser.get(); + } +} diff --git a/src/main/java/org/example/service/impl/UserServiceImpl.java b/src/main/java/org/example/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..31f387a --- /dev/null +++ b/src/main/java/org/example/service/impl/UserServiceImpl.java @@ -0,0 +1,46 @@ +package org.example.service.impl; + +import lombok.RequiredArgsConstructor; +import org.example.dto.UserDTO; +import org.example.entity.User; +import org.example.exception.UserNotFoundException; +import org.example.repository.CodeRepository; +import org.example.repository.UserRepository; +import org.example.service.UserService; +import org.example.util.UserMapper; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class UserServiceImpl implements UserService { + private final UserRepository userRepository; + private final CodeRepository codeRepository; + @Override + public UserDTO getUserByUsername(String username) { + Optional optionalUser = userRepository.findByUsername(username); + + if (optionalUser.isEmpty()) { + throw new UserNotFoundException("логина не существует или неверный"); + } + + return UserMapper.convertToDto(optionalUser.get()); + } + + @Override + public UserDTO getUserInfoByUsername(String username) { + return userRepository.findByUsername(username).map(UserMapper::convertToDto).orElseThrow(() -> new UserNotFoundException("логина не существует или неверный")); + } + + @Override + public UserDTO patchUserByUsername(String username) { + Optional optionalUser = userRepository.findByUsername(username); + + if (optionalUser.isEmpty()) { + throw new UserNotFoundException("логина не существует или неверный"); + } + return UserMapper.convertToDto(optionalUser.get()); + } + +} diff --git a/src/main/java/org/example/util/PassingMapper.java b/src/main/java/org/example/util/PassingMapper.java new file mode 100644 index 0000000..87187f0 --- /dev/null +++ b/src/main/java/org/example/util/PassingMapper.java @@ -0,0 +1,19 @@ +package org.example.util; + +import lombok.experimental.UtilityClass; +import org.example.dto.PassingDTO; +import org.example.entity.Passing; + +@UtilityClass +public class PassingMapper { + public PassingDTO convertToDto(Passing passing) { + PassingDTO dto = new PassingDTO(); + dto.setId(passing.getId()); + dto.setUsername(passing.getUsername()); + dto.setType(passing.getType()); + dto.setTime(passing.getTime()); + dto.setCode(passing.getCode()); + + return dto; + } +} diff --git a/src/main/java/org/example/util/UserMapper.java b/src/main/java/org/example/util/UserMapper.java new file mode 100644 index 0000000..6879670 --- /dev/null +++ b/src/main/java/org/example/util/UserMapper.java @@ -0,0 +1,20 @@ +package org.example.util; + +import lombok.experimental.UtilityClass; +import org.example.dto.UserDTO; +import org.example.entity.User; + +@UtilityClass +public class UserMapper { + public UserDTO convertToDto(User user) { + UserDTO dto = new UserDTO(); + dto.setId(user.getId()); + dto.setUsername(user.getUsername()); + dto.setName(user.getName()); + dto.setPhoto(user.getPhoto()); + dto.setPosition(user.getPosition()); +// dto.setLastVisit(user.getLastVisit()); + + return dto; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..5d7e403 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,22 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + + h2: + console: + enabled: true + + liquibase: + enabled: true + change-log: classpath:db.changelog/db.changelog-master.xml + + jpa: + generate-ddl: false + hibernate: + ddl-auto: none + show-sql: true + + spring-doc: + swagger-ui: + path: /swagger-ui.html + operationsSorter: method \ No newline at end of file diff --git a/src/main/resources/db.changelog/1.0/2025-02-18--0001-user.xml b/src/main/resources/db.changelog/1.0/2025-02-18--0001-user.xml new file mode 100644 index 0000000..fd8e99d --- /dev/null +++ b/src/main/resources/db.changelog/1.0/2025-02-18--0001-user.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/1.0/2025-02-18--0002-code.xml b/src/main/resources/db.changelog/1.0/2025-02-18--0002-code.xml new file mode 100644 index 0000000..ff89d4e --- /dev/null +++ b/src/main/resources/db.changelog/1.0/2025-02-18--0002-code.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/1.0/2025-02-19--0003-passing.xml b/src/main/resources/db.changelog/1.0/2025-02-19--0003-passing.xml new file mode 100644 index 0000000..ead0b36 --- /dev/null +++ b/src/main/resources/db.changelog/1.0/2025-02-19--0003-passing.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/1.0/2025-02-19--0006-position.xml b/src/main/resources/db.changelog/1.0/2025-02-19--0006-position.xml new file mode 100644 index 0000000..a63c451 --- /dev/null +++ b/src/main/resources/db.changelog/1.0/2025-02-19--0006-position.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/1.0/2025-02-19--0007-user-position.xml b/src/main/resources/db.changelog/1.0/2025-02-19--0007-user-position.xml new file mode 100644 index 0000000..99e9d40 --- /dev/null +++ b/src/main/resources/db.changelog/1.0/2025-02-19--0007-user-position.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/1.0/2025-02-19-0004-input-type.xml b/src/main/resources/db.changelog/1.0/2025-02-19-0004-input-type.xml new file mode 100644 index 0000000..b91a4bb --- /dev/null +++ b/src/main/resources/db.changelog/1.0/2025-02-19-0004-input-type.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/1.0/2025-02-19-0005-authority.xml b/src/main/resources/db.changelog/1.0/2025-02-19-0005-authority.xml new file mode 100644 index 0000000..f6bb2a5 --- /dev/null +++ b/src/main/resources/db.changelog/1.0/2025-02-19-0005-authority.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/1.0/2025-02-19-0008-user-authority.xml b/src/main/resources/db.changelog/1.0/2025-02-19-0008-user-authority.xml new file mode 100644 index 0000000..9908981 --- /dev/null +++ b/src/main/resources/db.changelog/1.0/2025-02-19-0008-user-authority.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/2025-02-18--0001-user-data.xml b/src/main/resources/db.changelog/data/2025-02-18--0001-user-data.xml new file mode 100644 index 0000000..2e4b636 --- /dev/null +++ b/src/main/resources/db.changelog/data/2025-02-18--0001-user-data.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/2025-02-18--0002-code-data.xml b/src/main/resources/db.changelog/data/2025-02-18--0002-code-data.xml new file mode 100644 index 0000000..e03fa63 --- /dev/null +++ b/src/main/resources/db.changelog/data/2025-02-18--0002-code-data.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/2025-02-19-0003-input-type-data.xml b/src/main/resources/db.changelog/data/2025-02-19-0003-input-type-data.xml new file mode 100644 index 0000000..ddcdce9 --- /dev/null +++ b/src/main/resources/db.changelog/data/2025-02-19-0003-input-type-data.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/2025-02-19-0004-passing-data.xml b/src/main/resources/db.changelog/data/2025-02-19-0004-passing-data.xml new file mode 100644 index 0000000..2cd43c5 --- /dev/null +++ b/src/main/resources/db.changelog/data/2025-02-19-0004-passing-data.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/2025-02-19-0005-authority-data.xml b/src/main/resources/db.changelog/data/2025-02-19-0005-authority-data.xml new file mode 100644 index 0000000..a92667e --- /dev/null +++ b/src/main/resources/db.changelog/data/2025-02-19-0005-authority-data.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/2025-02-19-0006-position-data.xml b/src/main/resources/db.changelog/data/2025-02-19-0006-position-data.xml new file mode 100644 index 0000000..270131b --- /dev/null +++ b/src/main/resources/db.changelog/data/2025-02-19-0006-position-data.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/2025-02-19-0007-user-position-data.xml b/src/main/resources/db.changelog/data/2025-02-19-0007-user-position-data.xml new file mode 100644 index 0000000..926e9ee --- /dev/null +++ b/src/main/resources/db.changelog/data/2025-02-19-0007-user-position-data.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/2025-02-19-0008-user-authority-data.xml b/src/main/resources/db.changelog/data/2025-02-19-0008-user-authority-data.xml new file mode 100644 index 0000000..32e14b2 --- /dev/null +++ b/src/main/resources/db.changelog/data/2025-02-19-0008-user-authority-data.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/csv/2025-02-18--0001-user-data.csv b/src/main/resources/db.changelog/data/csv/2025-02-18--0001-user-data.csv new file mode 100644 index 0000000..5d9f2d8 --- /dev/null +++ b/src/main/resources/db.changelog/data/csv/2025-02-18--0001-user-data.csv @@ -0,0 +1,5 @@ +username;password;name;photo;position;authorities;lastVisit +pivanov;$2a$10$eObqG4zk7CbKPPTv0daHm.bcpK6zwyFPpjAVXOeDWrT/3TpVcxpia;Иванов Петр Федорович;https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg;Разработчик;ROLE_ADMIN;2024-02-12T08:30:00 +ipetrov;$2a$10$eObqG4zk7CbKPPTv0daHm.bcpK6zwyFPpjAVXOeDWrT/3TpVcxpia;Петров Иван Константинович;https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg;Аналитик;ROLE_USER;2024-02-30T08:35:00 +asemenov;$2a$10$eObqG4zk7CbKPPTv0daHm.bcpK6zwyFPpjAVXOeDWrT/3TpVcxpia;Семенов Анатолий Анатольевич;https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg;Разработчик;ROLE_USER;2024-02-31T08:31:00 +afedorov;$2a$10$eObqG4zk7CbKPPTv0daHm.bcpK6zwyFPpjAVXOeDWrT/3TpVcxpia;Федоров Александр Сергеевич;https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg;Тестировщик;ROLE_USER;2024-02-30T08:36:00 \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/csv/2025-02-18--0002-code-data.csv b/src/main/resources/db.changelog/data/csv/2025-02-18--0002-code-data.csv new file mode 100644 index 0000000..2e139df --- /dev/null +++ b/src/main/resources/db.changelog/data/csv/2025-02-18--0002-code-data.csv @@ -0,0 +1,6 @@ +code +1234567890123456789 +9223372036854775807 +1122334455667788990 +998877665544332211 +5566778899001122334 \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/csv/2025-02-19--0003-input-type-data.csv b/src/main/resources/db.changelog/data/csv/2025-02-19--0003-input-type-data.csv new file mode 100644 index 0000000..58cdc50 --- /dev/null +++ b/src/main/resources/db.changelog/data/csv/2025-02-19--0003-input-type-data.csv @@ -0,0 +1,3 @@ +type +Карта +Вход через смартфон \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/csv/2025-02-19--0004-passing-data.csv b/src/main/resources/db.changelog/data/csv/2025-02-19--0004-passing-data.csv new file mode 100644 index 0000000..77bb0bb --- /dev/null +++ b/src/main/resources/db.changelog/data/csv/2025-02-19--0004-passing-data.csv @@ -0,0 +1,4 @@ +username;type;time;code +pivanov;Карта;12:00;1234567890123456789 +ipetrov;Вход со смартфона;13:00;9223372036854775807 +asemenov;Карта;10:00;1234567890123456789 \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/csv/2025-02-19--0005-authority-data.csv b/src/main/resources/db.changelog/data/csv/2025-02-19--0005-authority-data.csv new file mode 100644 index 0000000..47c9a14 --- /dev/null +++ b/src/main/resources/db.changelog/data/csv/2025-02-19--0005-authority-data.csv @@ -0,0 +1,3 @@ +role +ROLE_USER +ROLE_ADMIN \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/csv/2025-02-19--0006-position-data.csv b/src/main/resources/db.changelog/data/csv/2025-02-19--0006-position-data.csv new file mode 100644 index 0000000..e83c1a5 --- /dev/null +++ b/src/main/resources/db.changelog/data/csv/2025-02-19--0006-position-data.csv @@ -0,0 +1,4 @@ +position +Разработчик +Аналитик +Тестировщик \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/csv/2025-02-19--0007-user-position-data.csv b/src/main/resources/db.changelog/data/csv/2025-02-19--0007-user-position-data.csv new file mode 100644 index 0000000..224647a --- /dev/null +++ b/src/main/resources/db.changelog/data/csv/2025-02-19--0007-user-position-data.csv @@ -0,0 +1,5 @@ +userId;positionId +1;1 +2;2 +3;1 +4;3 \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/csv/2025-02-19-0008-user-authority-data.csv b/src/main/resources/db.changelog/data/csv/2025-02-19-0008-user-authority-data.csv new file mode 100644 index 0000000..cd0db24 --- /dev/null +++ b/src/main/resources/db.changelog/data/csv/2025-02-19-0008-user-authority-data.csv @@ -0,0 +1,5 @@ +userId;authorityId +1;1 +2;1 +3;1 +4;1 \ No newline at end of file diff --git a/src/main/resources/db.changelog/db.changelog-master.xml b/src/main/resources/db.changelog/db.changelog-master.xml new file mode 100644 index 0000000..3aa0d7a --- /dev/null +++ b/src/main/resources/db.changelog/db.changelog-master.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file