diff --git a/build.gradle b/build.gradle index 2384c39..1c60287 100644 --- a/build.gradle +++ b/build.gradle @@ -81,6 +81,11 @@ dependencies { //cache implementation("org.springframework.boot:spring-boot-starter-cache:4.0.6") implementation 'com.github.ben-manes.caffeine:caffeine' + + //security + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation("io.jsonwebtoken:jjwt:0.13.0") + } tasks.named('test') { diff --git a/src/main/java/ru/soune/nocopy/configuration/ApplicationConfig.java b/src/main/java/ru/soune/nocopy/configuration/ApplicationConfig.java index 6957907..76de3bf 100644 --- a/src/main/java/ru/soune/nocopy/configuration/ApplicationConfig.java +++ b/src/main/java/ru/soune/nocopy/configuration/ApplicationConfig.java @@ -26,10 +26,6 @@ import java.util.concurrent.TimeUnit; @EnableCaching public class ApplicationConfig { -// private final FileEntityRepository fileEntityRepository; - -// private final FileUtil fileUtil; - @Bean PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); @@ -46,9 +42,6 @@ public class ApplicationConfig { AudioFilePathProvider audioFilePathProvider, DocumentLocalSearch documentLocalSearch) { -// List initialFiles = loadProcessingFile(); - - //TODO инициализация файлов при создании return new com.vrt.NoCopyFileService( Collections.emptyList(), fileProvider, @@ -76,12 +69,5 @@ public class ApplicationConfig { return cacheManager; } -// private List loadProcessingFile() { -// List byProtectionStatus = -// fileEntityRepository.findByProtectionStatus(ProtectionStatus.PROCESSING); -// -// return byProtectionStatus.stream().map(fileEntity -> -// fileUtil.createFileInfo(fileEntity, null)).toList(); -// } } diff --git a/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java b/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java index 717960c..689ff21 100644 --- a/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java +++ b/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java @@ -9,14 +9,33 @@ import java.util.Map; @Configuration public class HandlerConfig { +/* +RegRequestHandler +LoginRequestHandler +FileUploadHandler +FileEntityHandler +ImageFoundRequestHandler +VerifyRegisterUserHandler +TariffHandler +ReferralHandler +ResetPasswordHandler +MonitoringHandler +GlobalSearchHandler +ComplaintEntityHandler +ViolationNotionHandler +NotificationHandler +TokenOperationHandler +DockViewFileHandler + */ +/* +Убрать +LogoutRequestHandler logoutHandler + */ @Bean public Map handlers( - RegRequestHandler reg, - LoginRequestHandler login, FileUploadHandler upload, FileEntityHandler file, - LogoutRequestHandler logoutHandler, ImageFoundRequestHandler imageFoundRequestHandler, VerifyRegisterUserHandler verifyRegisterUser, AuthRequestHandler authRequestHandler, @@ -42,11 +61,8 @@ public class HandlerConfig { DockViewFileHandler dockViewFileHandler ) { Map map = new HashMap<>(); - map.put(20001, login); - map.put(20002, reg); map.put(20004, upload); map.put(20005, file); - map.put(20006, logoutHandler); map.put(20007, imageFoundRequestHandler); map.put(20008, authRequestHandler); map.put(20009, verifyRegisterUser); @@ -125,4 +141,17 @@ public class HandlerConfig { return map; } + + @Bean + public Map authHandler( + RegRequestHandler reg, + LoginRequestHandler login + ) + { + Map map = new HashMap<>(); + map.put(20001, login); + map.put(20002, reg); + + return map; + } } diff --git a/src/main/java/ru/soune/nocopy/configuration/security/SecurityConfig.java b/src/main/java/ru/soune/nocopy/configuration/security/SecurityConfig.java new file mode 100644 index 0000000..9e269c2 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/configuration/security/SecurityConfig.java @@ -0,0 +1,38 @@ +package ru.soune.nocopy.configuration.security; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +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.AbstractHttpConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import ru.soune.nocopy.util.JwtAuthFilter; + +@Configuration +@EnableWebSecurity +@RequiredArgsConstructor +public class SecurityConfig { + + private final JwtAuthFilter jwtAuthFilter; + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http + .csrf(AbstractHttpConfigurer::disable) + .sessionManagement(session -> + session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .authorizeHttpRequests(auth -> auth + .requestMatchers("api/v{version}/files/public-download/**").permitAll() // логин, регистрация + .requestMatchers("/api/files/public/**").permitAll() + .requestMatchers("/api/auth/**").permitAll() + .requestMatchers("/api/file/link/**").permitAll() + .anyRequest().authenticated() + ) + .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class); + + return http.build(); + } +} \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index 1427d84..89c54a9 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -5,11 +5,10 @@ import com.vrt.fileprotection.FileProtector; import com.vrt.fileprotection.NoCopyCheckResult; import com.vrt.fileprotection.audio.AudioCheckResult; import com.vrt.fileprotection.documents.DocumentCheckResult; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; -import org.springframework.core.io.InputStreamResource; -import org.springframework.core.io.Resource; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; @@ -42,8 +41,6 @@ import ru.soune.nocopy.service.file.*; import ru.soune.nocopy.service.file.CheckCounterService; import ru.soune.nocopy.service.file.ProtectionsLimitService; import ru.soune.nocopy.service.file.cloud.CloudStorageService; -import ru.soune.nocopy.service.register.AuthService; -import ru.soune.nocopy.util.FileUtil; import software.amazon.awssdk.services.s3.model.NoSuchKeyException; import java.io.File; @@ -67,9 +64,9 @@ public class ApiController { private final Map internalControlHandler; - private final FileEntityService fileEntityService; + private final Map authHandler; - private final AuthService authService; + private final FileEntityService fileEntityService; private final FileSimilarityService fileSimilarityService; @@ -77,7 +74,7 @@ public class ApiController { private final NoCopyFileService noCopyFileService; - private final FileUtil fileUtil; + private final HttpServletRequest httpServletRequest; private final ProtectionsLimitService protectionsLimitService; @@ -134,6 +131,46 @@ public class ApiController { } } + @PostMapping("/auth") + public ResponseEntity handlePostRequest(@RequestBody BaseRequest request) { + Integer msgId = request.getMsgId(); + BaseResponse response; + + try { + RequestHandler handler = authHandler.get(msgId); + + if (handler == null) { + response = new BaseResponse(msgId, + MessageCode.MSG_ID_NOT_FOUND.getCode(), + MessageCode.MSG_ID_NOT_FOUND.getDescription(), + new HashMap<>()); + } else { + response = handler.handle(request); + } + + return ResponseEntity.ok().body(response); + } catch (ValidationException e) { + return createValidationErrorResponse(e.getBindingResult(), e.getMsgId()); + } catch (UserNotFoundException e) { + return ResponseEntity.ok().body(new BaseResponse(msgId, MessageCode.USER_NOT_FOUND.getCode(), + MessageCode.USER_NOT_FOUND.getDescription(), new HashMap<>())); + } catch (NotFoundAuthToken e) { + return ResponseEntity.ok().body(new BaseResponse(msgId, MessageCode.AUTH_TOKEN_NOT_FOUND.getCode(), + MessageCode.AUTH_TOKEN_NOT_FOUND.getDescription(), new HashMap<>())); + } catch (NotValidFieldException e) { + throw e; + } catch (Exception e) { + log.error("Handler execution failed for msgId: {}", msgId, e); + + BaseResponse errorResponse = new BaseResponse(msgId, + MessageCode.INVALID_JSON_BODY.getCode(), + MessageCode.INVALID_JSON_BODY.getDescription(), + new HashMap<>()); + + return ResponseEntity.ok().body(errorResponse); + } + } + @PostMapping("/internal/data-info") public ResponseEntity handleInternalInfoPostRequest(@RequestBody BaseRequest request) { Integer msgId = request.getMsgId(); @@ -276,8 +313,7 @@ public class ApiController { @RequestParam(value = "upload_id", required = false) String uploadId, @RequestParam(value = "chunk_number", required = false) Integer chunkNumber, @RequestParam(value = "chunk", required = false) MultipartFile chunk, - @RequestParam(value = "last_file", required = false) Boolean last_file, - @RequestParam(value = "token") String token) { + @RequestParam(value = "last_file", required = false) Boolean last_file) { try { if (chunk == null || chunk.isEmpty()) { return buildErrorResponse(uploadId, chunkNumber, "Chunk file null or empty"); @@ -289,7 +325,7 @@ public class ApiController { return buildErrorResponse(uploadId, chunkNumber, "Valid chunk number is required"); } - Long userId = authService.useUserAuthToken(token); + Long userId = (Long) httpServletRequest.getAttribute("userId"); UploadProgressResponse uploadProgressResponse = fileUploadService.uploadPassportChunk(uploadId, chunkNumber, chunk, userId); @@ -588,7 +624,7 @@ public class ApiController { errorData)); } - Long userId = authService.useUserAuthToken(tokenHeader); + Long userId = (Long) httpServletRequest.getAttribute("userId"); FileEntityResponse entityResponse = fileEntityService.getById(fileId, version); FileStatus status = entityResponse.getStatus(); @@ -676,8 +712,8 @@ public class ApiController { @PostMapping("/file/link") public ResponseEntity downloadFile(@RequestBody DocViewerRequest viewerRequest) { try { - String tokenHeader = viewerRequest.getToken(); - Long userId = tokenHeader == null ? 0L: authService.useUserAuthToken(tokenHeader); + Long userId = httpServletRequest.getAttribute("userId") == null ? 0L: + (Long) httpServletRequest.getAttribute("userId"); if (viewerRequest.getFileId() == null) { return ResponseEntity.ok().body(new BaseResponse(0, diff --git a/src/main/java/ru/soune/nocopy/controller/FileController.java b/src/main/java/ru/soune/nocopy/controller/FileController.java index 56830a0..bd9e6dc 100644 --- a/src/main/java/ru/soune/nocopy/controller/FileController.java +++ b/src/main/java/ru/soune/nocopy/controller/FileController.java @@ -1,6 +1,5 @@ package ru.soune.nocopy.controller; -import com.google.api.client.util.IOUtils; import com.google.common.io.ByteStreams; import com.vrt.NoCopyFileService; import com.vrt.fileprotection.FileProtector; @@ -19,8 +18,6 @@ import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.file.CheckCounterService; -import ru.soune.nocopy.service.file.FileStorageService; -import ru.soune.nocopy.service.file.ImageResizeService; import ru.soune.nocopy.service.file.ZipService; import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.util.FileUtil; @@ -30,26 +27,18 @@ import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - @RestController @RequestMapping("/api/files") @Slf4j @AllArgsConstructor public class FileController { - private FileStorageService fileStorageService; - private FileEntityRepository fileRepository; private CheckCounterService checkCounterService; private UserRepository userRepository; - private ImageResizeService imageResizeService; - private NoCopyFileService noCopyFileService; private FileUtil fileUtil; diff --git a/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java b/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java index a3d0922..f9e596a 100644 --- a/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java +++ b/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java @@ -1,5 +1,6 @@ package ru.soune.nocopy.controller; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -15,7 +16,6 @@ import ru.soune.nocopy.entity.search.GlobalSearchTask; import ru.soune.nocopy.entity.search.SearchStatus; import ru.soune.nocopy.exception.NotFoundAuthToken; import ru.soune.nocopy.repository.GlobalSearchTaskRepository; -import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.search.GlobalSearchService; import ru.soune.nocopy.service.violation.ViolationService; @@ -27,16 +27,14 @@ import java.util.*; @RequiredArgsConstructor public class GlobalSearchController { - private final AuthService authService; - private final GlobalSearchService globalSearchService; - private final GlobalSearchTaskRepository globalSearchTaskRepository; - private final GlobalSearchTaskRepository searchTaskRepository; private final ViolationService violationService; + private final HttpServletRequest httpServletRequest; + @PostMapping("/start") public ResponseEntity startSearch( @RequestBody GlobalSearchStartRequest request, @@ -51,7 +49,7 @@ public class GlobalSearchController { GlobalSearchStartResponse response = new GlobalSearchStartResponse(); try { - Long userId = authService.useUserAuthToken(tokenHeader); + Long userId = (Long) httpServletRequest.getAttribute("userId"); List filesToProcess = globalSearchService.getFilesToProcess(request, userId); @@ -85,7 +83,7 @@ public class GlobalSearchController { Optional taskOptional; try { - Long userId = authService.useUserAuthToken(tokenHeader); + Long userId = (Long) httpServletRequest.getAttribute("userId"); taskOptional = searchTaskRepository.findByUserIdAndStatus(userId, "PROCESSING"); @@ -114,7 +112,7 @@ public class GlobalSearchController { List fileViolationsSummary; try { - Long userId = authService.useUserAuthToken(tokenHeader); + Long userId = (Long) httpServletRequest.getAttribute("userId"); fileViolationsSummary = violationService.getFileViolationsSummary(userId); @@ -132,26 +130,12 @@ public class GlobalSearchController { @PostMapping("/violation-summary-with-files") public ResponseEntity getViolations(@RequestBody ViolationRequest request) { - if (request.getToken() == null || request.getToken().isBlank()) { - Map errorData = new HashMap<>(); - errorData.put("token", request.getToken()); - return ResponseEntity.ok().body(Map.of("error", errorData)); - } + Long userId = (Long) httpServletRequest.getAttribute("userId"); + Page result = violationService.getFileViolationsSummary( + userId, request.getFileName(), request.getSortDirection(), + request.getPage(), request.getSize(), request.getStartDate(), request.getEndDate()); - try { - Long userId = authService.useUserAuthToken(request.getToken()); - - Page result = violationService.getFileViolationsSummary( - userId, request.getFileName(), request.getSortDirection(), - request.getPage(), request.getSize(), request.getStartDate(), request.getEndDate()); - - return ResponseEntity.ok(result); - } catch (NotFoundAuthToken e) { - Map errorData = new HashMap<>(); - errorData.put("token", request.getToken()); - - return ResponseEntity.ok().body(Map.of("error", errorData)); - } + return ResponseEntity.ok(result); } @GetMapping("/status/{taskId}") @@ -167,7 +151,7 @@ public class GlobalSearchController { GlobalSearchStatusResponse response; try { - Long userId = authService.useUserAuthToken(tokenHeader); + Long userId = (Long) httpServletRequest.getAttribute("userId"); Optional taskOptional = searchTaskRepository.findByTaskIdAndUserId(taskId, userId); diff --git a/src/main/java/ru/soune/nocopy/controller/PaymentController.java b/src/main/java/ru/soune/nocopy/controller/PaymentController.java index 8450452..e3f2f33 100644 --- a/src/main/java/ru/soune/nocopy/controller/PaymentController.java +++ b/src/main/java/ru/soune/nocopy/controller/PaymentController.java @@ -1,17 +1,16 @@ package ru.soune.nocopy.controller; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import ru.soune.nocopy.dto.search.GlobalSearchStartResponse; import ru.soune.nocopy.entity.payment.Payment; import ru.soune.nocopy.exception.PaymentNotFoundException; import ru.soune.nocopy.exception.TariffNotFoundException; import ru.soune.nocopy.exception.UserNotFoundException; import ru.soune.nocopy.service.payment.PaymentService; -import ru.soune.nocopy.service.register.AuthService; import java.util.HashMap; import java.util.Map; @@ -24,7 +23,7 @@ public class PaymentController { private final PaymentService paymentService; - private final AuthService authService; + private final HttpServletRequest httpServletRequest; @PostMapping("/create") public ResponseEntity createPayment(@RequestParam String email, @RequestParam Long tariffId, @@ -69,7 +68,9 @@ public class PaymentController { return ResponseEntity.ok().body(Map.of("error", errorData)); } - paymentService.changeAutoRenewal(authService.useUserAuthToken(tokenHeader), renewal); + Long userId = (Long) httpServletRequest.getAttribute("userId"); + + paymentService.changeAutoRenewal(userId, renewal); return ResponseEntity.ok(Map.of("message", "Auto-renewal changed:" + renewal)); } catch (UserNotFoundException e) { return ResponseEntity.status(HttpStatus.NOT_FOUND) @@ -88,7 +89,9 @@ public class PaymentController { return ResponseEntity.ok().body(Map.of("error", errorData)); } - paymentService.deletePaymentMethod(authService.useUserAuthToken(tokenHeader), paymentMethodId); + Long userId = (Long) httpServletRequest.getAttribute("userId"); + + paymentService.deletePaymentMethod(userId, paymentMethodId); return ResponseEntity.ok(Map.of("message", "Payment method deleted")); } catch (UserNotFoundException e) { return ResponseEntity.status(HttpStatus.NOT_FOUND) @@ -109,8 +112,9 @@ public class PaymentController { return ResponseEntity.ok().body(Map.of("error", errorData)); } - return ResponseEntity.ok(paymentService.getUserPaymentMethods( - authService.useUserAuthToken(tokenHeader))); + Long userId = (Long) httpServletRequest.getAttribute("userId"); + + return ResponseEntity.ok(paymentService.getUserPaymentMethods(userId)); } catch (UserNotFoundException e) { return ResponseEntity.status(HttpStatus.NOT_FOUND) .body(Map.of("error", e.getMessage())); diff --git a/src/main/java/ru/soune/nocopy/controller/UserController.java b/src/main/java/ru/soune/nocopy/controller/UserController.java index 2725b99..809ac3d 100644 --- a/src/main/java/ru/soune/nocopy/controller/UserController.java +++ b/src/main/java/ru/soune/nocopy/controller/UserController.java @@ -1,5 +1,6 @@ package ru.soune.nocopy.controller; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.crypto.password.PasswordEncoder; @@ -14,23 +15,19 @@ import ru.soune.nocopy.dto.user.UserDTO; import ru.soune.nocopy.dto.user.UserRequest; import ru.soune.nocopy.entity.tarif.Tariff; import ru.soune.nocopy.entity.tarif.TariffInfo; -import ru.soune.nocopy.entity.user.AuthToken; import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.exception.InvalidUserEmail; -import ru.soune.nocopy.exception.NotFoundAuthToken; import ru.soune.nocopy.exception.NotValidFieldException; +import ru.soune.nocopy.exception.UserNotFoundException; import ru.soune.nocopy.mapper.UserMapper; -import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.file.FileStatsService; -import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.tariff.TariffService; import ru.soune.nocopy.service.user.UserService; +import ru.soune.nocopy.util.JwtUtil; import java.util.Arrays; -import java.util.List; import java.util.Map; -import java.util.Optional; @RestController @RequestMapping("v1/api/user") @@ -41,88 +38,79 @@ public class UserController { private final UserService userService; - private final AuthTokenRepository authTokenRepository; - private final UserMapper userMapper; private final PasswordEncoder passwordEncoder; - private final AuthService authService; - private final TariffService tariffService; private final FileStatsService fileStatsService; + private final JwtUtil jwtUtil; + + private final HttpServletRequest httpServletRequest; + @GetMapping - public ResponseEntity getUser(@RequestParam("email") String email, - @RequestHeader("Authorization") String tokenHeader) { - String token = tokenHeader.replace("Bearer ", ""); + public ResponseEntity getUser(@RequestParam("email") String email) { + User user = userRepository.findByEmail(email); - Optional tokenOptional = authTokenRepository.findByToken(token); + if (user != null) { + UserDTO userDTO = userMapper.toDTO(user); + userDTO.setEmail(email); + userDTO.setFullName(user.getFullName()); + userDTO.setVerifiedStatus(user.getVerificationStatus()); - if (tokenOptional.isPresent()) { - User user = userRepository.findByEmail(email); - - if (user != null) { - UserDTO userDTO = userMapper.toDTO(user); - userDTO.setEmail(email); - userDTO.setFullName(user.getFullName()); - userDTO.setVerifiedStatus(user.getVerificationStatus()); - - if (user.getCompany() != null) { - userDTO.setCompany(user.getCompany().getCompanyName()); - } - - if (user.canManageCompanySettings() || user.canLogin() && user.getCompany() == null) { - userDTO.setTariffs(tariffService.getTariffByAccountType(user)); - - Long fileOnDisk = user.canManageCompanySettings() ? - fileStatsService.calculateCompanyFileSize(user.getId()): - fileStatsService.calculateUserFileSize(user.getId()); - - Integer filesCount = user.canManageCompanySettings() ? - fileStatsService.filesCompanyCount(user.getId()): - fileStatsService.filesUserCount(user.getId()); - - TariffInfo personalTariffInfo; - - if (user.getCompany() == null) { - personalTariffInfo = user.getPersonalTariffInfo(); - } else { - personalTariffInfo = user.getCompany().getTariffInfo(); - } - - Tariff tariff = personalTariffInfo.getTariff(); - - TariffInfoDTO infoDTO = TariffInfoDTO.builder().tokens(personalTariffInfo.getTokens()) - .id(personalTariffInfo.getId()) - .tariffName(tariff.getName()) - .status(personalTariffInfo.getStatus().name()) - .tariffId(tariff.getId()) - .currentFileCounts(filesCount) - .maxFileCounts(tariff.getMaxFilesCount()) - .currentFileOnDisk(fileOnDisk) - .maxFileOnDisk(tariff.getDiskSize()) - .startTariff(personalTariffInfo.getStartTariff()) - .endTariff(personalTariffInfo.getEndTariff()) - .tokens(personalTariffInfo.getTokens() + personalTariffInfo.getBoughtTokens()) - .build(); - - userDTO.setTariffInfo(infoDTO); - } - - userDTO.setPhone(user.getPhone()); - userDTO.setGenderType(user.getGenderType()); - userDTO.setBirthday(user.getBirthday()); - userDTO.setCreatedAt(user.getCreatedAt()); - userDTO.setActive(user.isActive()); - userDTO.setPermission(user.getUserPermissions()); - - return ResponseEntity.ok(userDTO); + if (user.getCompany() != null) { + userDTO.setCompany(user.getCompany().getCompanyName()); } - } else { - return ResponseEntity.notFound().build(); + + if (user.canManageCompanySettings() || user.canLogin() && user.getCompany() == null) { + userDTO.setTariffs(tariffService.getTariffByAccountType(user)); + + Long fileOnDisk = user.canManageCompanySettings() ? + fileStatsService.calculateCompanyFileSize(user.getId()): + fileStatsService.calculateUserFileSize(user.getId()); + + Integer filesCount = user.canManageCompanySettings() ? + fileStatsService.filesCompanyCount(user.getId()): + fileStatsService.filesUserCount(user.getId()); + + TariffInfo personalTariffInfo; + + if (user.getCompany() == null) { + personalTariffInfo = user.getPersonalTariffInfo(); + } else { + personalTariffInfo = user.getCompany().getTariffInfo(); + } + + Tariff tariff = personalTariffInfo.getTariff(); + + TariffInfoDTO infoDTO = TariffInfoDTO.builder().tokens(personalTariffInfo.getTokens()) + .id(personalTariffInfo.getId()) + .tariffName(tariff.getName()) + .status(personalTariffInfo.getStatus().name()) + .tariffId(tariff.getId()) + .currentFileCounts(filesCount) + .maxFileCounts(tariff.getMaxFilesCount()) + .currentFileOnDisk(fileOnDisk) + .maxFileOnDisk(tariff.getDiskSize()) + .startTariff(personalTariffInfo.getStartTariff()) + .endTariff(personalTariffInfo.getEndTariff()) + .tokens(personalTariffInfo.getTokens() + personalTariffInfo.getBoughtTokens()) + .build(); + + userDTO.setTariffInfo(infoDTO); + } + + userDTO.setPhone(user.getPhone()); + userDTO.setGenderType(user.getGenderType()); + userDTO.setBirthday(user.getBirthday()); + userDTO.setCreatedAt(user.getCreatedAt()); + userDTO.setActive(user.isActive()); + userDTO.setPermission(user.getUserPermissions()); + + return ResponseEntity.ok(userDTO); } return ResponseEntity.notFound().build(); @@ -130,15 +118,13 @@ public class UserController { //TODO fix mapper,doesnot exist all fields @PostMapping("/change-password") - public ResponseEntity updateUser(@RequestBody ChangePasswordRequest changePasswordRequest, - @RequestHeader("Authorization") String tokenHeader) { - String token = tokenHeader.replace("Bearer ", ""); + public ResponseEntity updateUser(@RequestBody ChangePasswordRequest changePasswordRequest) { + Long userId = (Long) httpServletRequest.getAttribute("userId"); + User user = userService.getUserById(userId).orElse(null); - Optional tokenOptional = authTokenRepository.findByToken(token); - - AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); - - User user = authToken.getUser(); + if (user == null) { + throw new UserNotFoundException("User not found by id: " + userId); + } if (!changePasswordRequest.getEmail().equals(user.getEmail())) { throw new InvalidUserEmail("Email is not valid: " + changePasswordRequest.getEmail() + "not found"); @@ -150,21 +136,19 @@ public class UserController { } @PatchMapping("/user-update") - public ResponseEntity updateUser(@RequestBody UserRequest userRequest, - @RequestHeader("Authorization") String tokenHeader) { - String token = tokenHeader.replace("Bearer ", ""); + public ResponseEntity updateUser(@RequestBody UserRequest userRequest) { + Long userId = (Long) httpServletRequest.getAttribute("userId"); + User user = userService.getUserById(userId).orElse(null); - Optional tokenOptional = authTokenRepository.findByToken(token); - - AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); - - User user = authToken.getUser(); + if (user == null) { + throw new UserNotFoundException("User not found by id: " + userId); + } return ResponseEntity.ok(userService.updateUser(userRequest, user)); } @PostMapping("/create-user") - public ResponseEntity addUser(@RequestBody RegRequest registerRequest) { + public ResponseEntity addUser(@RequestBody RegRequest registerRequest) { if (userRepository.existsByEmail(registerRequest.getEmail()) || userRepository.existsByPhone(registerRequest.getPhone())) { @@ -191,11 +175,11 @@ public class UserController { User savedUser = userRepository.save(user); - AuthToken authToken = authService.generateAuthToken(savedUser); + String authToken = jwtUtil.generateToken(savedUser.getId(), savedUser.getEmail()); - authTokenRepository.save(authToken); - - return ResponseEntity.ok().body(savedUser); + return ResponseEntity.ok().body(Map.of( + "user", savedUser, + "token", authToken)); } @DeleteMapping("/delete-user/{userId}") diff --git a/src/main/java/ru/soune/nocopy/dto/MessageCode.java b/src/main/java/ru/soune/nocopy/dto/MessageCode.java index fc86dee..156f6f2 100644 --- a/src/main/java/ru/soune/nocopy/dto/MessageCode.java +++ b/src/main/java/ru/soune/nocopy/dto/MessageCode.java @@ -22,6 +22,7 @@ public enum MessageCode { USER_NOT_VERIFIED(2, "User not verified"), LAW_CASE_NOT_FOUND(4, "Law case not found"), PERMISSION_NOT_FOUND(2, "Permission not found"), + INVALID_CREDENTIALS(2, "Invalid credentials"), USER_NOT_FOUND(2, "User not found"), LAW_CASE_ALREADY_EXIST(2, "Law case already exists"), COMPLAINT_ALREADY_EXIST(2, "Complaint already exists"), diff --git a/src/main/java/ru/soune/nocopy/dto/TokenProcessRequest.java b/src/main/java/ru/soune/nocopy/dto/TokenProcessRequest.java index 646f9c6..313f0ed 100644 --- a/src/main/java/ru/soune/nocopy/dto/TokenProcessRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/TokenProcessRequest.java @@ -6,6 +6,4 @@ import lombok.Data; @Data public class TokenProcessRequest { - @JsonProperty("token") - private String token; } diff --git a/src/main/java/ru/soune/nocopy/dto/complaint/ComplaintRequest.java b/src/main/java/ru/soune/nocopy/dto/complaint/ComplaintRequest.java index 899538a..0de3cce 100644 --- a/src/main/java/ru/soune/nocopy/dto/complaint/ComplaintRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/complaint/ComplaintRequest.java @@ -35,7 +35,4 @@ public class ComplaintRequest { @JsonProperty("sort_direction") private String sortDirection; - - @JsonProperty("token") - private String token; } diff --git a/src/main/java/ru/soune/nocopy/dto/complaint/LawCaseRequest.java b/src/main/java/ru/soune/nocopy/dto/complaint/LawCaseRequest.java index f8830f9..90d12c2 100644 --- a/src/main/java/ru/soune/nocopy/dto/complaint/LawCaseRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/complaint/LawCaseRequest.java @@ -18,7 +18,6 @@ public class LawCaseRequest { private String priority = LawCasePriority.HIGH.toString(); private String type; private String lawyer; - private String token; private Integer pageSize = 5; private Integer pageNumber = 0; private String sortBy = "updatedAt"; diff --git a/src/main/java/ru/soune/nocopy/dto/cost/CostRequest.java b/src/main/java/ru/soune/nocopy/dto/cost/CostRequest.java index 66a3b17..c4ea511 100644 --- a/src/main/java/ru/soune/nocopy/dto/cost/CostRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/cost/CostRequest.java @@ -12,7 +12,4 @@ public class CostRequest { @JsonProperty("count_files") Integer countFilesForProtect; - - @JsonProperty("auth_token") - String authToken; } diff --git a/src/main/java/ru/soune/nocopy/dto/docviewer/DocViewerRequest.java b/src/main/java/ru/soune/nocopy/dto/docviewer/DocViewerRequest.java index 3da93eb..5bb5a52 100644 --- a/src/main/java/ru/soune/nocopy/dto/docviewer/DocViewerRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/docviewer/DocViewerRequest.java @@ -10,9 +10,6 @@ public class DocViewerRequest { @JsonProperty("file_id") private String fileId; - @JsonProperty("token") - private String token; - @JsonProperty("ip") private String ip; diff --git a/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java b/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java index 7231e63..c47339a 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java @@ -40,9 +40,6 @@ public class FileEntityRequest { @JsonProperty("page_size") private Integer pageSize; - @JsonProperty("token") - private String token; - @JsonProperty("sort_by") private String sortBy; diff --git a/src/main/java/ru/soune/nocopy/dto/file/FileUploadRequest.java b/src/main/java/ru/soune/nocopy/dto/file/FileUploadRequest.java index 030ef24..19cf2e8 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/FileUploadRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/file/FileUploadRequest.java @@ -26,9 +26,6 @@ public class FileUploadRequest { @JsonProperty("action") private String action; - @JsonProperty("token") - private String token; - @JsonProperty("convertTo") private String convertTo; } diff --git a/src/main/java/ru/soune/nocopy/dto/monitoring/SetMonitoringRequest.java b/src/main/java/ru/soune/nocopy/dto/monitoring/SetMonitoringRequest.java index bf49b47..49de303 100644 --- a/src/main/java/ru/soune/nocopy/dto/monitoring/SetMonitoringRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/monitoring/SetMonitoringRequest.java @@ -14,7 +14,4 @@ public class SetMonitoringRequest { @JsonProperty("monitoring_type") private String monitoringType; - - @JsonProperty("auth_token") - private String authToken; } diff --git a/src/main/java/ru/soune/nocopy/dto/notification/ActivateNotificationRequest.java b/src/main/java/ru/soune/nocopy/dto/notification/ActivateNotificationRequest.java index 45d0da0..a202827 100644 --- a/src/main/java/ru/soune/nocopy/dto/notification/ActivateNotificationRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/notification/ActivateNotificationRequest.java @@ -4,5 +4,4 @@ import lombok.Data; @Data public class ActivateNotificationRequest { - private String authToken; } diff --git a/src/main/java/ru/soune/nocopy/dto/notification/MarkAsReadRequest.java b/src/main/java/ru/soune/nocopy/dto/notification/MarkAsReadRequest.java index e3a6dd9..77131a8 100644 --- a/src/main/java/ru/soune/nocopy/dto/notification/MarkAsReadRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/notification/MarkAsReadRequest.java @@ -7,5 +7,4 @@ import java.util.List; @Data public class MarkAsReadRequest { private List notificationIds; - private String authToken; } diff --git a/src/main/java/ru/soune/nocopy/dto/notification/NotificationListRequest.java b/src/main/java/ru/soune/nocopy/dto/notification/NotificationListRequest.java index 106afcc..eb65929 100644 --- a/src/main/java/ru/soune/nocopy/dto/notification/NotificationListRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/notification/NotificationListRequest.java @@ -14,5 +14,4 @@ public class NotificationListRequest { private String sortDirection = "DESC"; private List types; private List statuses; - private String authToken; } diff --git a/src/main/java/ru/soune/nocopy/dto/referral/ReferralRequest.java b/src/main/java/ru/soune/nocopy/dto/referral/ReferralRequest.java index d22a4f9..49275a1 100644 --- a/src/main/java/ru/soune/nocopy/dto/referral/ReferralRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/referral/ReferralRequest.java @@ -10,7 +10,6 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @Builder public class ReferralRequest { - private String token; private Integer amount; private Integer pageSize; private Integer pageNumber; diff --git a/src/main/java/ru/soune/nocopy/dto/search/GlobalSearchStatisticsRequest.java b/src/main/java/ru/soune/nocopy/dto/search/GlobalSearchStatisticsRequest.java index ba11c41..8313ccd 100644 --- a/src/main/java/ru/soune/nocopy/dto/search/GlobalSearchStatisticsRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/search/GlobalSearchStatisticsRequest.java @@ -6,9 +6,6 @@ import lombok.Data; @Data public class GlobalSearchStatisticsRequest { - @JsonProperty("token") - private String token; - @JsonProperty("limit") private Integer limit = 10; diff --git a/src/main/java/ru/soune/nocopy/dto/statistic/MonitoringStatisticRequest.java b/src/main/java/ru/soune/nocopy/dto/statistic/MonitoringStatisticRequest.java index 68b70e0..ab5b5fa 100644 --- a/src/main/java/ru/soune/nocopy/dto/statistic/MonitoringStatisticRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/statistic/MonitoringStatisticRequest.java @@ -4,5 +4,4 @@ import lombok.Data; @Data public class MonitoringStatisticRequest { - private String authToken; } diff --git a/src/main/java/ru/soune/nocopy/dto/tokenoperation/TokenOperationRequest.java b/src/main/java/ru/soune/nocopy/dto/tokenoperation/TokenOperationRequest.java index 1d3d993..47245d3 100644 --- a/src/main/java/ru/soune/nocopy/dto/tokenoperation/TokenOperationRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/tokenoperation/TokenOperationRequest.java @@ -11,9 +11,6 @@ public class TokenOperationRequest { @JsonProperty("action") private String action; - @JsonProperty("token") - private String token; - @JsonProperty("operation_id") private Long operationId; diff --git a/src/main/java/ru/soune/nocopy/dto/violation/ViolationNotionRequest.java b/src/main/java/ru/soune/nocopy/dto/violation/ViolationNotionRequest.java index bc39acd..77d6067 100644 --- a/src/main/java/ru/soune/nocopy/dto/violation/ViolationNotionRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/violation/ViolationNotionRequest.java @@ -5,8 +5,6 @@ import lombok.Data; @Data public class ViolationNotionRequest { - @JsonProperty("token") - private String token; @JsonProperty("action") private String action; diff --git a/src/main/java/ru/soune/nocopy/dto/violation/ViolationRequest.java b/src/main/java/ru/soune/nocopy/dto/violation/ViolationRequest.java index 4dd51db..6b9322f 100644 --- a/src/main/java/ru/soune/nocopy/dto/violation/ViolationRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/violation/ViolationRequest.java @@ -25,9 +25,6 @@ public class ViolationRequest { @JsonProperty("action") private String action; - @JsonProperty("token") - private String token; - @JsonProperty("file_name") private String fileName = null; diff --git a/src/main/java/ru/soune/nocopy/dto/violation/ViolationStatisticsRequest.java b/src/main/java/ru/soune/nocopy/dto/violation/ViolationStatisticsRequest.java index 04cbac6..c7be612 100644 --- a/src/main/java/ru/soune/nocopy/dto/violation/ViolationStatisticsRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/violation/ViolationStatisticsRequest.java @@ -6,9 +6,6 @@ import lombok.Data; @Data public class ViolationStatisticsRequest { - @JsonProperty("token") - private String token; - @JsonProperty("file_id") private String fileId; diff --git a/src/main/java/ru/soune/nocopy/handler/AuthRequestHandler.java b/src/main/java/ru/soune/nocopy/handler/AuthRequestHandler.java index aca3926..a8a0820 100644 --- a/src/main/java/ru/soune/nocopy/handler/AuthRequestHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/AuthRequestHandler.java @@ -1,15 +1,14 @@ package ru.soune.nocopy.handler; -import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import ru.soune.nocopy.dto.BaseRequest; import ru.soune.nocopy.dto.BaseResponse; import ru.soune.nocopy.dto.MessageCode; -import ru.soune.nocopy.dto.TokenProcessRequest; import ru.soune.nocopy.exception.NotFoundAuthToken; -import ru.soune.nocopy.service.register.AuthService; +import ru.soune.nocopy.util.JwtUtil; import java.util.Map; @@ -18,20 +17,19 @@ import java.util.Map; @RequiredArgsConstructor public class AuthRequestHandler implements RequestHandler { - private final ObjectMapper objectMapper; + private final HttpServletRequest httpServletRequest; - private final AuthService authService; + private final JwtUtil jwtUtil; @Override public BaseResponse handle(BaseRequest request) throws NotFoundAuthToken { - TokenProcessRequest tokenProcessRequest = objectMapper.convertValue(request.getMessageBody(), - TokenProcessRequest.class); - - authService.useUserAuthToken(tokenProcessRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); + String email = (String) httpServletRequest.getAttribute("email"); + String token = jwtUtil.generateToken(userId, email); return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), "Token processed successfully", - Map.of("token", tokenProcessRequest.getToken())); + Map.of("token", token)); } } diff --git a/src/main/java/ru/soune/nocopy/handler/ComplaintEntityHandler.java b/src/main/java/ru/soune/nocopy/handler/ComplaintEntityHandler.java index da189cd..f87ebd7 100644 --- a/src/main/java/ru/soune/nocopy/handler/ComplaintEntityHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ComplaintEntityHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; @@ -21,7 +22,6 @@ import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.repository.ViolationRepository; import ru.soune.nocopy.service.complaint.ComplaintEntityService; -import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.user.UserService; import ru.soune.nocopy.service.violation.ViolationStatus; @@ -39,21 +39,20 @@ public class ComplaintEntityHandler implements RequestHandler { private final UserService userService; - private final AuthService authService; - private final FileEntityRepository fileEntityRepository; private final ComplaintEntityRepository complaintEntityRepository; private final ViolationRepository violationRepository; + private final HttpServletRequest httpServletRequest; + @Override public BaseResponse handle(BaseRequest request) throws Exception { Integer msgId = request.getMsgId(); ComplaintRequest complaintRequest = objectMapper.convertValue(request.getMessageBody(), ComplaintRequest.class); String action = complaintRequest.getAction() == null ? "" : complaintRequest.getAction(); - String token = complaintRequest.getToken(); - Long userId = authService.useUserAuthToken(token); + Long userId = (Long) httpServletRequest.getAttribute("userId"); User user = userRepository.findById(userId).orElse(null); if (user == null) { @@ -61,7 +60,7 @@ public class ComplaintEntityHandler implements RequestHandler { request.getMsgId(), MessageCode.USER_NOT_FOUND.getCode(), MessageCode.USER_NOT_FOUND.getDescription(), - Map.of("token: ", token)); + Map.of("userId: ", userId)); } List emails = user.getCompany() == null ? List.of(user.getEmail()): diff --git a/src/main/java/ru/soune/nocopy/handler/CostHandler.java b/src/main/java/ru/soune/nocopy/handler/CostHandler.java index 80234c6..a506afa 100644 --- a/src/main/java/ru/soune/nocopy/handler/CostHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/CostHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -9,12 +10,11 @@ import ru.soune.nocopy.dto.BaseResponse; import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.cost.CostRequest; import ru.soune.nocopy.dto.cost.CostResponse; -import ru.soune.nocopy.entity.user.AuthToken; import ru.soune.nocopy.entity.user.User; -import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.service.cost.CostService; +import ru.soune.nocopy.service.user.UserService; -import java.util.Optional; +import java.util.Map; @Slf4j @Component @@ -23,10 +23,12 @@ public class CostHandler implements RequestHandler { private final CostService costService; - private final AuthTokenRepository authTokenRepository; + private final HttpServletRequest httpServletRequest; private final ObjectMapper objectMapper; + private final UserService userService; + private final Integer MAX_FILES_FOR_CHECK = 1000; @Override @@ -64,18 +66,17 @@ public class CostHandler implements RequestHandler { } private BaseResponse handleCheckTokensForFilesProtect(CostRequest costRequest, BaseRequest request) { - String authToken = costRequest.getAuthToken(); - Optional token = authTokenRepository.findByToken(authToken); + Long userId = (Long) httpServletRequest.getAttribute("userId"); + User user = userService.getUserById(userId).orElse(null); - if (token.isEmpty()) { - return new BaseResponse( + if (user == null) { + return new BaseResponse( request.getMsgId(), - MessageCode.AUTH_TOKEN_NOT_FOUND.getCode(), - MessageCode.AUTH_TOKEN_NOT_FOUND.getDescription(), - null); + MessageCode.USER_NOT_FOUND.getCode(), + MessageCode.USER_NOT_FOUND.getDescription(), + Map.of("User: ", userId)); } - User user = token.get().getUser(); Integer tokens = user.getActiveTariffInfo().getTokens(); int cost = costService.protectFileCost(costRequest.getFileType()); diff --git a/src/main/java/ru/soune/nocopy/handler/DockViewFileHandler.java b/src/main/java/ru/soune/nocopy/handler/DockViewFileHandler.java index ffd695d..8f0ddce 100644 --- a/src/main/java/ru/soune/nocopy/handler/DockViewFileHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/DockViewFileHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -14,7 +15,6 @@ import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.exception.NotFoundAuthToken; import ru.soune.nocopy.service.dockview.DockViewService; import ru.soune.nocopy.service.file.FileEntityService; -import ru.soune.nocopy.service.register.AuthService; import java.util.Arrays; import java.util.List; @@ -28,10 +28,10 @@ public class DockViewFileHandler implements RequestHandler { private final FileEntityService fileEntityService; - private final AuthService authService; - private final ObjectMapper objectMapper; + private final HttpServletRequest httpServletRequest; + @Override public BaseResponse handle(BaseRequest request) throws Exception { DocViewerRequest docViewerRequest = objectMapper.convertValue(request.getMessageBody(), DocViewerRequest.class); @@ -55,7 +55,7 @@ public class DockViewFileHandler implements RequestHandler { private BaseResponse handleGetHistory(BaseRequest request, DocViewerRequest docViewerRequest) { try { - Long userId = authService.useUserAuthToken(docViewerRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); List fileIds = fileEntityService.getAllUserFiles(userId) .stream() .filter(fileEntity -> fileEntity.getMimeType().equals("document")) @@ -94,7 +94,7 @@ public class DockViewFileHandler implements RequestHandler { private BaseResponse handleGetViewStats(BaseRequest request, DocViewerRequest docViewerRequest) { try { - Long userId = authService.useUserAuthToken(docViewerRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); List fileIds = fileEntityService.getAllUserFiles(userId) .stream() .filter(fileEntity -> fileEntity.getMimeType().equals("document")) diff --git a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java index 265a43b..207e4c8 100644 --- a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java @@ -1,12 +1,10 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import ru.soune.nocopy.dto.*; @@ -14,13 +12,11 @@ import ru.soune.nocopy.dto.file.*; import ru.soune.nocopy.entity.file.*; import ru.soune.nocopy.entity.file.moderation.ModerationLog; import ru.soune.nocopy.entity.file.permission.PermissionType; -import ru.soune.nocopy.entity.monitoring.FileMonitoringEntity; import ru.soune.nocopy.exception.*; import ru.soune.nocopy.repository.*; import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.service.file.moderation.ModerationService; import ru.soune.nocopy.service.file.permission.FileAccessService; -import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileStatsService; @@ -39,8 +35,6 @@ public class FileEntityHandler implements RequestHandler { private final FileEntityService fileEntityService; - private final AuthService authService; - private final FileStatsService fileStatsService; private final ObjectMapper objectMapper; @@ -61,6 +55,8 @@ public class FileEntityHandler implements RequestHandler { private final FileAccessService fileAccessService; + private final HttpServletRequest httpServletRequest; + @Override public BaseResponse handle(BaseRequest request) { try { @@ -118,7 +114,7 @@ public class FileEntityHandler implements RequestHandler { } private BaseResponse handleGetFilesUserInfo(BaseRequest request, FileEntityRequest fileRequest) { - Long userId = authService.useUserAuthToken(fileRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); FileInfoUserResponse userFileStats = fileStatsService.getUserFileStats(userId); return new BaseResponse(request.getMsgId(), @@ -129,7 +125,7 @@ public class FileEntityHandler implements RequestHandler { private BaseResponse handleGetFileInfo(BaseRequest request, FileEntityRequest fileRequest) { try { - Long userId = authService.useUserAuthToken(fileRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); FileEntityResponse fileInfo = fileEntityService.getById(fileRequest.getFileId(), request.getVersion()); if (!fileInfo.getUserId().equals(userId)) { @@ -160,7 +156,7 @@ public class FileEntityHandler implements RequestHandler { private BaseResponse handleChangePermission(BaseRequest request, FileEntityRequest fileRequest) { try { - Long userId = authService.useUserAuthToken(fileRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); FileEntityResponse fileInfo = fileEntityService.getById(fileRequest.getFileId(), request.getVersion()); if (!fileInfo.getUserId().equals(userId)) { @@ -211,7 +207,7 @@ public class FileEntityHandler implements RequestHandler { private BaseResponse handleGetFileBySession(BaseRequest request, FileEntityRequest fileRequest) { try { - Long userId = authService.useUserAuthToken(fileRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); FileEntityResponse fileInfo = fileEntityService.getByUploadSessionId(fileRequest.getUploadSessionId(), request.getVersion()); @@ -243,7 +239,7 @@ public class FileEntityHandler implements RequestHandler { private BaseResponse handleGetUserFiles(BaseRequest request, FileEntityRequest fileRequest) { try { - Long userId = authService.useUserAuthToken(fileRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1; int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20; @@ -270,7 +266,7 @@ public class FileEntityHandler implements RequestHandler { private BaseResponse handleSearchFiles(BaseRequest request, FileEntityRequest fileRequest) { try { - Long userId = authService.useUserAuthToken(fileRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1; int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20; @@ -509,7 +505,7 @@ public class FileEntityHandler implements RequestHandler { private BaseResponse handleGetUserFilesWithSort(BaseRequest request, FileEntityRequest fileRequest, String sortBy, SortOrder sortOrder) { try { - Long userId = authService.useUserAuthToken(fileRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1; int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20; @@ -563,7 +559,7 @@ public class FileEntityHandler implements RequestHandler { private BaseResponse handleGetStorageUsage(BaseRequest request, FileEntityRequest fileRequest) { try { - Long userId = authService.useUserAuthToken(fileRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); long usage = fileEntityService.getUserStorageUsed(userId); StorageUsageResponse response = StorageUsageResponse.builder() @@ -674,7 +670,7 @@ public class FileEntityHandler implements RequestHandler { private BaseResponse handleDeleteFile(BaseRequest request, FileEntityRequest fileRequest) { try { - Long userId = authService.useUserAuthToken(fileRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); String fileId = fileRequest.getFileId(); FileEntityResponse fileInfo = fileEntityService.getById(fileId, request.getVersion()); DeleteFileResponse response; @@ -764,7 +760,7 @@ public class FileEntityHandler implements RequestHandler { private BaseResponse handleSubmitAppeal(BaseRequest request, FileEntityRequest fileRequest) { try { - Long userId = authService.useUserAuthToken(fileRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); AppealRequest appealRequest = AppealRequest.builder() .fileId(fileRequest.getFileId()) @@ -793,7 +789,7 @@ public class FileEntityHandler implements RequestHandler { private BaseResponse handleGetUserAppeals(BaseRequest request, FileEntityRequest fileRequest) { try { - Long userId = authService.useUserAuthToken(fileRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1; int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20; diff --git a/src/main/java/ru/soune/nocopy/handler/FileUploadHandler.java b/src/main/java/ru/soune/nocopy/handler/FileUploadHandler.java index 8bc41ff..ea66706 100644 --- a/src/main/java/ru/soune/nocopy/handler/FileUploadHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/FileUploadHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -10,14 +11,11 @@ import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import ru.soune.nocopy.dto.*; import ru.soune.nocopy.dto.file.*; -import ru.soune.nocopy.entity.user.AuthToken; import ru.soune.nocopy.entity.file.FileType; import ru.soune.nocopy.entity.file.FileUploadSession; import ru.soune.nocopy.exception.*; import ru.soune.nocopy.handler.validator.FileUploadRequestValidator; -import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.FileUploadSessionRepository; -import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.file.FileUploadService; import java.util.*; @@ -29,16 +27,14 @@ import java.util.stream.Collectors; public class FileUploadHandler implements RequestHandler { private final FileUploadService fileUploadService; - private final AuthService authService; - - private final AuthTokenRepository authTokenRepository; - private final FileUploadSessionRepository fileUploadSessionRepository; private final ObjectMapper objectMapper; private final FileUploadRequestValidator fileUploadRequestValidator; + private final HttpServletRequest httpServletRequest; + @Value("${file.storage.max-file-size}") private long maxFileSize; @@ -80,16 +76,7 @@ public class FileUploadHandler implements RequestHandler { } private BaseResponse handleInitUpload(BaseRequest request, FileUploadRequest fileRequest) { - String token = fileRequest.getToken(); - - Optional tokenOptional = authTokenRepository.findByToken(token); - - if (tokenOptional.isEmpty()) { - return new BaseResponse(request.getMsgId(), MessageCode.INVALID_TOKEN.getCode(), - MessageCode.INVALID_TOKEN.getDescription(), Map.of("token", token)); - } - - Long userId = authService.useUserAuthToken(token); + Long userId = (Long) httpServletRequest.getAttribute("userId"); BindingResult bindingResult = new BeanPropertyBindingResult(fileRequest, "fileRequest"); fileUploadRequestValidator.validate(fileRequest, bindingResult); @@ -219,7 +206,6 @@ public class FileUploadHandler implements RequestHandler { return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(), response); - } catch (Exception e) { log.error("Error getting file types", e); return new BaseResponse(request.getMsgId(), MessageCode.FILE_UPLOAD_ERROR.getCode(), diff --git a/src/main/java/ru/soune/nocopy/handler/GlobalSearchHandler.java b/src/main/java/ru/soune/nocopy/handler/GlobalSearchHandler.java index a6e7820..4de2c39 100644 --- a/src/main/java/ru/soune/nocopy/handler/GlobalSearchHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/GlobalSearchHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -8,12 +9,8 @@ import ru.soune.nocopy.dto.BaseRequest; import ru.soune.nocopy.dto.BaseResponse; import ru.soune.nocopy.dto.search.GlobalSearchStatisticsRequest; import ru.soune.nocopy.dto.search.GlobalSearchStatisticsResponse; -import ru.soune.nocopy.entity.user.AuthToken; -import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.service.search.GlobalSearchStatisticsService; -import java.util.Optional; - @Slf4j @Component @RequiredArgsConstructor @@ -23,28 +20,17 @@ public class GlobalSearchHandler implements RequestHandler { private final GlobalSearchStatisticsService statisticsService; - private final AuthTokenRepository authTokenRepository; + private final HttpServletRequest httpServletRequest; @Override public BaseResponse handle(BaseRequest request) throws Exception { GlobalSearchStatisticsRequest statRequest = objectMapper.convertValue( request.getMessageBody(), GlobalSearchStatisticsRequest.class); - if (statRequest.getToken() == null) { - throw new IllegalArgumentException("User token is required"); - } + Long userId = (Long) httpServletRequest.getAttribute("userId"); - Optional tokenOptional = - authTokenRepository.findByToken(statRequest.getToken()); - - if (tokenOptional.isEmpty()) { - throw new IllegalArgumentException("User token is required"); - } - - Long userId = tokenOptional.orElseThrow().getUser().getId(); - - GlobalSearchStatisticsResponse statistics = statisticsService.getStatistics( - userId, statRequest.getLimit(), statRequest.getDays()); + GlobalSearchStatisticsResponse statistics = statisticsService.getStatistics(userId, statRequest.getLimit(), + statRequest.getDays()); return BaseResponse.builder() .msgId(request.getMsgId()) diff --git a/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java b/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java index 45694ea..b5369a1 100644 --- a/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java @@ -61,12 +61,6 @@ public class ImageFoundRequestHandler implements RequestHandler { private final FileUploadService fileUploadService; - private final ImageHashService imageHashService; - - private final ImageHashRepository imageHashRepository; - - private final FileSimilarityService fileSimilarityService; - private final NoCopyFileService noCopyFileService; @Override diff --git a/src/main/java/ru/soune/nocopy/handler/LawCaseHandler.java b/src/main/java/ru/soune/nocopy/handler/LawCaseHandler.java index 0b4e3f9..77ae803 100644 --- a/src/main/java/ru/soune/nocopy/handler/LawCaseHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/LawCaseHandler.java @@ -2,6 +2,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.mail.MessagingException; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -24,7 +25,6 @@ import ru.soune.nocopy.exception.TariffNotFoundException; import ru.soune.nocopy.exception.UserNotFoundException; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.complaint.LawCaseService; -import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.tariff.TariffConstants; import ru.soune.nocopy.service.tariff.TariffInfoService; import ru.soune.nocopy.service.violation.ViolationService; @@ -41,8 +41,6 @@ public class LawCaseHandler implements RequestHandler { private final LawCaseService lawCaseService; - private final AuthService authService; - private final ObjectMapper objectMapper; private final UserRepository userRepository; @@ -51,11 +49,13 @@ public class LawCaseHandler implements RequestHandler { private final ViolationService violationService; + private final HttpServletRequest httpServletRequest; + @Override public BaseResponse handle(BaseRequest request) throws Exception { LawCaseRequest lawCaseRequest = objectMapper.convertValue(request.getMessageBody(), LawCaseRequest.class); - Long userId = authService.useUserAuthToken(lawCaseRequest.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); String action = lawCaseRequest.getAction(); return switch (action) { diff --git a/src/main/java/ru/soune/nocopy/handler/LoginRequestHandler.java b/src/main/java/ru/soune/nocopy/handler/LoginRequestHandler.java index c0e179c..ae659b4 100644 --- a/src/main/java/ru/soune/nocopy/handler/LoginRequestHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/LoginRequestHandler.java @@ -6,11 +6,10 @@ import org.springframework.stereotype.Component; import ru.soune.nocopy.dto.*; import ru.soune.nocopy.dto.register.LoginAnswer; import ru.soune.nocopy.dto.register.LoginRequest; -import ru.soune.nocopy.entity.user.AuthToken; import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.repository.UserRepository; -import ru.soune.nocopy.service.register.AuthService; +import ru.soune.nocopy.util.JwtUtil; import java.util.Arrays; import java.util.Map; @@ -21,10 +20,10 @@ public class LoginRequestHandler implements RequestHandler { private final UserRepository userRepository; - private final AuthService authService; - private final ObjectMapper objectMapper; + private final JwtUtil jwtUtil; + @Override public BaseResponse handle(BaseRequest request) { LoginRequest loginRequest = objectMapper.convertValue(request.getMessageBody(), LoginRequest.class); @@ -60,14 +59,11 @@ public class LoginRequestHandler implements RequestHandler { MessageCode.PERMISSION_NOT_FOUND.getDescription(), loginAnswer); } - AuthToken authToken = authService.login(loginRequest); - String token = authToken.getToken(); + String token = jwtUtil.generateToken(user.getId(), user.getEmail()); LoginAnswer loginAnswer = new LoginAnswer(); loginAnswer.setToken(token); - authService.useUserAuthToken(token); - return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(), loginAnswer); } diff --git a/src/main/java/ru/soune/nocopy/handler/LogoutRequestHandler.java b/src/main/java/ru/soune/nocopy/handler/LogoutRequestHandler.java index 3216d16..e3cbe6d 100644 --- a/src/main/java/ru/soune/nocopy/handler/LogoutRequestHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/LogoutRequestHandler.java @@ -11,8 +11,6 @@ import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.UserRepository; -import ru.soune.nocopy.service.register.AuthService; - import java.util.Objects; import java.util.Optional; @@ -20,8 +18,6 @@ import java.util.Optional; @RequiredArgsConstructor public class LogoutRequestHandler implements RequestHandler { - private final AuthService authService; - private final AuthTokenRepository authTokenRepository; private final ObjectMapper objectMapper; @@ -49,9 +45,6 @@ public class LogoutRequestHandler implements RequestHandler { new LogoutRequest(logoutRequest.getEmail(), logoutRequest.getToken()))); } - - authService.logout(logoutRequest.getToken()); - return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(), new LogOutAnswer(logoutRequest.getEmail())); } diff --git a/src/main/java/ru/soune/nocopy/handler/MonitoringHandler.java b/src/main/java/ru/soune/nocopy/handler/MonitoringHandler.java index 876c71e..3bfd176 100644 --- a/src/main/java/ru/soune/nocopy/handler/MonitoringHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/MonitoringHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -10,11 +11,8 @@ import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.monitoring.MonitoringStatusResponse; import ru.soune.nocopy.dto.monitoring.SetMonitoringRequest; import ru.soune.nocopy.entity.monitoring.MonitoringType; -import ru.soune.nocopy.entity.user.AuthToken; -import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.exception.UserNotHavePermission; import ru.soune.nocopy.service.monitoring.FileMonitoringService; -import ru.soune.nocopy.service.register.AuthService; import java.io.FileNotFoundException; import java.util.Arrays; @@ -29,24 +27,14 @@ public class MonitoringHandler implements RequestHandler { private final FileMonitoringService monitoringService; - private final AuthService authService; + private final HttpServletRequest httpServletRequest; @Override public BaseResponse handle(BaseRequest request) throws Exception { SetMonitoringRequest setRequest = objectMapper.convertValue( request.getMessageBody(), SetMonitoringRequest.class); - String authToken = setRequest.getAuthToken(); - AuthToken userAuthToken = authService.getAuthToken(authToken); - - if (authToken == null || userAuthToken == null) { - return new BaseResponse(30007, MessageCode.AUTH_TOKEN_NOT_FOUND.getCode(), - MessageCode.AUTH_TOKEN_NOT_FOUND.getDescription(), - Map.of("token", authToken)); - } - - User user = userAuthToken.getUser(); - Long userId = user.getId(); + Long userId = (Long) httpServletRequest.getAttribute("userId"); String typeStr = setRequest.getMonitoringType(); MonitoringType monitoringType; @@ -64,7 +52,7 @@ public class MonitoringHandler implements RequestHandler { } catch (UserNotHavePermission e) { return new BaseResponse(request.getMsgId(), MessageCode.USER_NOT_HAD_PERMISSION.getCode(), - MessageCode.USER_NOT_HAD_PERMISSION.getDescription(), Map.of("token", authToken)); + MessageCode.USER_NOT_HAD_PERMISSION.getDescription(), Map.of("User id: ", userId)); } catch (FileNotFoundException e) { return new BaseResponse(request.getMsgId(), MessageCode.FILE_NOT_FOUND.getCode(), diff --git a/src/main/java/ru/soune/nocopy/handler/MonitoringStatisticHandler.java b/src/main/java/ru/soune/nocopy/handler/MonitoringStatisticHandler.java index 669fe59..51edac5 100644 --- a/src/main/java/ru/soune/nocopy/handler/MonitoringStatisticHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/MonitoringStatisticHandler.java @@ -1,20 +1,18 @@ package ru.soune.nocopy.handler; -import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import ru.soune.nocopy.dto.BaseRequest; import ru.soune.nocopy.dto.BaseResponse; import ru.soune.nocopy.dto.MessageCode; -import ru.soune.nocopy.dto.statistic.MonitoringStatisticRequest; import ru.soune.nocopy.dto.statistic.MonitoringStatisticResponse; import ru.soune.nocopy.entity.company.Company; import ru.soune.nocopy.entity.monitoring.MonitoringType; import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.repository.FileMonitoringRepository; import ru.soune.nocopy.repository.UserRepository; -import ru.soune.nocopy.service.register.AuthService; import java.util.List; @@ -23,24 +21,19 @@ import java.util.List; @RequiredArgsConstructor public class MonitoringStatisticHandler implements RequestHandler { - private final ObjectMapper objectMapper; - - private final AuthService authService; - private final FileMonitoringRepository fileMonitoringRepository; private final UserRepository userRepository; + private final HttpServletRequest httpServletRequest; + @Override public BaseResponse handle(BaseRequest request) throws Exception { - MonitoringStatisticRequest monitoringStatisticRequest = objectMapper.convertValue(request.getMessageBody(), - MonitoringStatisticRequest.class); try { - String authToken = monitoringStatisticRequest.getAuthToken(); - Long userId = authService.useUserAuthToken(authToken); - + Long userId = (Long) httpServletRequest.getAttribute("userId"); User user = userRepository.findById(userId).orElseThrow(); Company company = user.getCompany(); + List userIds = company == null ? List.of(userId) : user.getCompany() .getUsers() diff --git a/src/main/java/ru/soune/nocopy/handler/NotificationHandler.java b/src/main/java/ru/soune/nocopy/handler/NotificationHandler.java index 6af416b..a1c7657 100644 --- a/src/main/java/ru/soune/nocopy/handler/NotificationHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/NotificationHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -14,7 +15,7 @@ import com.fasterxml.jackson.databind.type.TypeFactory; import ru.soune.nocopy.dto.notification.*; import ru.soune.nocopy.entity.notification.Notification; import ru.soune.nocopy.entity.user.User; -import ru.soune.nocopy.service.register.AuthService; +import ru.soune.nocopy.service.user.UserService; import java.util.Arrays; import java.util.List; @@ -31,7 +32,9 @@ public class NotificationHandler implements RequestHandler { private final ObjectMapper objectMapper; - private final AuthService authService; + private final HttpServletRequest httpServletRequest; + + private final UserService userService; @Override public BaseResponse handle(BaseRequest request) throws Exception { @@ -56,7 +59,16 @@ public class NotificationHandler implements RequestHandler { case "list": { NotificationListRequest listRequest = objectMapper.convertValue(request.getMessageBody(), NotificationListRequest.class); - User user = authService.getUser(listRequest.getAuthToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); + User user = userService.getUserById(userId).orElse(null); + + if (user == null) { + return new BaseResponse( + request.getMsgId(), + MessageCode.USER_NOT_FOUND.getCode(), + MessageCode.USER_NOT_FOUND.getDescription(), + Map.of("User:", userId)); + } Page page = notificationService.getAllNotifications( user, @@ -87,7 +99,8 @@ public class NotificationHandler implements RequestHandler { case "active": { ActivateNotificationRequest activateRequest = objectMapper.convertValue(request.getMessageBody(), ActivateNotificationRequest.class); - User user = authService.getUser(activateRequest.getAuthToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); + User user = userService.getUserById(userId).orElse(null); List recent = notificationService.getActiveNotifications(user); @@ -107,7 +120,8 @@ public class NotificationHandler implements RequestHandler { case "markRead": { MarkAsReadRequest markRequest = objectMapper.convertValue(request.getMessageBody(), MarkAsReadRequest.class); - User user = authService.getUser(markRequest.getAuthToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); + User user = userService.getUserById(userId).orElse(null); int updated = notificationService.markAsRead(user, markRequest.getNotificationIds()); diff --git a/src/main/java/ru/soune/nocopy/handler/ReferralHandler.java b/src/main/java/ru/soune/nocopy/handler/ReferralHandler.java index 902b022..b0541d0 100644 --- a/src/main/java/ru/soune/nocopy/handler/ReferralHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ReferralHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import ru.soune.ReferralInvitee; @@ -11,8 +12,8 @@ import ru.soune.nocopy.dto.BaseRequest; import ru.soune.nocopy.dto.BaseResponse; import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.referral.ReferralRequest; -import ru.soune.nocopy.entity.user.AuthToken; -import ru.soune.nocopy.repository.AuthTokenRepository; +import ru.soune.nocopy.entity.user.User; +import ru.soune.nocopy.service.user.UserService; import java.util.List; import java.util.Map; @@ -24,7 +25,9 @@ public class ReferralHandler implements RequestHandler { private final ReferralService referralService; - private final AuthTokenRepository authTokenRepository; + private final HttpServletRequest httpServletRequest; + + private final UserService userService; private final ObjectMapper mapper = new ObjectMapper(); @@ -32,20 +35,28 @@ public class ReferralHandler implements RequestHandler { public BaseResponse handle(BaseRequest request) throws Exception { ReferralRequest referralRequest = mapper.convertValue(request.getMessageBody(), ReferralRequest.class); String action = referralRequest.getAction(); - String token = referralRequest.getToken(); - AuthToken authToken = authTokenRepository.findByToken(token).orElseThrow(); + Long userId = (Long) httpServletRequest.getAttribute("userId"); + User user = userService.getUserById(userId).orElse(null); + + if (user == null) { + return new BaseResponse( + request.getMsgId(), + MessageCode.USER_NOT_FOUND.getCode(), + MessageCode.USER_NOT_FOUND.getDescription(), + Map.of("User: ", userId)); + } switch (action) { case "refill": - return handleRefill(request, authToken.getUser().getId(), referralRequest.getAmount()); + return handleRefill(request, userId, referralRequest.getAmount()); case "levels": return handleReferralLevels(request); case "level": - return handleUserLevel(request, authToken.getUser().getId()); + return handleUserLevel(request, userId); case "userStats" : - return handleUserStats(request, authToken.getUser().getId()); + return handleUserStats(request, userId); case "invitees": - return handleInvitees(referralRequest, request, authToken.getUser().getId()); + return handleInvitees(referralRequest, request, userId); } return null; diff --git a/src/main/java/ru/soune/nocopy/handler/RegRequestHandler.java b/src/main/java/ru/soune/nocopy/handler/RegRequestHandler.java index d9a54bd..791d227 100644 --- a/src/main/java/ru/soune/nocopy/handler/RegRequestHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/RegRequestHandler.java @@ -11,17 +11,17 @@ import ru.soune.nocopy.dto.*; import ru.soune.nocopy.dto.register.RegAnswer; import ru.soune.nocopy.dto.register.RegRequest; import ru.soune.nocopy.entity.referral.Referral; -import ru.soune.nocopy.entity.user.AuthToken; import ru.soune.nocopy.entity.user.EmailVerificationToken; +import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.exception.CompanyAlreadyExist; import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.exception.ValidationException; import ru.soune.nocopy.handler.validator.RegRequestValidator; import ru.soune.nocopy.repository.ReferralJpaRepository; -import ru.soune.nocopy.repository.UserRepository; -import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.mail.EmailService; import ru.soune.nocopy.service.user.AdditionalInfoService; +import ru.soune.nocopy.service.user.UserService; +import ru.soune.nocopy.util.JwtUtil; import java.util.Arrays; import java.util.Map; @@ -30,12 +30,10 @@ import java.util.Map; @Component @RequiredArgsConstructor public class RegRequestHandler implements RequestHandler { - private final UserRepository userRepository; + private final UserService userService; private final RegRequestValidator regRequestValidator; - private final AuthService authService; - private final ObjectMapper objectMapper; private final EmailService emailService; @@ -46,11 +44,13 @@ public class RegRequestHandler implements RequestHandler { private final AdditionalInfoService additionalInfoService; + private final JwtUtil jwtUtil; + @Override public BaseResponse handle(BaseRequest request) throws ValidationException { RegRequest regRequest = objectMapper.convertValue(request.getMessageBody(), RegRequest.class); try { - if (userRepository.existsByEmail(regRequest.getEmail()) || userRepository.existsByPhone(regRequest.getPhone())) { + if (userService.existsByEmailOrPhone(regRequest.getEmail(), regRequest.getPhone())) { RegAnswer regAnswer = new RegAnswer(); regAnswer.setFieldErrors(Arrays.asList(Map.of("email", regRequest.getEmail()))); regAnswer.setFieldErrors(Arrays.asList(Map.of("phone", regRequest.getPhone()))); @@ -93,13 +93,14 @@ public class RegRequestHandler implements RequestHandler { boolean verified = mailVerified.equals("true"); - AuthToken authToken = authService.register(regRequest, verified); - EmailVerificationToken emailToken = emailService.createEmailVerificationToken(authToken); + User user = userService.createUser(regRequest, verified); + + EmailVerificationToken emailToken = emailService.createEmailVerificationToken(user); RegAnswer regAnswer = new RegAnswer(); if (verified) { try { - emailService.sendVerificationEmail(authToken.getUser(), emailToken.getToken()); + emailService.sendVerificationEmail(user, emailToken.getToken()); } catch (Exception e) { return new BaseResponse(request.getMsgId(), MessageCode.SEND_EMAIL_EXCEPTION.getCode(), MessageCode.SEND_EMAIL_EXCEPTION.getDescription(), Map.of( @@ -111,23 +112,22 @@ public class RegRequestHandler implements RequestHandler { regAnswer.setVerified(false); regAnswer.setActive(false); } else { - regAnswer.setUserId(authToken.getUser().getId()); + regAnswer.setUserId(user.getId()); regAnswer.setVerified(true); regAnswer.setActive(true); } - String token = authToken.getToken(); - authService.useUserAuthToken(token); + String token = jwtUtil.generateToken(user.getId(), user.getEmail()); regAnswer.setToken(token); - regAnswer.setUserId(authToken.getUser().getId()); + regAnswer.setUserId(user.getId()); if (regRequest.getAccountType().equals("b2c")) { - referralService.onRegister(authToken.getUser().getId(), regRequest.getReferralLink()); + referralService.onRegister(user.getId(), regRequest.getReferralLink()); } - additionalInfoService.additionalInfo(regRequest.getIp(), regRequest.getUserAgent(), authToken.getUser()); + additionalInfoService.additionalInfo(regRequest.getIp(), regRequest.getUserAgent(), user); return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(), regAnswer); diff --git a/src/main/java/ru/soune/nocopy/handler/ResetPasswordHandler.java b/src/main/java/ru/soune/nocopy/handler/ResetPasswordHandler.java index e51a806..b36a1ee 100644 --- a/src/main/java/ru/soune/nocopy/handler/ResetPasswordHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ResetPasswordHandler.java @@ -11,21 +11,16 @@ import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.file.ActionResponse; import ru.soune.nocopy.dto.register.ResetPasswordRequest; import ru.soune.nocopy.dto.register.ResetPasswordResponse; -import ru.soune.nocopy.entity.user.AuthToken; import ru.soune.nocopy.entity.user.EmailVerificationToken; import ru.soune.nocopy.entity.user.User; -import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.exception.UserNotFoundException; -import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.EmailVerificationTokenRepository; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.mail.EmailService; -import ru.soune.nocopy.service.register.AuthService; +import ru.soune.nocopy.util.JwtUtil; import java.util.Arrays; -import java.util.List; import java.util.Map; -import java.util.Optional; @Component @Slf4j @@ -36,35 +31,33 @@ public class ResetPasswordHandler implements RequestHandler{ private final EmailService emailService; - private final AuthService authService; - private final UserRepository userRepository; private final EmailVerificationTokenRepository emailVerificationTokenRepository; - private final AuthTokenRepository authTokenRepository; - private final PasswordEncoder passwordEncoder; + private final JwtUtil jwtUtil; + @Override public BaseResponse handle(BaseRequest request) throws Exception { ResetPasswordRequest resetPasswordRequest = objectMapper.convertValue(request.getMessageBody(), ResetPasswordRequest.class); String action = resetPasswordRequest.getAction(); User user = userRepository.findByEmail(resetPasswordRequest.getEmail()); - AuthToken authToken; if (user == null) { throw new UserNotFoundException("User not found with email: " + resetPasswordRequest.getEmail()); } + String authToken; switch (action) { case "resetPassword": - authToken = authService.generateAuthToken(user); + authToken = jwtUtil.generateToken(user.getId(), user.getEmail()); - EmailVerificationToken emailToken = emailService.createEmailVerificationToken(authToken); + EmailVerificationToken emailToken = emailService.createEmailVerificationToken(user); - emailService.sendResetPasswordEmail(authToken.getUser(), emailToken.getToken()); + emailService.sendResetPasswordEmail(user, emailToken.getToken()); return successResponse(request, authToken, user, MessageCode.SUCCESS.getDescription()); case "confirmVerification": @@ -78,9 +71,7 @@ public class ResetPasswordHandler implements RequestHandler{ MessageCode.INVALID_TOKEN.getDescription(), Map.of("verifyToken", verifyToken)); } - List authTokens = authTokenRepository.findByUserId(user.getId()); - - authToken = authTokens.isEmpty() ? authService.generateAuthToken(user): authTokens.getFirst(); + authToken = jwtUtil.generateToken(user.getId(), user.getEmail()); user.setPassword(passwordEncoder.encode(resetPasswordRequest.getPassword())); user.setActive(true); @@ -102,9 +93,9 @@ public class ResetPasswordHandler implements RequestHandler{ } } - private BaseResponse successResponse(BaseRequest request, AuthToken authToken, User user, String message) { + private BaseResponse successResponse(BaseRequest request, String authToken, User user, String message) { ResetPasswordResponse resetPasswordResponse = new ResetPasswordResponse(); - resetPasswordResponse.setAuthToken(authToken.getToken()); + resetPasswordResponse.setAuthToken(authToken); resetPasswordResponse.setUserId(user.getId()); return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), message, resetPasswordResponse); diff --git a/src/main/java/ru/soune/nocopy/handler/TariffHandler.java b/src/main/java/ru/soune/nocopy/handler/TariffHandler.java index da110fa..7bf3af0 100644 --- a/src/main/java/ru/soune/nocopy/handler/TariffHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/TariffHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -15,6 +16,7 @@ import ru.soune.nocopy.entity.user.AuthToken; import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.service.tariff.TariffService; +import ru.soune.nocopy.service.user.UserService; import java.util.List; import java.util.Map; @@ -28,7 +30,9 @@ public class TariffHandler implements RequestHandler { private final TariffService tariffService; - private final AuthTokenRepository authTokenRepository; + private final UserService userService; + + private final HttpServletRequest httpServletRequest; @Override public BaseResponse handle(BaseRequest request) throws Exception { @@ -128,8 +132,16 @@ public class TariffHandler implements RequestHandler { } private BaseResponse handleGetTariffs(BaseRequest request, TariffRequest tariffRequest) { - AuthToken authToken = authTokenRepository.findByToken(tariffRequest.getUserToken()).orElseThrow(); - User user = authToken.getUser(); + Long userId = (Long) httpServletRequest.getAttribute("userId"); + User user = userService.getUserById(userId).orElse(null); + + if (user == null) { + return new BaseResponse( + request.getMsgId(), + MessageCode.USER_NOT_FOUND.getCode(), + MessageCode.USER_NOT_FOUND.getDescription(), + Map.of("User:", userId)); + } if (tariffRequest.getTariffTerm() == null || !TariffTimeTerm.validTerms().contains( tariffRequest.getTariffTerm())) { diff --git a/src/main/java/ru/soune/nocopy/handler/TariffInfoHandler.java b/src/main/java/ru/soune/nocopy/handler/TariffInfoHandler.java index e6311d3..c1a30ee 100644 --- a/src/main/java/ru/soune/nocopy/handler/TariffInfoHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/TariffInfoHandler.java @@ -74,7 +74,7 @@ public class TariffInfoHandler implements RequestHandler { private BaseResponse handleCreateTariffInfo(BaseRequest request, TariffInfoRequest tariffInfoRequest) { try { Long tariffId = tariffInfoRequest.getTariffId(); - Tariff tariff= tariffRepository.findById(tariffId).orElseThrow(); + Tariff tariff = tariffRepository.findById(tariffId).orElseThrow(); TariffTimeTerm tariffTerm = tariff.getTariffTerm(); LocalDateTime endDateTime = LocalDateTime.now().plusDays(tariffTerm.getDays()); diff --git a/src/main/java/ru/soune/nocopy/handler/TokenOperationHandler.java b/src/main/java/ru/soune/nocopy/handler/TokenOperationHandler.java index f80e093..b0298c8 100644 --- a/src/main/java/ru/soune/nocopy/handler/TokenOperationHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/TokenOperationHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -12,7 +13,6 @@ import ru.soune.nocopy.dto.tokenoperation.TokenOperationPageDto; import ru.soune.nocopy.dto.tokenoperation.TokenOperationRequest; import ru.soune.nocopy.entity.tokenoperation.OperationType; import ru.soune.nocopy.entity.tokenoperation.TokenOperation; -import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.tokenoperation.TokenOperationService; import java.util.HashMap; @@ -26,7 +26,7 @@ public class TokenOperationHandler implements RequestHandler { private final ObjectMapper objectMapper; - private final AuthService authService; + private final HttpServletRequest httpServletRequest; @Override public BaseResponse handle(BaseRequest request) throws Exception { @@ -91,16 +91,7 @@ public class TokenOperationHandler implements RequestHandler { } private BaseResponse handleGetList(Integer msgId, TokenOperationRequest request) { - if (request.getToken() == null) { - return new BaseResponse( - msgId, - MessageCode.USER_NOT_FOUND.getCode(), - MessageCode.USER_NOT_FOUND.getDescription(), - Map.of("error", "User ID is required") - ); - } - - Long userId = authService.useUserAuthToken(request.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); try { Page page = tokenOperationService.findByUserId( @@ -189,16 +180,7 @@ public class TokenOperationHandler implements RequestHandler { } private BaseResponse handleCreate(Integer msgId, TokenOperationRequest request) { - if (request.getToken() == null) { - return new BaseResponse( - msgId, - MessageCode.AUTH_TOKEN_NOT_FOUND.getCode(), - MessageCode.AUTH_TOKEN_NOT_FOUND.getDescription(), - Map.of("error", "User ID is required") - ); - } - - Long userId = authService.useUserAuthToken(request.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); try { TokenOperation operation = tokenOperationService.create( @@ -316,16 +298,7 @@ public class TokenOperationHandler implements RequestHandler { } private BaseResponse handleDeleteAllByUser(Integer msgId, TokenOperationRequest request) { - if (request.getToken() == null) { - return new BaseResponse( - msgId, - MessageCode.AUTH_TOKEN_NOT_FOUND.getCode(), - MessageCode.AUTH_TOKEN_NOT_FOUND.getDescription(), - Map.of("error", "User ID is required") - ); - } - - Long userId = authService.useUserAuthToken(request.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); try { tokenOperationService.deleteByUserId(userId); @@ -350,16 +323,7 @@ public class TokenOperationHandler implements RequestHandler { } private BaseResponse handleGetStats(Integer msgId, TokenOperationRequest request) { - if (request.getToken() == null) { - return new BaseResponse( - msgId, - MessageCode.AUTH_TOKEN_NOT_FOUND.getCode(), - MessageCode.AUTH_TOKEN_NOT_FOUND.getDescription(), - Map.of("error", "User ID is required") - ); - } - - Long userId = authService.useUserAuthToken(request.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); if (userId == null) { return new BaseResponse( @@ -405,16 +369,7 @@ public class TokenOperationHandler implements RequestHandler { } private BaseResponse handleFilter(Integer msgId, TokenOperationRequest request) { - if (request.getToken() == null) { - return new BaseResponse( - msgId, - MessageCode.AUTH_TOKEN_NOT_FOUND.getCode(), - MessageCode.AUTH_TOKEN_NOT_FOUND.getDescription(), - Map.of("error", "User ID is required") - ); - } - - Long userId = authService.useUserAuthToken(request.getToken()); + Long userId = (Long) httpServletRequest.getAttribute("userId"); try { Page page = tokenOperationService.findByFilters( diff --git a/src/main/java/ru/soune/nocopy/handler/VerifyRegisterUserHandler.java b/src/main/java/ru/soune/nocopy/handler/VerifyRegisterUserHandler.java index 5dac630..7f5b602 100644 --- a/src/main/java/ru/soune/nocopy/handler/VerifyRegisterUserHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/VerifyRegisterUserHandler.java @@ -10,22 +10,18 @@ import ru.soune.nocopy.dto.BaseResponse; import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.register.RegAnswer; import ru.soune.nocopy.dto.register.VerifyUserRequest; -import ru.soune.nocopy.entity.user.AuthToken; import ru.soune.nocopy.entity.user.EmailVerificationToken; import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.exception.UserNotFoundException; -import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.EmailVerificationTokenRepository; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.mail.EmailService; -import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.user.UserService; +import ru.soune.nocopy.util.JwtUtil; import java.io.IOException; -import java.util.List; import java.util.Map; -import java.util.Optional; @Component @Slf4j @@ -41,9 +37,7 @@ public class VerifyRegisterUserHandler implements RequestHandler { private final UserService userService; - private final AuthTokenRepository authTokenRepository; - - private final AuthService authService; + private final JwtUtil jwtUtil; @Override public BaseResponse handle(BaseRequest request) throws MessagingException, IOException { @@ -54,45 +48,37 @@ public class VerifyRegisterUserHandler implements RequestHandler { User user = userRepository.findById(userId) .orElseThrow(() -> new UserNotFoundException("User not found with id: " + userId)); - List userAuthTokens = authTokenRepository.findByUserId(userId); - - AuthToken authToken = userAuthTokens.isEmpty() ? authService.generateAuthToken(user): userAuthTokens.getFirst(); - if (verifyUserRequest.getResend() != null && verifyUserRequest.getResend() == 1) { - return handleResend(request, user, authToken); + return handleResend(request, user); } + String authToken = jwtUtil.generateToken(user.getId(), user.getEmail()); + return handleVerify(request, user, authToken, verifyUserRequest.getVerifyToken()); } - private BaseResponse handleResend(BaseRequest request, User user, AuthToken authToken) throws MessagingException, IOException { + private BaseResponse handleResend(BaseRequest request, User user) throws MessagingException, IOException { EmailVerificationToken token = emailVerificationTokenRepository.findByUserId(user.getId()); -// if (token != null && !token.isExpired()) { -// emailService.sendVerificationEmail(user, token.getToken()); -// -// log.info("Verification token resent for user {}", user.getEmail()); -// return successResponse(request, authToken, "Verification code has been resent", false, -// false, user.getEmail()); -// } - if (token != null) { emailVerificationTokenRepository.delete(token); } - EmailVerificationToken newToken = emailService.createEmailVerificationToken(authToken); + EmailVerificationToken newToken = emailService.createEmailVerificationToken(user); emailService.sendVerificationEmail(user, newToken.getToken()); log.info("New verification token generated for user {}", user.getEmail()); + String authToken = jwtUtil.generateToken(user.getId(), user.getEmail()); + return successResponse(request, authToken, "New verification code has been sent", false, false, user.getEmail()); } - private BaseResponse handleVerify(BaseRequest request, User user, AuthToken authToken, String providedToken) { + private BaseResponse handleVerify(BaseRequest request, User user, String authToken, String providedToken) { EmailVerificationToken token = emailVerificationTokenRepository.findByUserIdAndToken(user.getId(), providedToken); @@ -110,10 +96,10 @@ public class VerifyRegisterUserHandler implements RequestHandler { updateUser.isEmailVerified(), updateUser.getEmail()); } - private BaseResponse successResponse(BaseRequest request, AuthToken authToken, String message, boolean isActive, + private BaseResponse successResponse(BaseRequest request, String authToken, String message, boolean isActive, boolean isVerified, String email) { RegAnswer regAnswer = new RegAnswer(); - regAnswer.setToken(authToken.getToken()); + regAnswer.setToken(authToken); regAnswer.setVerified(isVerified); regAnswer.setActive(isActive); regAnswer.setEmail(email); diff --git a/src/main/java/ru/soune/nocopy/handler/ViolationHandler.java b/src/main/java/ru/soune/nocopy/handler/ViolationHandler.java index 08ab9a4..667049e 100644 --- a/src/main/java/ru/soune/nocopy/handler/ViolationHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ViolationHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -17,7 +18,6 @@ import ru.soune.nocopy.service.complaint.ComplaintEntityService; import ru.soune.nocopy.service.complaint.LawCaseService; import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.geo.GeoCountryService; -import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.violation.ViolationService; import ru.soune.nocopy.service.violation.ViolationStatus; @@ -40,8 +40,6 @@ public class ViolationHandler implements RequestHandler { private final FileEntityRepository fileRepository; - private final AuthService authService; - private final FileEntityService fileEntityService; private final GeoCountryService geoCountryService; @@ -50,6 +48,8 @@ public class ViolationHandler implements RequestHandler { private final ComplaintEntityService complaintEntityService; + private final HttpServletRequest httpServletRequest; + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Override @@ -57,9 +57,7 @@ public class ViolationHandler implements RequestHandler { ViolationRequest violationRequest = objectMapper.convertValue(request.getMessageBody(), ViolationRequest.class); validateRequest(violationRequest); - - String token = violationRequest.getToken(); - Long userId = authService.useUserAuthToken(token); + Long userId = (Long) httpServletRequest.getAttribute("userId"); List targetFiles; @@ -135,23 +133,6 @@ public class ViolationHandler implements RequestHandler { .messageBody(groupedData) .build(); } else { -// Page violationPage; -// -// if (startDate != null && endDate != null) { -// violationPage = violationService.getViolationsByFilesAndDateRange( -// targetFiles, startDate, endDate, -// violationRequest.getPage(), violationRequest.getSize(), violationRequest.getSortDirection() -// ); -// } else if (violationRequest.getStatus() != null && !violationRequest.getStatus().isEmpty()) { -// violationPage = violationService.getViolationsByFilesAndStatus( -// targetFiles, violationRequest.getStatus(), -// violationRequest.getPage(), violationRequest.getSize(), violationRequest.getSortDirection() -// ); -// } else { -// violationPage = violationService.getViolationsByFiles( -// targetFiles, violationRequest.getPage(), violationRequest.getSize(), -// violationRequest.getSortDirection()); -// } Page violationPage = violationService.getViolationsByFilesAndFilters( targetFiles, startDate, diff --git a/src/main/java/ru/soune/nocopy/handler/ViolationNotionHandler.java b/src/main/java/ru/soune/nocopy/handler/ViolationNotionHandler.java index 85897c4..749d148 100644 --- a/src/main/java/ru/soune/nocopy/handler/ViolationNotionHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ViolationNotionHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -23,7 +24,7 @@ public class ViolationNotionHandler implements RequestHandler { private final ViolationNotionService notionService; - private final AuthTokenRepository authTokenRepository; + private final HttpServletRequest httpServletRequest; @Override public BaseResponse handle(BaseRequest request) { @@ -31,24 +32,7 @@ public class ViolationNotionHandler implements RequestHandler { ViolationNotionRequest notionRequest = objectMapper.convertValue( request.getMessageBody(), ViolationNotionRequest.class); - if (notionRequest.getToken() == null) { - return new BaseResponse( - request.getMsgId(), - MessageCode.INVALID_TOKEN.getCode(), - "Token is required", - "field: token"); - } - - Optional tokenOptional = authTokenRepository.findByToken(notionRequest.getToken()); - if (tokenOptional.isEmpty()) { - return new BaseResponse( - request.getMsgId(), - MessageCode.INVALID_TOKEN.getCode(), - "Invalid token", - notionRequest.getToken()); - } - - Long userId = tokenOptional.get().getUser().getId(); + Long userId = (Long) httpServletRequest.getAttribute("userId"); String action = notionRequest.getAction(); if (action == null || action.trim().isEmpty()) { diff --git a/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java b/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java index 1c6b2e3..bef30e3 100644 --- a/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -9,16 +10,13 @@ import ru.soune.nocopy.dto.BaseResponse; import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.violation.ViolationStatisticsRequest; import ru.soune.nocopy.dto.violation.ViolationStatisticsResponse; -import ru.soune.nocopy.entity.user.AuthToken; import ru.soune.nocopy.exception.FileEntityNotFoundException; import ru.soune.nocopy.exception.UserNotHavePermission; -import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.service.violation.ViolationService; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; -import java.util.Optional; @Slf4j @Component @@ -28,7 +26,7 @@ public class ViolationStatisticsHandler implements RequestHandler { private final ViolationService violationService; - private final AuthTokenRepository authTokenRepository; + private final HttpServletRequest httpServletRequest; private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @@ -37,8 +35,6 @@ public class ViolationStatisticsHandler implements RequestHandler { ViolationStatisticsRequest statRequest = objectMapper.convertValue(request.getMessageBody(), ViolationStatisticsRequest.class); - validateRequest(statRequest); - LocalDateTime startDate = null; LocalDateTime endDate = null; @@ -51,13 +47,7 @@ public class ViolationStatisticsHandler implements RequestHandler { } } - Optional tokenOptional = authTokenRepository.findByToken(statRequest.getToken()); - - if (tokenOptional.isEmpty()) { - throw new IllegalArgumentException("User token is required"); - } - - Long userId = tokenOptional.orElseThrow().getUser().getId(); + Long userId = (Long) httpServletRequest.getAttribute("userId"); ViolationStatisticsResponse statistics; try { @@ -91,12 +81,6 @@ public class ViolationStatisticsHandler implements RequestHandler { .build(); } - private void validateRequest(ViolationStatisticsRequest request) { - if (request.getToken() == null) { - throw new IllegalArgumentException("Token is required"); - } - } - private LocalDateTime parseDate(String dateStr) { try { return LocalDateTime.parse(dateStr, DATE_FORMATTER); diff --git a/src/main/java/ru/soune/nocopy/handler/validator/FileUploadRequestValidator.java b/src/main/java/ru/soune/nocopy/handler/validator/FileUploadRequestValidator.java index 201dadf..04f339c 100644 --- a/src/main/java/ru/soune/nocopy/handler/validator/FileUploadRequestValidator.java +++ b/src/main/java/ru/soune/nocopy/handler/validator/FileUploadRequestValidator.java @@ -84,8 +84,4 @@ public class FileUploadRequestValidator implements Validator { "Invalid file type. Valid types: " + Arrays.toString(FileType.values())); } } - - private String getFileExtension(String fileName) { - return fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase(); - } } \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java index 0d66b47..37bbdc0 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java @@ -30,16 +30,12 @@ import ru.soune.nocopy.service.cost.CostService; import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileUploadService; import ru.soune.nocopy.service.file.cloud.CloudStorageService; -import ru.soune.nocopy.service.file.moderation.ModerationFileService; import ru.soune.nocopy.service.notification.NotificationService; -import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.tariff.TariffInfoService; import ru.soune.nocopy.util.FileUtil; import java.io.*; import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.SocketTimeoutException; import java.net.URL; import java.nio.file.*; import java.nio.file.attribute.PosixFilePermission; @@ -97,10 +93,6 @@ public class FileUploadServiceImpl implements FileUploadService { private final NotificationService notificationService; - private final AuthService authService; - - private final ModerationFileService moderationFileService; - private final CloudStorageService cloudStorageService; @PostConstruct diff --git a/src/main/java/ru/soune/nocopy/service/mail/EmailService.java b/src/main/java/ru/soune/nocopy/service/mail/EmailService.java index fabb47d..9e05814 100644 --- a/src/main/java/ru/soune/nocopy/service/mail/EmailService.java +++ b/src/main/java/ru/soune/nocopy/service/mail/EmailService.java @@ -105,6 +105,7 @@ public class EmailService { } @Transactional + @Deprecated public EmailVerificationToken createEmailVerificationToken(AuthToken authToken) { EmailVerificationToken existingToken = emailVerificationTokenRepository .findByUserId(authToken.getUser().getId()); @@ -121,6 +122,23 @@ public class EmailService { return emailVerificationTokenRepository.save(emailToken); } + @Transactional + public EmailVerificationToken createEmailVerificationToken(User user) { + EmailVerificationToken existingToken = emailVerificationTokenRepository + .findByUserId(user.getId()); + + if (existingToken != null) { + emailVerificationTokenRepository.deleteById(existingToken.getId()); + } + + EmailVerificationToken emailToken = new EmailVerificationToken(); + emailToken.setUser(user); + emailToken.setToken(generateVerificationCode()); + emailToken.setCreatedAt(LocalDateTime.now()); + + return emailVerificationTokenRepository.save(emailToken); + } + private String generateVerificationCode() { SecureRandom random = new SecureRandom(); int code = 100000 + random.nextInt(900000); diff --git a/src/main/java/ru/soune/nocopy/service/register/AuthService.java b/src/main/java/ru/soune/nocopy/service/register/AuthService.java deleted file mode 100644 index 89848c5..0000000 --- a/src/main/java/ru/soune/nocopy/service/register/AuthService.java +++ /dev/null @@ -1,277 +0,0 @@ -package ru.soune.nocopy.service.register; - -import jakarta.persistence.EntityNotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import ru.soune.nocopy.dto.*; -import ru.soune.nocopy.dto.register.AccountType; -import ru.soune.nocopy.dto.register.LoginAnswer; -import ru.soune.nocopy.dto.register.LoginRequest; -import ru.soune.nocopy.dto.register.RegRequest; -import ru.soune.nocopy.entity.company.Company; -import ru.soune.nocopy.entity.tarif.TariffInfo; -import ru.soune.nocopy.entity.tarif.TariffType; -import ru.soune.nocopy.entity.user.AuthToken; -import ru.soune.nocopy.entity.user.Permission; -import ru.soune.nocopy.entity.user.User; -import ru.soune.nocopy.entity.user.UserNotActive; -import ru.soune.nocopy.exception.CompanyAlreadyExist; -import ru.soune.nocopy.exception.NotFoundAuthToken; -import ru.soune.nocopy.exception.NotValidFieldException; -import ru.soune.nocopy.repository.*; -import ru.soune.nocopy.service.file.CheckCounterService; -import ru.soune.nocopy.service.tariff.TariffInfoService; - -import java.security.SecureRandom; -import java.time.LocalDateTime; -import java.util.*; - -@Service -@RequiredArgsConstructor -public class AuthService { - - private final UserRepository userRepository; - - private final AuthTokenRepository authTokenRepository; - - private final PasswordEncoder passwordEncoder; - - private final CompanyRepository companyRepository; - - private final CheckCounterService checkCounterService; - - private final TariffInfoRepository tariffInfoRepository; - - private final TariffInfoService tariffInfoService; - - private final UserNotActiveRepository userNotActiveRepository; - - private final SecureRandom secureRandom = new SecureRandom(); - - @Transactional - public AuthToken register(RegRequest registerRequest, boolean verified) { - User user = new User(); - user.setFullName(registerRequest.getFullName()); - user.setEmail(registerRequest.getEmail()); - user.setPassword(passwordEncoder.encode(registerRequest.getPassword())); - user.setActive(!verified); - user.setEmailVerified(!verified); - - AccountType accountType = AccountType.valueOf(registerRequest.getAccountType().toUpperCase()); - - if (accountType == AccountType.B2B && registerRequest.getCompanyName() != null) { - try { - createCompanyAccount(registerRequest, user); - } catch (CompanyAlreadyExist exist) { - throw new CompanyAlreadyExist("Company already exist"); - } - } else if (accountType == AccountType.B2C && registerRequest.getCompanyName() == null) { - createIndividualAccount(user); - } else { - createIndividualCompanyAccount(registerRequest, user); - } - - if (registerRequest.getPhone() != null) { - user.setPhone(registerRequest.getPhone()); - } - - User savedUser = userRepository.save(user); - - AuthToken authToken = genereateAuthToken(savedUser); - - checkCounterService.initProtectCheckLimit(user, 0); - - return authTokenRepository.save(authToken); - } - - @Transactional - public Long useUserAuthToken(String token) { - if (token == null || token.isBlank()) { - throw new NotFoundAuthToken("Token is required"); - } - - if (token.startsWith("Bearer ")) { - token = token.replace("Bearer ", ""); - } - - AuthToken authToken = authTokenRepository.findByToken(token) - .orElseThrow(() -> new NotFoundAuthToken("Token not found")); - authToken.setLastUsedAt(LocalDateTime.now()); - authToken.setExpiresAt(LocalDateTime.now().plusHours(1)); - - authTokenRepository.save(authToken); - - return authToken.getUser().getId(); - } - - @Transactional - public User getUser(String token) { - if (token == null || token.isBlank()) { - throw new NotFoundAuthToken("Token is required"); - } - - if (token.startsWith("Bearer ")) { - token = token.replace("Bearer ", ""); - } - - AuthToken authToken = authTokenRepository.findByToken(token) - .orElseThrow(() -> new NotFoundAuthToken("Token not found")); - authToken.setLastUsedAt(LocalDateTime.now()); - authToken.setExpiresAt(LocalDateTime.now().plusHours(1)); - - authTokenRepository.save(authToken); - - return authToken.getUser(); - } - - public AuthToken login(LoginRequest request) { - User user = userRepository.findByEmail(request.getEmail()); - - if (!user.isActive()) { - throw new NotValidFieldException("User not active", new BaseResponse(20003, - MessageCode.USER_NOT_ACTIVE.getCode(), - MessageCode.USER_NOT_ACTIVE.getDescription(), Map.of("userId", user.getId()))); - } - - if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) { - LoginAnswer loginAnswer = new LoginAnswer(); - loginAnswer.setFieldErrors(Arrays.asList(Map.of("password", request.getPassword()))); - loginAnswer.setVerified(user.isEmailVerified()); - loginAnswer.setActive(user.isActive()); - - int attempts = user.getFailedLoginAttempts() + 1; - user.setFailedLoginAttempts(attempts); - - if (attempts >= 5) { - user.setActive(false); - blockUser(user); - } - - userRepository.save(user); - - throw new NotValidFieldException("Invalid password", new BaseResponse(20003, - MessageCode.AUTH_PASSWORD_NOT_MATCHES.getCode(), - MessageCode.AUTH_PASSWORD_NOT_MATCHES.getDescription(), loginAnswer)); - } - - user.setLastLoginAt(LocalDateTime.now()); - user.setFailedLoginAttempts(0); - user.setActive(true); - - User savedUser = userRepository.save(user); - - AuthToken authToken = new AuthToken(); - authToken.setToken(generateAuthToken()); - authToken.setUser(savedUser); - - return authTokenRepository.save(authToken); - } - - @Transactional - public void logout(String token) { - authTokenRepository.findByToken(token) - .ifPresent(authTokenRepository::delete); - } - - @Transactional - public AuthToken generateAuthToken(User user) { - return authTokenRepository.save(genereateAuthToken(user)); - } - - public AuthToken getAuthToken(String token) { - return authTokenRepository.findByToken(token).orElse(null); - } - - private AuthToken genereateAuthToken(User user) { - AuthToken authToken = new AuthToken(); - authToken.setToken(generateAuthToken()); - authToken.setUser(user); - - return authToken; - } - - private String generateAuthToken() { - byte[] bytes = new byte[32]; - secureRandom.nextBytes(bytes); - return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes); - } - - private void createCompanyAccount(RegRequest request, User user) { - Optional byInn = companyRepository.findByInn(request.getInn()); - - if (byInn.isPresent()) { - throw new CompanyAlreadyExist("Company was already created"); - } - - Company company = new Company(); - company.setCompanyName(request.getCompanyName()); - company.setInn(request.getInn()); - - TariffInfo companyTariff = tariffInfoService.createTariffInfo(TariffType.DEMO); - company.setTariffInfo(companyTariff); - - companyRepository.save(company); - tariffInfoService.addTariffInfo(companyTariff); - - user.setCompany(company); - user.grantPermission(Permission.COMPANY_ADMIN_PERMISSIONS); - } - - private void createIndividualAccount(User user) { - TariffInfo personalTariff = tariffInfoService.createTariffInfo(TariffType.DEMO); - - tariffInfoService.addTariffInfo(personalTariff); - - user.setPersonalTariffInfo(personalTariff); - user.grantPermission(Permission.DEFAULT_USER_PERMISSIONS); - } - - - private void createIndividualCompanyAccount(RegRequest request, User user) { - String authToken = request.getAuthToken(); - Long userIdByToken = authTokenRepository.findUserIdByToken(authToken); - User companyUser = userRepository.findById(userIdByToken) - .orElseThrow(() -> new EntityNotFoundException("Not found token: " + authToken)); - - Company company = companyUser.getCompany(); - if (company == null) { - throw new IllegalStateException("Not have company"); - } - - TariffInfo tariffInfo = company.getTariffInfo(); - if (tariffInfo == null) { - throw new IllegalStateException("Company not have tariff"); - } - -// Tariff tariff = tariffInfo.getTariff(); -// Long maxUsers = tariff.getMaxUsers(); -// long currentCountUsers = userRepository.countByCompanyId(company.getId()); -// -// if (currentCountUsers >= maxUsers) { -// throw new NotValidFieldException("Max user is over.", new BaseResponse(20002, -// MessageCode.USER_LIMIT_IS_OVER.getCode(), -// MessageCode.USER_LIMIT_IS_OVER.getDescription(), Map.of( -// "limit", maxUsers, "countUser", currentCountUsers))); -// } - - user.setCompany(company); - user.grantPermission(Permission.DEFAULT_USER_PERMISSIONS); - } - - public void blockUser(User user) { - Optional existing = userNotActiveRepository.findByUserId(user.getId()); - if (existing.isEmpty()) { - LocalDateTime now = LocalDateTime.now(); - - UserNotActive notActive = UserNotActive.builder() - .user(user) - .createdAt(now) - .blockedUntil(now.plusMinutes(15)) - .build(); - - userNotActiveRepository.save(notActive); - } - } -} diff --git a/src/main/java/ru/soune/nocopy/service/user/UserService.java b/src/main/java/ru/soune/nocopy/service/user/UserService.java index abfeecb..45569ed 100644 --- a/src/main/java/ru/soune/nocopy/service/user/UserService.java +++ b/src/main/java/ru/soune/nocopy/service/user/UserService.java @@ -1,21 +1,31 @@ package ru.soune.nocopy.service.user; +import jakarta.persistence.EntityNotFoundException; import lombok.AllArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import ru.soune.nocopy.dto.register.AccountType; import ru.soune.nocopy.dto.register.ChangePasswordRequest; +import ru.soune.nocopy.dto.register.RegRequest; import ru.soune.nocopy.dto.tarriff.TariffInfoDTO; import ru.soune.nocopy.dto.user.UserDTO; import ru.soune.nocopy.dto.user.UserRequest; +import ru.soune.nocopy.entity.company.Company; import ru.soune.nocopy.entity.tarif.Tariff; import ru.soune.nocopy.entity.tarif.TariffInfo; +import ru.soune.nocopy.entity.tarif.TariffType; +import ru.soune.nocopy.entity.user.Permission; import ru.soune.nocopy.entity.user.User; +import ru.soune.nocopy.exception.CompanyAlreadyExist; import ru.soune.nocopy.exception.InvalidUserEmail; import ru.soune.nocopy.exception.NotValidationPasswordException; import ru.soune.nocopy.exception.UserNotFoundException; +import ru.soune.nocopy.repository.AuthTokenRepository; +import ru.soune.nocopy.repository.CompanyRepository; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.file.FileStatsService; +import ru.soune.nocopy.service.tariff.TariffInfoService; import java.util.List; import java.util.Optional; @@ -30,6 +40,12 @@ public class UserService { private final FileStatsService fileStatsService; + private final CompanyRepository companyRepository; + + private final TariffInfoService tariffInfoService; + + private final AuthTokenRepository authTokenRepository; + @Transactional public User changePassword(User user, ChangePasswordRequest request) { if (!passwordEncoder.matches(request.getCurrentPassword(), user.getPassword())) { @@ -82,6 +98,95 @@ public class UserService { return userRepository.save(user); } + @Transactional + public User createUser(RegRequest registerRequest, boolean verified) { + User user = new User(); + user.setFullName(registerRequest.getFullName()); + user.setEmail(registerRequest.getEmail()); + user.setPassword(passwordEncoder.encode(registerRequest.getPassword())); + user.setActive(!verified); + user.setEmailVerified(!verified); + + AccountType accountType = AccountType.valueOf(registerRequest.getAccountType().toUpperCase()); + + if (accountType == AccountType.B2B && registerRequest.getCompanyName() != null) { + try { + createCompanyAccount(registerRequest, user); + } catch (CompanyAlreadyExist exist) { + throw new CompanyAlreadyExist("Company already exist"); + } + } else if (accountType == AccountType.B2C && registerRequest.getCompanyName() == null) { + createIndividualAccount(user); + } else { + createIndividualCompanyAccount(registerRequest, user); + } + + if (registerRequest.getPhone() != null) { + user.setPhone(registerRequest.getPhone()); + } + + return userRepository.save(user); + } + + public Optional getUserById(Long userId) { + return userRepository.findById(userId); + } + + public boolean existsByEmailOrPhone(String email, String phone){ + return userRepository.existsByEmail(email) || userRepository.existsByPhone(phone); + } + + private void createCompanyAccount(RegRequest request, User user) { + Optional byInn = companyRepository.findByInn(request.getInn()); + + if (byInn.isPresent()) { + throw new CompanyAlreadyExist("Company was already created"); + } + + Company company = new Company(); + company.setCompanyName(request.getCompanyName()); + company.setInn(request.getInn()); + + TariffInfo companyTariff = tariffInfoService.createTariffInfo(TariffType.DEMO); + company.setTariffInfo(companyTariff); + + companyRepository.save(company); + tariffInfoService.addTariffInfo(companyTariff); + + user.setCompany(company); + user.grantPermission(Permission.COMPANY_ADMIN_PERMISSIONS); + } + + private void createIndividualAccount(User user) { + TariffInfo personalTariff = tariffInfoService.createTariffInfo(TariffType.DEMO); + + tariffInfoService.addTariffInfo(personalTariff); + + user.setPersonalTariffInfo(personalTariff); + user.grantPermission(Permission.DEFAULT_USER_PERMISSIONS); + } + + + private void createIndividualCompanyAccount(RegRequest request, User user) { + String authToken = request.getAuthToken(); + Long userIdByToken = authTokenRepository.findUserIdByToken(authToken); + User companyUser = userRepository.findById(userIdByToken) + .orElseThrow(() -> new EntityNotFoundException("Not found token: " + authToken)); + + Company company = companyUser.getCompany(); + if (company == null) { + throw new IllegalStateException("Not have company"); + } + + TariffInfo tariffInfo = company.getTariffInfo(); + if (tariffInfo == null) { + throw new IllegalStateException("Company not have tariff"); + } + + user.setCompany(company); + user.grantPermission(Permission.DEFAULT_USER_PERMISSIONS); + } + private void updateUserFromRequest(User user, UserRequest request) { if (request.getFullName() != null) { user.setFullName(request.getFullName()); diff --git a/src/main/java/ru/soune/nocopy/util/JwtAuthFilter.java b/src/main/java/ru/soune/nocopy/util/JwtAuthFilter.java new file mode 100644 index 0000000..c89260a --- /dev/null +++ b/src/main/java/ru/soune/nocopy/util/JwtAuthFilter.java @@ -0,0 +1,55 @@ +package ru.soune.nocopy.util; + +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import ru.soune.nocopy.dto.BaseResponse; +import ru.soune.nocopy.dto.MessageCode; + +import java.io.IOException; + +@Component +@RequiredArgsConstructor +public class JwtAuthFilter extends OncePerRequestFilter { + + private final JwtUtil jwtUtil; + + private final ObjectMapper objectMapper; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws ServletException, IOException { + + String authHeader = request.getHeader("Authorization"); + + if (authHeader == null || !authHeader.startsWith("Bearer ")) { + filterChain.doFilter(request, response); + return; + } + + String token = authHeader.substring(7); + + if (!jwtUtil.validateToken(token)) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json"); + + BaseResponse errorResponse = BaseResponse.builder() + .messageCode(MessageCode.INVALID_CREDENTIALS.getCode()) + .messageDesc("Invalid or expired token") + .build(); + + response.getWriter().write(objectMapper.writeValueAsString(errorResponse)); + return; + } + + request.setAttribute("userId", jwtUtil.extractUserId(token)); + request.setAttribute("email", jwtUtil.extractEmail(token)); + + filterChain.doFilter(request, response); + } +} diff --git a/src/main/java/ru/soune/nocopy/util/JwtUtil.java b/src/main/java/ru/soune/nocopy/util/JwtUtil.java new file mode 100644 index 0000000..42aa317 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/util/JwtUtil.java @@ -0,0 +1,76 @@ +package ru.soune.nocopy.util; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.security.Keys; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.crypto.SecretKey; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Component +public class JwtUtil { + + @Value("${jwt.secret:Z29nb3Bvd2VycmFuZ2VydHVtYmF5YW1iZjMyNDIyMjh3aW5lcndpbmVy}") + private String secret; + + @Value("${jwt.expiration:3600000}") + private Long expiration; + + private SecretKey getSigningKey() { + return Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8)); + } + + public String generateToken(Long userId, String email) { + Map claims = new HashMap<>(); + claims.put("userId", userId); + claims.put("email", email); + + return Jwts.builder() + .setClaims(claims) + .setSubject(email) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + expiration)) + .signWith(getSigningKey()) + .compact(); + } + + + public String extractEmail(String token) { + return extractAllClaims(token).getSubject(); + } + + public Long extractUserId(String token) { + return extractAllClaims(token).get("userId", Long.class); + } + + public String extractRole(String token) { + return extractAllClaims(token).get("role", String.class); + } + + public Date extractExpiration(String token) { + return extractAllClaims(token).getExpiration(); + } + + private Claims extractAllClaims(String token) { + return Jwts.parser() + .verifyWith(getSigningKey()) + .build() + .parseSignedClaims(token) + .getPayload(); + } + + public Boolean validateToken(String token) { + try { + extractAllClaims(token); + return !extractExpiration(token).before(new Date()); + } catch (Exception e) { + return false; + } + } +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index e0a3021..604d2a2 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -129,6 +129,10 @@ search: host: "193.46.217.94" port: 3128 +jwt: + secret: SF9fsWH0ahlmTk9pKGXVdPHKxkdjUZnquCs9j7gYNZR + expiration: 3600000 + yookassa: secret-key: test_0Yns_0NHV5GJf6ypJ5HC4NSfnLO8SJkw-1PwrVWsDl4 shop-id: 1276731