Merge branch 'NCBACK-162' into dev
Test Workflow / test (push) Has been cancelled

# Conflicts:
#	src/main/java/ru/soune/nocopy/controller/FileController.java
This commit is contained in:
2026-06-03 10:45:18 +07:00
64 changed files with 762 additions and 1007 deletions
+5
View File
@@ -81,6 +81,11 @@ dependencies {
//cache //cache
implementation("org.springframework.boot:spring-boot-starter-cache:4.0.6") implementation("org.springframework.boot:spring-boot-starter-cache:4.0.6")
implementation 'com.github.ben-manes.caffeine:caffeine' 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') { tasks.named('test') {
@@ -26,10 +26,6 @@ import java.util.concurrent.TimeUnit;
@EnableCaching @EnableCaching
public class ApplicationConfig { public class ApplicationConfig {
// private final FileEntityRepository fileEntityRepository;
// private final FileUtil fileUtil;
@Bean @Bean
PasswordEncoder passwordEncoder() { PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); return new BCryptPasswordEncoder();
@@ -46,9 +42,6 @@ public class ApplicationConfig {
AudioFilePathProvider audioFilePathProvider, AudioFilePathProvider audioFilePathProvider,
DocumentLocalSearch documentLocalSearch) { DocumentLocalSearch documentLocalSearch) {
// List<FileProtector.FileInfo> initialFiles = loadProcessingFile();
//TODO инициализация файлов при создании
return new com.vrt.NoCopyFileService( return new com.vrt.NoCopyFileService(
Collections.emptyList(), Collections.emptyList(),
fileProvider, fileProvider,
@@ -76,12 +69,5 @@ public class ApplicationConfig {
return cacheManager; return cacheManager;
} }
// private List<FileProtector.FileInfo> loadProcessingFile() {
// List<FileEntity> byProtectionStatus =
// fileEntityRepository.findByProtectionStatus(ProtectionStatus.PROCESSING);
//
// return byProtectionStatus.stream().map(fileEntity ->
// fileUtil.createFileInfo(fileEntity, null)).toList();
// }
} }
@@ -9,14 +9,33 @@ import java.util.Map;
@Configuration @Configuration
public class HandlerConfig { public class HandlerConfig {
/*
RegRequestHandler
LoginRequestHandler
FileUploadHandler
FileEntityHandler
ImageFoundRequestHandler
VerifyRegisterUserHandler
TariffHandler
ReferralHandler
ResetPasswordHandler
MonitoringHandler
GlobalSearchHandler
ComplaintEntityHandler
ViolationNotionHandler
NotificationHandler
TokenOperationHandler
DockViewFileHandler
*/
/*
Убрать
LogoutRequestHandler logoutHandler
*/
@Bean @Bean
public Map<Integer, RequestHandler> handlers( public Map<Integer, RequestHandler> handlers(
RegRequestHandler reg,
LoginRequestHandler login,
FileUploadHandler upload, FileUploadHandler upload,
FileEntityHandler file, FileEntityHandler file,
LogoutRequestHandler logoutHandler,
ImageFoundRequestHandler imageFoundRequestHandler, ImageFoundRequestHandler imageFoundRequestHandler,
VerifyRegisterUserHandler verifyRegisterUser, VerifyRegisterUserHandler verifyRegisterUser,
AuthRequestHandler authRequestHandler, AuthRequestHandler authRequestHandler,
@@ -24,8 +43,6 @@ public class HandlerConfig {
TariffHandler tariffHandler, TariffHandler tariffHandler,
TariffInfoHandler tariffInfoHandler, TariffInfoHandler tariffInfoHandler,
ReferralHandler referralHandler, ReferralHandler referralHandler,
ResetPasswordHandler resetPasswordHandler,
DaDataHandler daDataHandler,
PaymentHandler paymentHandler, PaymentHandler paymentHandler,
CostHandler costHandler, CostHandler costHandler,
MonitoringHandler monitoringHandler, MonitoringHandler monitoringHandler,
@@ -39,23 +56,19 @@ public class HandlerConfig {
UserVerificationHandler userVerificationHandler, UserVerificationHandler userVerificationHandler,
LawCaseHandler lawCaseHandler, LawCaseHandler lawCaseHandler,
TokenOperationHandler tokenOperationHandler, TokenOperationHandler tokenOperationHandler,
MonitoringStatisticHandler monitoringStatisticHandler,
DockViewFileHandler dockViewFileHandler DockViewFileHandler dockViewFileHandler
) { ) {
Map<Integer, RequestHandler> map = new HashMap<>(); Map<Integer, RequestHandler> map = new HashMap<>();
map.put(20001, login);
map.put(20002, reg);
map.put(20004, upload); map.put(20004, upload);
map.put(20005, file); map.put(20005, file);
map.put(20006, logoutHandler);
map.put(20007, imageFoundRequestHandler); map.put(20007, imageFoundRequestHandler);
map.put(20008, authRequestHandler); map.put(20008, authRequestHandler);
map.put(20009, verifyRegisterUser); map.put(20009, verifyRegisterUser);
map.put(20010, resetPasswordHandler);
map.put(30000, companyHandler); map.put(30000, companyHandler);
map.put(30001, tariffHandler); map.put(30001, tariffHandler);
map.put(30002, tariffInfoHandler); map.put(30002, tariffInfoHandler);
map.put(30003, referralHandler); map.put(30003, referralHandler);
map.put(30004, daDataHandler);
map.put(30005, paymentHandler); map.put(30005, paymentHandler);
map.put(30007, monitoringHandler); map.put(30007, monitoringHandler);
map.put(30008, costHandler); map.put(30008, costHandler);
@@ -69,6 +82,7 @@ public class HandlerConfig {
map.put(30016, userVerificationHandler); map.put(30016, userVerificationHandler);
map.put(30017, lawCaseHandler); map.put(30017, lawCaseHandler);
map.put(30018, tokenOperationHandler); map.put(30018, tokenOperationHandler);
map.put(30027, monitoringStatisticHandler);
map.put(30028, dockViewFileHandler); map.put(30028, dockViewFileHandler);
return map; return map;
@@ -85,7 +99,6 @@ public class HandlerConfig {
StatisticSubscriberHandler statisticSubscriberHandler, StatisticSubscriberHandler statisticSubscriberHandler,
StatisticTokenHandler statisticTokenHandler, StatisticTokenHandler statisticTokenHandler,
StatisticIncomeHandler statisticIncomeHandler, StatisticIncomeHandler statisticIncomeHandler,
MonitoringStatisticHandler monitoringStatisticHandler,
FileInteranlInfoHandler fileInfo, FileInteranlInfoHandler fileInfo,
TariffInformationHandler tariffInformationHandler, TariffInformationHandler tariffInformationHandler,
UserInfoHandler userInfoHandler UserInfoHandler userInfoHandler
@@ -101,7 +114,6 @@ public class HandlerConfig {
map.put(30024, statisticSubscriberHandler); map.put(30024, statisticSubscriberHandler);
map.put(30025, statisticTokenHandler); map.put(30025, statisticTokenHandler);
map.put(30026, statisticIncomeHandler); map.put(30026, statisticIncomeHandler);
map.put(30027, monitoringStatisticHandler);
map.put(30029, statisticComplaintHandler); map.put(30029, statisticComplaintHandler);
map.put(40001, fileInfo); map.put(40001, fileInfo);
map.put(40004, tariffInformationHandler); map.put(40004, tariffInformationHandler);
@@ -125,4 +137,21 @@ public class HandlerConfig {
return map; return map;
} }
@Bean
public Map<Integer, RequestHandler> authHandler(
RegRequestHandler reg,
LoginRequestHandler login,
DaDataHandler daDataHandler,
ResetPasswordHandler resetPasswordHandler
)
{
Map<Integer, RequestHandler> map = new HashMap<>();
map.put(20001, login);
map.put(20002, reg);
map.put(30004, daDataHandler);
map.put(20010, resetPasswordHandler);
return map;
}
} }
@@ -0,0 +1,40 @@
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()
.requestMatchers("/check/api/**").permitAll()
.requestMatchers("/internal/**").permitAll()
.anyRequest().authenticated()
)
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
@@ -5,11 +5,10 @@ import com.vrt.fileprotection.FileProtector;
import com.vrt.fileprotection.NoCopyCheckResult; import com.vrt.fileprotection.NoCopyCheckResult;
import com.vrt.fileprotection.audio.AudioCheckResult; import com.vrt.fileprotection.audio.AudioCheckResult;
import com.vrt.fileprotection.documents.DocumentCheckResult; import com.vrt.fileprotection.documents.DocumentCheckResult;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils; 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.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault; 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.CheckCounterService;
import ru.soune.nocopy.service.file.ProtectionsLimitService; import ru.soune.nocopy.service.file.ProtectionsLimitService;
import ru.soune.nocopy.service.file.cloud.CloudStorageService; 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 software.amazon.awssdk.services.s3.model.NoSuchKeyException;
import java.io.File; import java.io.File;
@@ -67,9 +64,9 @@ public class ApiController {
private final Map<Integer, RequestHandler> internalControlHandler; private final Map<Integer, RequestHandler> internalControlHandler;
private final FileEntityService fileEntityService; private final Map<Integer, RequestHandler> authHandler;
private final AuthService authService; private final FileEntityService fileEntityService;
private final FileSimilarityService fileSimilarityService; private final FileSimilarityService fileSimilarityService;
@@ -77,7 +74,7 @@ public class ApiController {
private final NoCopyFileService noCopyFileService; private final NoCopyFileService noCopyFileService;
private final FileUtil fileUtil; private final HttpServletRequest httpServletRequest;
private final ProtectionsLimitService protectionsLimitService; 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") @PostMapping("/internal/data-info")
public ResponseEntity<?> handleInternalInfoPostRequest(@RequestBody BaseRequest request) { public ResponseEntity<?> handleInternalInfoPostRequest(@RequestBody BaseRequest request) {
Integer msgId = request.getMsgId(); Integer msgId = request.getMsgId();
@@ -276,8 +313,7 @@ public class ApiController {
@RequestParam(value = "upload_id", required = false) String uploadId, @RequestParam(value = "upload_id", required = false) String uploadId,
@RequestParam(value = "chunk_number", required = false) Integer chunkNumber, @RequestParam(value = "chunk_number", required = false) Integer chunkNumber,
@RequestParam(value = "chunk", required = false) MultipartFile chunk, @RequestParam(value = "chunk", required = false) MultipartFile chunk,
@RequestParam(value = "last_file", required = false) Boolean last_file, @RequestParam(value = "last_file", required = false) Boolean last_file) {
@RequestParam(value = "token") String token) {
try { try {
if (chunk == null || chunk.isEmpty()) { if (chunk == null || chunk.isEmpty()) {
return buildErrorResponse(uploadId, chunkNumber, "Chunk file null or empty"); 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"); 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, UploadProgressResponse uploadProgressResponse = fileUploadService.uploadPassportChunk(uploadId, chunkNumber,
chunk, userId); chunk, userId);
@@ -325,7 +361,6 @@ public class ApiController {
public ResponseEntity<BaseResponse> findSimilarFiles( public ResponseEntity<BaseResponse> findSimilarFiles(
@PathVariable("version") int version, @PathVariable("version") int version,
@PathVariable String fileId, @PathVariable String fileId,
@RequestParam(value = "auth_token", required = false) String authToken,
@RequestParam(required = false) List<String> similarityLevels, @RequestParam(required = false) List<String> similarityLevels,
@PageableDefault(size = 20, sort = "hammingDistance") Pageable pageable) { @PageableDefault(size = 20, sort = "hammingDistance") Pageable pageable) {
@@ -337,10 +372,12 @@ public class ApiController {
MessageCode.INVALID_FIELD.getDescription(), null)); MessageCode.INVALID_FIELD.getDescription(), null));
} }
Long userId = (Long) httpServletRequest.getAttribute("userId");
BaseResponse response; BaseResponse response;
if ("image".equals(fileEntity.getMimeType())) { if ("image".equals(fileEntity.getMimeType())) {
Page<SimilarFileDTO> similarFilesPage = fileSimilarityService.findSimilarFiles( Page<SimilarFileDTO> similarFilesPage = fileSimilarityService.findSimilarFiles(
fileId, similarityLevels, pageable, authToken); fileId, similarityLevels, pageable, userId);
response = buildSuccessResponse(similarFilesPage, MessageCode.SIMILAR_FILES_FOUND); response = buildSuccessResponse(similarFilesPage, MessageCode.SIMILAR_FILES_FOUND);
} else { } else {
List<SimilarFileDTO> results = processNonImageFile(fileEntity, true); List<SimilarFileDTO> results = processNonImageFile(fileEntity, true);
@@ -588,7 +625,7 @@ public class ApiController {
errorData)); errorData));
} }
Long userId = authService.useUserAuthToken(tokenHeader); Long userId = (Long) httpServletRequest.getAttribute("userId");
FileEntityResponse entityResponse = fileEntityService.getById(fileId, version); FileEntityResponse entityResponse = fileEntityService.getById(fileId, version);
FileStatus status = entityResponse.getStatus(); FileStatus status = entityResponse.getStatus();
@@ -676,8 +713,8 @@ public class ApiController {
@PostMapping("/file/link") @PostMapping("/file/link")
public ResponseEntity<?> downloadFile(@RequestBody DocViewerRequest viewerRequest) { public ResponseEntity<?> downloadFile(@RequestBody DocViewerRequest viewerRequest) {
try { try {
String tokenHeader = viewerRequest.getToken(); Long userId = httpServletRequest.getAttribute("userId") == null ? 0L:
Long userId = tokenHeader == null ? 0L: authService.useUserAuthToken(tokenHeader); (Long) httpServletRequest.getAttribute("userId");
if (viewerRequest.getFileId() == null) { if (viewerRequest.getFileId() == null) {
return ResponseEntity.ok().body(new BaseResponse(0, return ResponseEntity.ok().body(new BaseResponse(0,
@@ -735,14 +772,10 @@ public class ApiController {
} }
@GetMapping("/check/file_stats") @GetMapping("/check/file_stats")
public ResponseEntity<?> checkFileProtectStats(@RequestHeader("Authorization") String tokenHeader) { public ResponseEntity<?> checkFileProtectStats() {
String token = tokenHeader.replace("Bearer ", ""); Long userId = (Long) httpServletRequest.getAttribute("userId");
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token); Map<String, Object> fileTypeStats = protectionsLimitService.getFileTypeStats(userId);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
Map<String, Object> fileTypeStats = protectionsLimitService.getFileTypeStats(authToken.getUser().getId());
return ResponseEntity.ok().body(fileTypeStats); return ResponseEntity.ok().body(fileTypeStats);
} }
@@ -18,6 +18,8 @@ import ru.soune.nocopy.entity.user.ProtectedFileCheck;
import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.entity.user.User;
import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.repository.FileEntityRepository;
import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.repository.UserRepository;
import ru.soune.nocopy.service.file.CheckCounterService;
import ru.soune.nocopy.service.file.ZipService;
import ru.soune.nocopy.service.file.*; import ru.soune.nocopy.service.file.*;
import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.service.file.cloud.CloudStorageService;
import ru.soune.nocopy.util.FileUtil; import ru.soune.nocopy.util.FileUtil;
@@ -34,8 +36,6 @@ import java.nio.charset.StandardCharsets;
@AllArgsConstructor @AllArgsConstructor
public class FileController { public class FileController {
private FileStorageService fileStorageService;
private FileEntityRepository fileRepository; private FileEntityRepository fileRepository;
private CheckCounterService checkCounterService; private CheckCounterService checkCounterService;
@@ -1,5 +1,6 @@
package ru.soune.nocopy.controller; package ru.soune.nocopy.controller;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@@ -13,9 +14,7 @@ import ru.soune.nocopy.dto.violation.ViolationRequest;
import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.file.FileEntity;
import ru.soune.nocopy.entity.search.GlobalSearchTask; import ru.soune.nocopy.entity.search.GlobalSearchTask;
import ru.soune.nocopy.entity.search.SearchStatus; import ru.soune.nocopy.entity.search.SearchStatus;
import ru.soune.nocopy.exception.NotFoundAuthToken;
import ru.soune.nocopy.repository.GlobalSearchTaskRepository; 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.search.GlobalSearchService;
import ru.soune.nocopy.service.violation.ViolationService; import ru.soune.nocopy.service.violation.ViolationService;
@@ -27,31 +26,20 @@ import java.util.*;
@RequiredArgsConstructor @RequiredArgsConstructor
public class GlobalSearchController { public class GlobalSearchController {
private final AuthService authService;
private final GlobalSearchService globalSearchService; private final GlobalSearchService globalSearchService;
private final GlobalSearchTaskRepository globalSearchTaskRepository;
private final GlobalSearchTaskRepository searchTaskRepository; private final GlobalSearchTaskRepository searchTaskRepository;
private final ViolationService violationService; private final ViolationService violationService;
private final HttpServletRequest httpServletRequest;
@PostMapping("/start") @PostMapping("/start")
public ResponseEntity<?> startSearch( public ResponseEntity<?> startSearch(
@RequestBody GlobalSearchStartRequest request, @RequestBody GlobalSearchStartRequest request) {
@RequestHeader(value = "Authorization", required = false) String tokenHeader) {
if (tokenHeader == null || tokenHeader.isBlank()) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
GlobalSearchStartResponse response = new GlobalSearchStartResponse(); GlobalSearchStartResponse response = new GlobalSearchStartResponse();
try { Long userId = (Long) httpServletRequest.getAttribute("userId");
Long userId = authService.useUserAuthToken(tokenHeader);
List<FileEntity> filesToProcess = globalSearchService.getFilesToProcess(request, userId); List<FileEntity> filesToProcess = globalSearchService.getFilesToProcess(request, userId);
@@ -62,69 +50,33 @@ public class GlobalSearchController {
response.setTaskId(taskId); response.setTaskId(taskId);
response.setStatus(SearchStatus.ACCEPTED.name()); response.setStatus(SearchStatus.ACCEPTED.name());
response.setTotalFiles(filesToProcess.size()); response.setTotalFiles(filesToProcess.size());
} catch (NotFoundAuthToken e) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
return ResponseEntity.ok(response); return ResponseEntity.ok(response);
} }
@GetMapping("/actual-task") @GetMapping("/actual-task")
public ResponseEntity<?> getStatus(@RequestHeader(value = "Authorization", required = false) String tokenHeader) { public ResponseEntity<?> getStatus() {
if (tokenHeader == null || tokenHeader.isBlank()) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
Optional<GlobalSearchTask> taskOptional; Optional<GlobalSearchTask> taskOptional;
try { Long userId = (Long) httpServletRequest.getAttribute("userId");
Long userId = authService.useUserAuthToken(tokenHeader);
taskOptional = searchTaskRepository.findByUserIdAndStatus(userId, taskOptional = searchTaskRepository.findByUserIdAndStatus(userId,
"PROCESSING"); "PROCESSING");
if (taskOptional.isEmpty()) return ResponseEntity.ok().body("Task not found"); if (taskOptional.isEmpty()) return ResponseEntity.ok().body("Task not found");
} catch (NotFoundAuthToken e) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
return ResponseEntity.ok(taskOptional.get()); return ResponseEntity.ok(taskOptional.get());
} }
@GetMapping("/violation-summary") @GetMapping("/violation-summary")
public ResponseEntity<?> getSummary(@RequestHeader(value = "Authorization", required = false) String tokenHeader) { public ResponseEntity<?> getSummary() {
if (tokenHeader == null || tokenHeader.isBlank()) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
List<FileViolationSummaryDTO> fileViolationsSummary; List<FileViolationSummaryDTO> fileViolationsSummary;
try { Long userId = (Long) httpServletRequest.getAttribute("userId");
Long userId = authService.useUserAuthToken(tokenHeader);
fileViolationsSummary = violationService.getFileViolationsSummary(userId); fileViolationsSummary = violationService.getFileViolationsSummary(userId);
if (fileViolationsSummary.isEmpty()) return ResponseEntity.ok().body("Violations summary not found"); if (fileViolationsSummary.isEmpty()) return ResponseEntity.ok().body("Violations summary not found");
} catch (NotFoundAuthToken e) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
return ResponseEntity.ok(fileViolationsSummary); return ResponseEntity.ok(fileViolationsSummary);
} }
@@ -132,42 +84,18 @@ public class GlobalSearchController {
@PostMapping("/violation-summary-with-files") @PostMapping("/violation-summary-with-files")
public ResponseEntity<?> getViolations(@RequestBody ViolationRequest request) { public ResponseEntity<?> getViolations(@RequestBody ViolationRequest request) {
if (request.getToken() == null || request.getToken().isBlank()) { Long userId = (Long) httpServletRequest.getAttribute("userId");
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", request.getToken());
return ResponseEntity.ok().body(Map.of("error", errorData));
}
try {
Long userId = authService.useUserAuthToken(request.getToken());
Page<FileViolationSummaryDTO> result = violationService.getFileViolationsSummary( Page<FileViolationSummaryDTO> result = violationService.getFileViolationsSummary(
userId, request.getFileName(), request.getSortDirection(), userId, request.getFileName(), request.getSortDirection(),
request.getPage(), request.getSize(), request.getStartDate(), request.getEndDate()); request.getPage(), request.getSize(), request.getStartDate(), request.getEndDate());
return ResponseEntity.ok(result); return ResponseEntity.ok(result);
} catch (NotFoundAuthToken e) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", request.getToken());
return ResponseEntity.ok().body(Map.of("error", errorData));
}
} }
@GetMapping("/status/{taskId}") @GetMapping("/status/{taskId}")
public ResponseEntity<?> getStatus(@PathVariable String taskId, public ResponseEntity<?> getStatus(@PathVariable String taskId) {
@RequestHeader(value = "Authorization", required = false) String tokenHeader) {
if (tokenHeader == null || tokenHeader.isBlank()) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
GlobalSearchStatusResponse response; GlobalSearchStatusResponse response;
Long userId = (Long) httpServletRequest.getAttribute("userId");
try {
Long userId = authService.useUserAuthToken(tokenHeader);
Optional<GlobalSearchTask> taskOptional = searchTaskRepository.findByTaskIdAndUserId(taskId, userId); Optional<GlobalSearchTask> taskOptional = searchTaskRepository.findByTaskIdAndUserId(taskId, userId);
@@ -181,12 +109,7 @@ public class GlobalSearchController {
response.setTaskId(taskId); response.setTaskId(taskId);
response.setStatus(task.getStatus()); response.setStatus(task.getStatus());
response.setProgress(progress); response.setProgress(progress);
} catch (NotFoundAuthToken e) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
return ResponseEntity.ok(response); return ResponseEntity.ok(response);
} }
@@ -1,17 +1,16 @@
package ru.soune.nocopy.controller; package ru.soune.nocopy.controller;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import ru.soune.nocopy.dto.search.GlobalSearchStartResponse;
import ru.soune.nocopy.entity.payment.Payment; import ru.soune.nocopy.entity.payment.Payment;
import ru.soune.nocopy.exception.PaymentNotFoundException; import ru.soune.nocopy.exception.PaymentNotFoundException;
import ru.soune.nocopy.exception.TariffNotFoundException; import ru.soune.nocopy.exception.TariffNotFoundException;
import ru.soune.nocopy.exception.UserNotFoundException; import ru.soune.nocopy.exception.UserNotFoundException;
import ru.soune.nocopy.service.payment.PaymentService; import ru.soune.nocopy.service.payment.PaymentService;
import ru.soune.nocopy.service.register.AuthService;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -24,7 +23,7 @@ public class PaymentController {
private final PaymentService paymentService; private final PaymentService paymentService;
private final AuthService authService; private final HttpServletRequest httpServletRequest;
@PostMapping("/create") @PostMapping("/create")
public ResponseEntity<?> createPayment(@RequestParam String email, @RequestParam Long tariffId, public ResponseEntity<?> createPayment(@RequestParam String email, @RequestParam Long tariffId,
@@ -69,7 +68,9 @@ public class PaymentController {
return ResponseEntity.ok().body(Map.of("error", errorData)); 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)); return ResponseEntity.ok(Map.of("message", "Auto-renewal changed:" + renewal));
} catch (UserNotFoundException e) { } catch (UserNotFoundException e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND) return ResponseEntity.status(HttpStatus.NOT_FOUND)
@@ -88,7 +89,9 @@ public class PaymentController {
return ResponseEntity.ok().body(Map.of("error", errorData)); 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")); return ResponseEntity.ok(Map.of("message", "Payment method deleted"));
} catch (UserNotFoundException e) { } catch (UserNotFoundException e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND) return ResponseEntity.status(HttpStatus.NOT_FOUND)
@@ -109,8 +112,9 @@ public class PaymentController {
return ResponseEntity.ok().body(Map.of("error", errorData)); return ResponseEntity.ok().body(Map.of("error", errorData));
} }
return ResponseEntity.ok(paymentService.getUserPaymentMethods( Long userId = (Long) httpServletRequest.getAttribute("userId");
authService.useUserAuthToken(tokenHeader)));
return ResponseEntity.ok(paymentService.getUserPaymentMethods(userId));
} catch (UserNotFoundException e) { } catch (UserNotFoundException e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND) return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Map.of("error", e.getMessage())); .body(Map.of("error", e.getMessage()));
@@ -1,6 +1,7 @@
package ru.soune.nocopy.controller; package ru.soune.nocopy.controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -12,20 +13,16 @@ import ru.soune.nocopy.entity.payout.BankTransferPayoutMethod;
import ru.soune.nocopy.entity.payout.CardPayoutMethod; import ru.soune.nocopy.entity.payout.CardPayoutMethod;
import ru.soune.nocopy.entity.payout.PayoutRequest; import ru.soune.nocopy.entity.payout.PayoutRequest;
import ru.soune.nocopy.entity.payout.PayoutType; import ru.soune.nocopy.entity.payout.PayoutType;
import ru.soune.nocopy.entity.user.AuthToken;
import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.entity.user.User;
import ru.soune.nocopy.exception.InsufficientFundsException; import ru.soune.nocopy.exception.InsufficientFundsException;
import ru.soune.nocopy.exception.InvalidPayoutMethodException; import ru.soune.nocopy.exception.InvalidPayoutMethodException;
import ru.soune.nocopy.exception.NotFoundAuthToken;
import ru.soune.nocopy.exception.PendingPayoutExistsException; import ru.soune.nocopy.exception.PendingPayoutExistsException;
import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.service.payout.PayoutMethodService; import ru.soune.nocopy.service.payout.PayoutMethodService;
import ru.soune.nocopy.service.payout.PayoutRequestService; import ru.soune.nocopy.service.payout.PayoutRequestService;
import ru.soune.nocopy.service.user.UserService;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@RestController @RestController
@@ -38,21 +35,21 @@ public class PayoutController {
private final PayoutMethodService payoutMethodService; private final PayoutMethodService payoutMethodService;
private final AuthTokenRepository authTokenRepository; private final HttpServletRequest httpServletRequest;
private final UserService userService;
/* /*
Create payout Create payout
*/ */
@PostMapping("/create-request") @PostMapping("/create-request")
public ResponseEntity<?> createPayoutRequest(@RequestHeader("Authorization") String tokenHeader, public ResponseEntity<?> createPayoutRequest(@Valid @RequestBody PayoutRequestDTO request) {
@Valid @RequestBody PayoutRequestDTO request) { Long userId = (Long) httpServletRequest.getAttribute("userId");
String token = tokenHeader.replace("Bearer ", ""); User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token); if (user == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found with id: " + userId);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); }
User user = authToken.getUser();
try { try {
PayoutRequest payoutRequest = payoutRequestService.createPayoutRequest(user.getId(), request); PayoutRequest payoutRequest = payoutRequestService.createPayoutRequest(user.getId(), request);
@@ -76,15 +73,13 @@ public class PayoutController {
Cancel payout Cancel payout
*/ */
@PostMapping("/requests/{requestId}/cancel") @PostMapping("/requests/{requestId}/cancel")
public ResponseEntity<PayoutRequest> cancelPayoutRequest(@PathVariable Long requestId, public ResponseEntity<PayoutRequest> cancelPayoutRequest(@PathVariable Long requestId) {
@RequestHeader("Authorization") String tokenHeader) { Long userId = (Long) httpServletRequest.getAttribute("userId");
String token = tokenHeader.replace("Bearer ", ""); User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token); if (user == null) {
return ResponseEntity.notFound().build();
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); }
User user = authToken.getUser();
PayoutRequest cancelled = payoutRequestService.cancelPayoutRequest(user.getId(), requestId); PayoutRequest cancelled = payoutRequestService.cancelPayoutRequest(user.getId(), requestId);
@@ -95,14 +90,13 @@ public class PayoutController {
Get user payouts Get user payouts
*/ */
@GetMapping("/requests") @GetMapping("/requests")
public ResponseEntity<List<PayoutRequest>> getUserRequests(@RequestHeader("Authorization") String tokenHeader) { public ResponseEntity<List<PayoutRequest>> getUserRequests() {
String token = tokenHeader.replace("Bearer ", ""); Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token); if (user == null) {
return ResponseEntity.notFound().build();
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); }
User user = authToken.getUser();
return ResponseEntity.ok(payoutRequestService.getUserPayoutRequests(user.getId())); return ResponseEntity.ok(payoutRequestService.getUserPayoutRequests(user.getId()));
} }
@@ -111,15 +105,13 @@ public class PayoutController {
Get payout by id Get payout by id
*/ */
@GetMapping("/requests/{requestId}") @GetMapping("/requests/{requestId}")
public ResponseEntity<PayoutRequest> getPayoutRequest(@PathVariable Long requestId, public ResponseEntity<PayoutRequest> getPayoutRequest(@PathVariable Long requestId) {
@RequestHeader("Authorization") String tokenHeader) { Long userId = (Long) httpServletRequest.getAttribute("userId");
String token = tokenHeader.replace("Bearer ", ""); User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token); if (user == null) {
return ResponseEntity.notFound().build();
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); }
User user = authToken.getUser();
return ResponseEntity.ok(payoutRequestService.getPayoutRequest(user.getId(), requestId)); return ResponseEntity.ok(payoutRequestService.getPayoutRequest(user.getId(), requestId));
} }
@@ -128,14 +120,13 @@ public class PayoutController {
Get payout by id Get payout by id
*/ */
@GetMapping("user/payout-methods") @GetMapping("user/payout-methods")
public ResponseEntity<List<PayoutMethodDTO>> getUserMethods(@RequestHeader("Authorization") String tokenHeader) { public ResponseEntity<List<PayoutMethodDTO>> getUserMethods() {
String token = tokenHeader.replace("Bearer ", ""); Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token); if (user == null) {
return ResponseEntity.notFound().build();
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); }
User user = authToken.getUser();
return ResponseEntity.ok(payoutMethodService.getUserMethods(user.getId())); return ResponseEntity.ok(payoutMethodService.getUserMethods(user.getId()));
} }
@@ -158,15 +149,13 @@ public class PayoutController {
add card method by userId add card method by userId
*/ */
@PostMapping("/payout-method/card") @PostMapping("/payout-method/card")
public ResponseEntity<PayoutMethodDTO> addCardMethod(@Valid @RequestBody AddCardRequest request, public ResponseEntity<PayoutMethodDTO> addCardMethod(@Valid @RequestBody AddCardRequest request) {
@RequestHeader("Authorization") String tokenHeader) { Long userId = (Long) httpServletRequest.getAttribute("userId");
String token = tokenHeader.replace("Bearer ", ""); User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token); if (user == null) {
return ResponseEntity.notFound().build();
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); }
User user = authToken.getUser();
CardPayoutMethod method = payoutMethodService.addCardMethod(user.getId(), request); CardPayoutMethod method = payoutMethodService.addCardMethod(user.getId(), request);
@@ -178,15 +167,13 @@ public class PayoutController {
add bank payout-method add bank payout-method
*/ */
@PostMapping("/payout-method/bank-transfer") @PostMapping("/payout-method/bank-transfer")
public ResponseEntity<PayoutMethodDTO> addBankTransferMethod(@Valid @RequestBody AddBankTransferRequest request, public ResponseEntity<PayoutMethodDTO> addBankTransferMethod(@Valid @RequestBody AddBankTransferRequest request) {
@RequestHeader("Authorization") String tokenHeader) { Long userId = (Long) httpServletRequest.getAttribute("userId");
String token = tokenHeader.replace("Bearer ", ""); User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token); if (user == null) {
return ResponseEntity.notFound().build();
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); }
User user = authToken.getUser();
BankTransferPayoutMethod method = payoutMethodService.addBankTransferMethod(user.getId(), request); BankTransferPayoutMethod method = payoutMethodService.addBankTransferMethod(user.getId(), request);
@@ -199,15 +186,13 @@ public class PayoutController {
set default bank payout-method set default bank payout-method
*/ */
@PutMapping("/payout-method/{methodId}/default") @PutMapping("/payout-method/{methodId}/default")
public ResponseEntity<Void> setDefaultMethod(@PathVariable Long methodId, public ResponseEntity<Void> setDefaultMethod(@PathVariable Long methodId) {
@RequestHeader("Authorization") String tokenHeader) { Long userId = (Long) httpServletRequest.getAttribute("userId");
String token = tokenHeader.replace("Bearer ", ""); User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token); if (user == null) {
return ResponseEntity.notFound().build();
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); }
User user = authToken.getUser();
payoutMethodService.setDefaultMethod(user.getId(), methodId); payoutMethodService.setDefaultMethod(user.getId(), methodId);
@@ -1,5 +1,6 @@
package ru.soune.nocopy.controller; package ru.soune.nocopy.controller;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.crypto.password.PasswordEncoder; 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.dto.user.UserRequest;
import ru.soune.nocopy.entity.tarif.Tariff; import ru.soune.nocopy.entity.tarif.Tariff;
import ru.soune.nocopy.entity.tarif.TariffInfo; 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.entity.user.User;
import ru.soune.nocopy.exception.InvalidUserEmail; import ru.soune.nocopy.exception.InvalidUserEmail;
import ru.soune.nocopy.exception.NotFoundAuthToken;
import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.exception.NotValidFieldException;
import ru.soune.nocopy.exception.UserNotFoundException;
import ru.soune.nocopy.mapper.UserMapper; import ru.soune.nocopy.mapper.UserMapper;
import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.repository.UserRepository;
import ru.soune.nocopy.service.file.FileStatsService; 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.tariff.TariffService;
import ru.soune.nocopy.service.user.UserService; import ru.soune.nocopy.service.user.UserService;
import ru.soune.nocopy.util.JwtUtil;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
@RestController @RestController
@RequestMapping("v1/api/user") @RequestMapping("v1/api/user")
@@ -41,27 +38,21 @@ public class UserController {
private final UserService userService; private final UserService userService;
private final AuthTokenRepository authTokenRepository;
private final UserMapper userMapper; private final UserMapper userMapper;
private final PasswordEncoder passwordEncoder; private final PasswordEncoder passwordEncoder;
private final AuthService authService;
private final TariffService tariffService; private final TariffService tariffService;
private final FileStatsService fileStatsService; private final FileStatsService fileStatsService;
private final JwtUtil jwtUtil;
private final HttpServletRequest httpServletRequest;
@GetMapping @GetMapping
public ResponseEntity<UserDTO> getUser(@RequestParam("email") String email, public ResponseEntity<UserDTO> getUser(@RequestParam("email") String email) {
@RequestHeader("Authorization") String tokenHeader) {
String token = tokenHeader.replace("Bearer ", "");
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
if (tokenOptional.isPresent()) {
User user = userRepository.findByEmail(email); User user = userRepository.findByEmail(email);
if (user != null) { if (user != null) {
@@ -121,24 +112,19 @@ public class UserController {
return ResponseEntity.ok(userDTO); return ResponseEntity.ok(userDTO);
} }
} else {
return ResponseEntity.notFound().build();
}
return ResponseEntity.notFound().build(); return ResponseEntity.notFound().build();
} }
//TODO fix mapper,doesnot exist all fields //TODO fix mapper,doesnot exist all fields
@PostMapping("/change-password") @PostMapping("/change-password")
public ResponseEntity<UserDTO> updateUser(@RequestBody ChangePasswordRequest changePasswordRequest, public ResponseEntity<UserDTO> updateUser(@RequestBody ChangePasswordRequest changePasswordRequest) {
@RequestHeader("Authorization") String tokenHeader) { Long userId = (Long) httpServletRequest.getAttribute("userId");
String token = tokenHeader.replace("Bearer ", ""); User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token); if (user == null) {
throw new UserNotFoundException("User not found by id: " + userId);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); }
User user = authToken.getUser();
if (!changePasswordRequest.getEmail().equals(user.getEmail())) { if (!changePasswordRequest.getEmail().equals(user.getEmail())) {
throw new InvalidUserEmail("Email is not valid: " + changePasswordRequest.getEmail() + "not found"); throw new InvalidUserEmail("Email is not valid: " + changePasswordRequest.getEmail() + "not found");
@@ -150,21 +136,19 @@ public class UserController {
} }
@PatchMapping("/user-update") @PatchMapping("/user-update")
public ResponseEntity<UserDTO> updateUser(@RequestBody UserRequest userRequest, public ResponseEntity<UserDTO> updateUser(@RequestBody UserRequest userRequest) {
@RequestHeader("Authorization") String tokenHeader) { Long userId = (Long) httpServletRequest.getAttribute("userId");
String token = tokenHeader.replace("Bearer ", ""); User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token); if (user == null) {
throw new UserNotFoundException("User not found by id: " + userId);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); }
User user = authToken.getUser();
return ResponseEntity.ok(userService.updateUser(userRequest, user)); return ResponseEntity.ok(userService.updateUser(userRequest, user));
} }
@PostMapping("/create-user") @PostMapping("/create-user")
public ResponseEntity<User> addUser(@RequestBody RegRequest registerRequest) { public ResponseEntity<?> addUser(@RequestBody RegRequest registerRequest) {
if (userRepository.existsByEmail(registerRequest.getEmail()) || if (userRepository.existsByEmail(registerRequest.getEmail()) ||
userRepository.existsByPhone(registerRequest.getPhone())) { userRepository.existsByPhone(registerRequest.getPhone())) {
@@ -191,11 +175,11 @@ public class UserController {
User savedUser = userRepository.save(user); 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(Map.of(
"user", savedUser,
return ResponseEntity.ok().body(savedUser); "token", authToken));
} }
@DeleteMapping("/delete-user/{userId}") @DeleteMapping("/delete-user/{userId}")
@@ -22,6 +22,7 @@ public enum MessageCode {
USER_NOT_VERIFIED(2, "User not verified"), USER_NOT_VERIFIED(2, "User not verified"),
LAW_CASE_NOT_FOUND(4, "Law case not found"), LAW_CASE_NOT_FOUND(4, "Law case not found"),
PERMISSION_NOT_FOUND(2, "Permission not found"), PERMISSION_NOT_FOUND(2, "Permission not found"),
INVALID_CREDENTIALS(2, "Invalid credentials"),
USER_NOT_FOUND(2, "User not found"), USER_NOT_FOUND(2, "User not found"),
LAW_CASE_ALREADY_EXIST(2, "Law case already exists"), LAW_CASE_ALREADY_EXIST(2, "Law case already exists"),
COMPLAINT_ALREADY_EXIST(2, "Complaint already exists"), COMPLAINT_ALREADY_EXIST(2, "Complaint already exists"),
@@ -6,6 +6,4 @@ import lombok.Data;
@Data @Data
public class TokenProcessRequest { public class TokenProcessRequest {
@JsonProperty("token")
private String token;
} }
@@ -35,7 +35,4 @@ public class ComplaintRequest {
@JsonProperty("sort_direction") @JsonProperty("sort_direction")
private String sortDirection; private String sortDirection;
@JsonProperty("token")
private String token;
} }
@@ -18,7 +18,6 @@ public class LawCaseRequest {
private String priority = LawCasePriority.HIGH.toString(); private String priority = LawCasePriority.HIGH.toString();
private String type; private String type;
private String lawyer; private String lawyer;
private String token;
private Integer pageSize = 5; private Integer pageSize = 5;
private Integer pageNumber = 0; private Integer pageNumber = 0;
private String sortBy = "updatedAt"; private String sortBy = "updatedAt";
@@ -12,7 +12,4 @@ public class CostRequest {
@JsonProperty("count_files") @JsonProperty("count_files")
Integer countFilesForProtect; Integer countFilesForProtect;
@JsonProperty("auth_token")
String authToken;
} }
@@ -10,9 +10,6 @@ public class DocViewerRequest {
@JsonProperty("file_id") @JsonProperty("file_id")
private String fileId; private String fileId;
@JsonProperty("token")
private String token;
@JsonProperty("ip") @JsonProperty("ip")
private String ip; private String ip;
@@ -9,5 +9,4 @@ public class AppealRequest {
private String fileId; private String fileId;
private String appealReason; private String appealReason;
private String additionalInfo; private String additionalInfo;
private String token;
} }
@@ -40,9 +40,6 @@ public class FileEntityRequest {
@JsonProperty("page_size") @JsonProperty("page_size")
private Integer pageSize; private Integer pageSize;
@JsonProperty("token")
private String token;
@JsonProperty("sort_by") @JsonProperty("sort_by")
private String sortBy; private String sortBy;
@@ -26,9 +26,6 @@ public class FileUploadRequest {
@JsonProperty("action") @JsonProperty("action")
private String action; private String action;
@JsonProperty("token")
private String token;
@JsonProperty("convertTo") @JsonProperty("convertTo")
private String convertTo; private String convertTo;
} }
@@ -17,7 +17,4 @@ public class GetViolationsRequest {
@JsonProperty("mark_as_read") @JsonProperty("mark_as_read")
private boolean markAsRead; private boolean markAsRead;
@JsonProperty("auth_token")
private String authToken;
} }
@@ -14,7 +14,4 @@ public class SetMonitoringRequest {
@JsonProperty("monitoring_type") @JsonProperty("monitoring_type")
private String monitoringType; private String monitoringType;
@JsonProperty("auth_token")
private String authToken;
} }
@@ -4,5 +4,4 @@ import lombok.Data;
@Data @Data
public class ActivateNotificationRequest { public class ActivateNotificationRequest {
private String authToken;
} }
@@ -7,5 +7,4 @@ import java.util.List;
@Data @Data
public class MarkAsReadRequest { public class MarkAsReadRequest {
private List<Long> notificationIds; private List<Long> notificationIds;
private String authToken;
} }
@@ -14,5 +14,4 @@ public class NotificationListRequest {
private String sortDirection = "DESC"; private String sortDirection = "DESC";
private List<NotificationType> types; private List<NotificationType> types;
private List<NotificationStatus> statuses; private List<NotificationStatus> statuses;
private String authToken;
} }
@@ -10,7 +10,6 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@Builder @Builder
public class ReferralRequest { public class ReferralRequest {
private String token;
private Integer amount; private Integer amount;
private Integer pageSize; private Integer pageSize;
private Integer pageNumber; private Integer pageNumber;
@@ -6,9 +6,6 @@ import lombok.Data;
@Data @Data
public class GlobalSearchStatisticsRequest { public class GlobalSearchStatisticsRequest {
@JsonProperty("token")
private String token;
@JsonProperty("limit") @JsonProperty("limit")
private Integer limit = 10; private Integer limit = 10;
@@ -4,5 +4,4 @@ import lombok.Data;
@Data @Data
public class MonitoringStatisticRequest { public class MonitoringStatisticRequest {
private String authToken;
} }
@@ -11,9 +11,6 @@ public class TokenOperationRequest {
@JsonProperty("action") @JsonProperty("action")
private String action; private String action;
@JsonProperty("token")
private String token;
@JsonProperty("operation_id") @JsonProperty("operation_id")
private Long operationId; private Long operationId;
@@ -5,8 +5,6 @@ import lombok.Data;
@Data @Data
public class ViolationNotionRequest { public class ViolationNotionRequest {
@JsonProperty("token")
private String token;
@JsonProperty("action") @JsonProperty("action")
private String action; private String action;
@@ -25,9 +25,6 @@ public class ViolationRequest {
@JsonProperty("action") @JsonProperty("action")
private String action; private String action;
@JsonProperty("token")
private String token;
@JsonProperty("file_name") @JsonProperty("file_name")
private String fileName = null; private String fileName = null;
@@ -6,9 +6,6 @@ import lombok.Data;
@Data @Data
public class ViolationStatisticsRequest { public class ViolationStatisticsRequest {
@JsonProperty("token")
private String token;
@JsonProperty("file_id") @JsonProperty("file_id")
private String fileId; private String fileId;
@@ -1,15 +1,14 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.soune.nocopy.dto.BaseRequest; import ru.soune.nocopy.dto.BaseRequest;
import ru.soune.nocopy.dto.BaseResponse; import ru.soune.nocopy.dto.BaseResponse;
import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.MessageCode;
import ru.soune.nocopy.dto.TokenProcessRequest;
import ru.soune.nocopy.exception.NotFoundAuthToken; import ru.soune.nocopy.exception.NotFoundAuthToken;
import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.util.JwtUtil;
import java.util.Map; import java.util.Map;
@@ -18,20 +17,19 @@ import java.util.Map;
@RequiredArgsConstructor @RequiredArgsConstructor
public class AuthRequestHandler implements RequestHandler { public class AuthRequestHandler implements RequestHandler {
private final ObjectMapper objectMapper; private final HttpServletRequest httpServletRequest;
private final AuthService authService; private final JwtUtil jwtUtil;
@Override @Override
public BaseResponse handle(BaseRequest request) throws NotFoundAuthToken { public BaseResponse handle(BaseRequest request) throws NotFoundAuthToken {
TokenProcessRequest tokenProcessRequest = objectMapper.convertValue(request.getMessageBody(), Long userId = (Long) httpServletRequest.getAttribute("userId");
TokenProcessRequest.class); String email = (String) httpServletRequest.getAttribute("email");
String token = jwtUtil.generateToken(userId, email);
authService.useUserAuthToken(tokenProcessRequest.getToken());
return new BaseResponse(request.getMsgId(), return new BaseResponse(request.getMsgId(),
MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getCode(),
"Token processed successfully", "Token processed successfully",
Map.of("token", tokenProcessRequest.getToken())); Map.of("token", token));
} }
} }
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.PageRequest; 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.UserRepository;
import ru.soune.nocopy.repository.ViolationRepository; import ru.soune.nocopy.repository.ViolationRepository;
import ru.soune.nocopy.service.complaint.ComplaintEntityService; 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.user.UserService;
import ru.soune.nocopy.service.violation.ViolationStatus; import ru.soune.nocopy.service.violation.ViolationStatus;
@@ -39,21 +39,20 @@ public class ComplaintEntityHandler implements RequestHandler {
private final UserService userService; private final UserService userService;
private final AuthService authService;
private final FileEntityRepository fileEntityRepository; private final FileEntityRepository fileEntityRepository;
private final ComplaintEntityRepository complaintEntityRepository; private final ComplaintEntityRepository complaintEntityRepository;
private final ViolationRepository violationRepository; private final ViolationRepository violationRepository;
private final HttpServletRequest httpServletRequest;
@Override @Override
public BaseResponse handle(BaseRequest request) throws Exception { public BaseResponse handle(BaseRequest request) throws Exception {
Integer msgId = request.getMsgId(); Integer msgId = request.getMsgId();
ComplaintRequest complaintRequest = objectMapper.convertValue(request.getMessageBody(), ComplaintRequest.class); ComplaintRequest complaintRequest = objectMapper.convertValue(request.getMessageBody(), ComplaintRequest.class);
String action = complaintRequest.getAction() == null ? "" : complaintRequest.getAction(); String action = complaintRequest.getAction() == null ? "" : complaintRequest.getAction();
String token = complaintRequest.getToken(); Long userId = (Long) httpServletRequest.getAttribute("userId");
Long userId = authService.useUserAuthToken(token);
User user = userRepository.findById(userId).orElse(null); User user = userRepository.findById(userId).orElse(null);
if (user == null) { if (user == null) {
@@ -61,7 +60,7 @@ public class ComplaintEntityHandler implements RequestHandler {
request.getMsgId(), request.getMsgId(),
MessageCode.USER_NOT_FOUND.getCode(), MessageCode.USER_NOT_FOUND.getCode(),
MessageCode.USER_NOT_FOUND.getDescription(), MessageCode.USER_NOT_FOUND.getDescription(),
Map.of("token: ", token)); Map.of("userId: ", userId));
} }
List<String> emails = user.getCompany() == null ? List.of(user.getEmail()): List<String> emails = user.getCompany() == null ? List.of(user.getEmail()):
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; 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.MessageCode;
import ru.soune.nocopy.dto.cost.CostRequest; import ru.soune.nocopy.dto.cost.CostRequest;
import ru.soune.nocopy.dto.cost.CostResponse; 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.entity.user.User;
import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.service.cost.CostService; import ru.soune.nocopy.service.cost.CostService;
import ru.soune.nocopy.service.user.UserService;
import java.util.Optional; import java.util.Map;
@Slf4j @Slf4j
@Component @Component
@@ -23,10 +23,12 @@ public class CostHandler implements RequestHandler {
private final CostService costService; private final CostService costService;
private final AuthTokenRepository authTokenRepository; private final HttpServletRequest httpServletRequest;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
private final UserService userService;
private final Integer MAX_FILES_FOR_CHECK = 1000; private final Integer MAX_FILES_FOR_CHECK = 1000;
@Override @Override
@@ -64,18 +66,17 @@ public class CostHandler implements RequestHandler {
} }
private BaseResponse handleCheckTokensForFilesProtect(CostRequest costRequest, BaseRequest request) { private BaseResponse handleCheckTokensForFilesProtect(CostRequest costRequest, BaseRequest request) {
String authToken = costRequest.getAuthToken(); Long userId = (Long) httpServletRequest.getAttribute("userId");
Optional<AuthToken> token = authTokenRepository.findByToken(authToken); User user = userService.getUserById(userId).orElse(null);
if (token.isEmpty()) { if (user == null) {
return new BaseResponse( return new BaseResponse(
request.getMsgId(), request.getMsgId(),
MessageCode.AUTH_TOKEN_NOT_FOUND.getCode(), MessageCode.USER_NOT_FOUND.getCode(),
MessageCode.AUTH_TOKEN_NOT_FOUND.getDescription(), MessageCode.USER_NOT_FOUND.getDescription(),
null); Map.of("User: ", userId));
} }
User user = token.get().getUser();
Integer tokens = user.getActiveTariffInfo().getTokens(); Integer tokens = user.getActiveTariffInfo().getTokens();
int cost = costService.protectFileCost(costRequest.getFileType()); int cost = costService.protectFileCost(costRequest.getFileType());
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; 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.exception.NotFoundAuthToken;
import ru.soune.nocopy.service.dockview.DockViewService; import ru.soune.nocopy.service.dockview.DockViewService;
import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileEntityService;
import ru.soune.nocopy.service.register.AuthService;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -28,10 +28,10 @@ public class DockViewFileHandler implements RequestHandler {
private final FileEntityService fileEntityService; private final FileEntityService fileEntityService;
private final AuthService authService;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
private final HttpServletRequest httpServletRequest;
@Override @Override
public BaseResponse handle(BaseRequest request) throws Exception { public BaseResponse handle(BaseRequest request) throws Exception {
DocViewerRequest docViewerRequest = objectMapper.convertValue(request.getMessageBody(), DocViewerRequest.class); DocViewerRequest docViewerRequest = objectMapper.convertValue(request.getMessageBody(), DocViewerRequest.class);
@@ -55,7 +55,7 @@ public class DockViewFileHandler implements RequestHandler {
private BaseResponse handleGetHistory(BaseRequest request, DocViewerRequest docViewerRequest) { private BaseResponse handleGetHistory(BaseRequest request, DocViewerRequest docViewerRequest) {
try { try {
Long userId = authService.useUserAuthToken(docViewerRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
List<String> fileIds = fileEntityService.getAllUserFiles(userId) List<String> fileIds = fileEntityService.getAllUserFiles(userId)
.stream() .stream()
.filter(fileEntity -> fileEntity.getMimeType().equals("document")) .filter(fileEntity -> fileEntity.getMimeType().equals("document"))
@@ -94,7 +94,7 @@ public class DockViewFileHandler implements RequestHandler {
private BaseResponse handleGetViewStats(BaseRequest request, DocViewerRequest docViewerRequest) { private BaseResponse handleGetViewStats(BaseRequest request, DocViewerRequest docViewerRequest) {
try { try {
Long userId = authService.useUserAuthToken(docViewerRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
List<String> fileIds = fileEntityService.getAllUserFiles(userId) List<String> fileIds = fileEntityService.getAllUserFiles(userId)
.stream() .stream()
.filter(fileEntity -> fileEntity.getMimeType().equals("document")) .filter(fileEntity -> fileEntity.getMimeType().equals("document"))
@@ -1,12 +1,10 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; 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.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import ru.soune.nocopy.dto.*; 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.*;
import ru.soune.nocopy.entity.file.moderation.ModerationLog; import ru.soune.nocopy.entity.file.moderation.ModerationLog;
import ru.soune.nocopy.entity.file.permission.PermissionType; import ru.soune.nocopy.entity.file.permission.PermissionType;
import ru.soune.nocopy.entity.monitoring.FileMonitoringEntity;
import ru.soune.nocopy.exception.*; import ru.soune.nocopy.exception.*;
import ru.soune.nocopy.repository.*; import ru.soune.nocopy.repository.*;
import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.service.file.cloud.CloudStorageService;
import ru.soune.nocopy.service.file.moderation.ModerationService; import ru.soune.nocopy.service.file.moderation.ModerationService;
import ru.soune.nocopy.service.file.permission.FileAccessService; 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.FileEntityService;
import ru.soune.nocopy.service.file.FileStatsService; import ru.soune.nocopy.service.file.FileStatsService;
@@ -39,8 +35,6 @@ public class FileEntityHandler implements RequestHandler {
private final FileEntityService fileEntityService; private final FileEntityService fileEntityService;
private final AuthService authService;
private final FileStatsService fileStatsService; private final FileStatsService fileStatsService;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
@@ -61,6 +55,8 @@ public class FileEntityHandler implements RequestHandler {
private final FileAccessService fileAccessService; private final FileAccessService fileAccessService;
private final HttpServletRequest httpServletRequest;
@Override @Override
public BaseResponse handle(BaseRequest request) { public BaseResponse handle(BaseRequest request) {
try { try {
@@ -118,7 +114,7 @@ public class FileEntityHandler implements RequestHandler {
} }
private BaseResponse handleGetFilesUserInfo(BaseRequest request, FileEntityRequest fileRequest) { private BaseResponse handleGetFilesUserInfo(BaseRequest request, FileEntityRequest fileRequest) {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
FileInfoUserResponse userFileStats = fileStatsService.getUserFileStats(userId); FileInfoUserResponse userFileStats = fileStatsService.getUserFileStats(userId);
return new BaseResponse(request.getMsgId(), return new BaseResponse(request.getMsgId(),
@@ -129,7 +125,7 @@ public class FileEntityHandler implements RequestHandler {
private BaseResponse handleGetFileInfo(BaseRequest request, FileEntityRequest fileRequest) { private BaseResponse handleGetFileInfo(BaseRequest request, FileEntityRequest fileRequest) {
try { try {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
FileEntityResponse fileInfo = fileEntityService.getById(fileRequest.getFileId(), request.getVersion()); FileEntityResponse fileInfo = fileEntityService.getById(fileRequest.getFileId(), request.getVersion());
if (!fileInfo.getUserId().equals(userId)) { if (!fileInfo.getUserId().equals(userId)) {
@@ -160,7 +156,7 @@ public class FileEntityHandler implements RequestHandler {
private BaseResponse handleChangePermission(BaseRequest request, FileEntityRequest fileRequest) { private BaseResponse handleChangePermission(BaseRequest request, FileEntityRequest fileRequest) {
try { try {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
FileEntityResponse fileInfo = fileEntityService.getById(fileRequest.getFileId(), request.getVersion()); FileEntityResponse fileInfo = fileEntityService.getById(fileRequest.getFileId(), request.getVersion());
if (!fileInfo.getUserId().equals(userId)) { if (!fileInfo.getUserId().equals(userId)) {
@@ -211,7 +207,7 @@ public class FileEntityHandler implements RequestHandler {
private BaseResponse handleGetFileBySession(BaseRequest request, FileEntityRequest fileRequest) { private BaseResponse handleGetFileBySession(BaseRequest request, FileEntityRequest fileRequest) {
try { try {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
FileEntityResponse fileInfo = fileEntityService.getByUploadSessionId(fileRequest.getUploadSessionId(), FileEntityResponse fileInfo = fileEntityService.getByUploadSessionId(fileRequest.getUploadSessionId(),
request.getVersion()); request.getVersion());
@@ -243,7 +239,7 @@ public class FileEntityHandler implements RequestHandler {
private BaseResponse handleGetUserFiles(BaseRequest request, FileEntityRequest fileRequest) { private BaseResponse handleGetUserFiles(BaseRequest request, FileEntityRequest fileRequest) {
try { try {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1; int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1;
int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20; int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20;
@@ -270,7 +266,7 @@ public class FileEntityHandler implements RequestHandler {
private BaseResponse handleSearchFiles(BaseRequest request, FileEntityRequest fileRequest) { private BaseResponse handleSearchFiles(BaseRequest request, FileEntityRequest fileRequest) {
try { try {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1; int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1;
int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20; int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20;
@@ -531,7 +527,7 @@ public class FileEntityHandler implements RequestHandler {
private BaseResponse handleGetUserFilesWithSort(BaseRequest request, FileEntityRequest fileRequest, private BaseResponse handleGetUserFilesWithSort(BaseRequest request, FileEntityRequest fileRequest,
String sortBy, SortOrder sortOrder) { String sortBy, SortOrder sortOrder) {
try { try {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1; int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1;
int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20; int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20;
@@ -585,7 +581,7 @@ public class FileEntityHandler implements RequestHandler {
private BaseResponse handleGetStorageUsage(BaseRequest request, FileEntityRequest fileRequest) { private BaseResponse handleGetStorageUsage(BaseRequest request, FileEntityRequest fileRequest) {
try { try {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
long usage = fileEntityService.getUserStorageUsed(userId); long usage = fileEntityService.getUserStorageUsed(userId);
StorageUsageResponse response = StorageUsageResponse.builder() StorageUsageResponse response = StorageUsageResponse.builder()
@@ -696,7 +692,7 @@ public class FileEntityHandler implements RequestHandler {
private BaseResponse handleDeleteFile(BaseRequest request, FileEntityRequest fileRequest) { private BaseResponse handleDeleteFile(BaseRequest request, FileEntityRequest fileRequest) {
try { try {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
String fileId = fileRequest.getFileId(); String fileId = fileRequest.getFileId();
FileEntityResponse fileInfo = fileEntityService.getById(fileId, request.getVersion()); FileEntityResponse fileInfo = fileEntityService.getById(fileId, request.getVersion());
DeleteFileResponse response; DeleteFileResponse response;
@@ -786,7 +782,7 @@ public class FileEntityHandler implements RequestHandler {
private BaseResponse handleSubmitAppeal(BaseRequest request, FileEntityRequest fileRequest) { private BaseResponse handleSubmitAppeal(BaseRequest request, FileEntityRequest fileRequest) {
try { try {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
AppealRequest appealRequest = AppealRequest.builder() AppealRequest appealRequest = AppealRequest.builder()
.fileId(fileRequest.getFileId()) .fileId(fileRequest.getFileId())
@@ -815,7 +811,7 @@ public class FileEntityHandler implements RequestHandler {
private BaseResponse handleGetUserAppeals(BaseRequest request, FileEntityRequest fileRequest) { private BaseResponse handleGetUserAppeals(BaseRequest request, FileEntityRequest fileRequest) {
try { try {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1; int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1;
int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20; int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20;
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@@ -10,14 +11,11 @@ import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError; import org.springframework.validation.FieldError;
import ru.soune.nocopy.dto.*; import ru.soune.nocopy.dto.*;
import ru.soune.nocopy.dto.file.*; 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.FileType;
import ru.soune.nocopy.entity.file.FileUploadSession; import ru.soune.nocopy.entity.file.FileUploadSession;
import ru.soune.nocopy.exception.*; import ru.soune.nocopy.exception.*;
import ru.soune.nocopy.handler.validator.FileUploadRequestValidator; import ru.soune.nocopy.handler.validator.FileUploadRequestValidator;
import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.repository.FileUploadSessionRepository; import ru.soune.nocopy.repository.FileUploadSessionRepository;
import ru.soune.nocopy.service.register.AuthService;
import ru.soune.nocopy.service.file.FileUploadService; import ru.soune.nocopy.service.file.FileUploadService;
import java.util.*; import java.util.*;
@@ -29,16 +27,14 @@ import java.util.stream.Collectors;
public class FileUploadHandler implements RequestHandler { public class FileUploadHandler implements RequestHandler {
private final FileUploadService fileUploadService; private final FileUploadService fileUploadService;
private final AuthService authService;
private final AuthTokenRepository authTokenRepository;
private final FileUploadSessionRepository fileUploadSessionRepository; private final FileUploadSessionRepository fileUploadSessionRepository;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
private final FileUploadRequestValidator fileUploadRequestValidator; private final FileUploadRequestValidator fileUploadRequestValidator;
private final HttpServletRequest httpServletRequest;
@Value("${file.storage.max-file-size}") @Value("${file.storage.max-file-size}")
private long maxFileSize; private long maxFileSize;
@@ -80,16 +76,7 @@ public class FileUploadHandler implements RequestHandler {
} }
private BaseResponse handleInitUpload(BaseRequest request, FileUploadRequest fileRequest) { private BaseResponse handleInitUpload(BaseRequest request, FileUploadRequest fileRequest) {
String token = fileRequest.getToken(); Long userId = (Long) httpServletRequest.getAttribute("userId");
Optional<AuthToken> 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);
BindingResult bindingResult = new BeanPropertyBindingResult(fileRequest, "fileRequest"); BindingResult bindingResult = new BeanPropertyBindingResult(fileRequest, "fileRequest");
fileUploadRequestValidator.validate(fileRequest, bindingResult); fileUploadRequestValidator.validate(fileRequest, bindingResult);
@@ -219,7 +206,6 @@ public class FileUploadHandler implements RequestHandler {
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(),
MessageCode.SUCCESS.getDescription(), response); MessageCode.SUCCESS.getDescription(), response);
} catch (Exception e) { } catch (Exception e) {
log.error("Error getting file types", e); log.error("Error getting file types", e);
return new BaseResponse(request.getMsgId(), MessageCode.FILE_UPLOAD_ERROR.getCode(), return new BaseResponse(request.getMsgId(), MessageCode.FILE_UPLOAD_ERROR.getCode(),
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; 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.BaseResponse;
import ru.soune.nocopy.dto.search.GlobalSearchStatisticsRequest; import ru.soune.nocopy.dto.search.GlobalSearchStatisticsRequest;
import ru.soune.nocopy.dto.search.GlobalSearchStatisticsResponse; 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 ru.soune.nocopy.service.search.GlobalSearchStatisticsService;
import java.util.Optional;
@Slf4j @Slf4j
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -23,28 +20,17 @@ public class GlobalSearchHandler implements RequestHandler {
private final GlobalSearchStatisticsService statisticsService; private final GlobalSearchStatisticsService statisticsService;
private final AuthTokenRepository authTokenRepository; private final HttpServletRequest httpServletRequest;
@Override @Override
public BaseResponse handle(BaseRequest request) throws Exception { public BaseResponse handle(BaseRequest request) throws Exception {
GlobalSearchStatisticsRequest statRequest = objectMapper.convertValue( GlobalSearchStatisticsRequest statRequest = objectMapper.convertValue(
request.getMessageBody(), GlobalSearchStatisticsRequest.class); request.getMessageBody(), GlobalSearchStatisticsRequest.class);
if (statRequest.getToken() == null) { Long userId = (Long) httpServletRequest.getAttribute("userId");
throw new IllegalArgumentException("User token is required");
}
Optional<AuthToken> tokenOptional = GlobalSearchStatisticsResponse statistics = statisticsService.getStatistics(userId, statRequest.getLimit(),
authTokenRepository.findByToken(statRequest.getToken()); statRequest.getDays());
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());
return BaseResponse.builder() return BaseResponse.builder()
.msgId(request.getMsgId()) .msgId(request.getMsgId())
@@ -61,12 +61,6 @@ public class ImageFoundRequestHandler implements RequestHandler {
private final FileUploadService fileUploadService; private final FileUploadService fileUploadService;
private final ImageHashService imageHashService;
private final ImageHashRepository imageHashRepository;
private final FileSimilarityService fileSimilarityService;
private final NoCopyFileService noCopyFileService; private final NoCopyFileService noCopyFileService;
@Override @Override
@@ -2,6 +2,7 @@ package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.mail.MessagingException; import jakarta.mail.MessagingException;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; 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.exception.UserNotFoundException;
import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.repository.UserRepository;
import ru.soune.nocopy.service.complaint.LawCaseService; 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.TariffConstants;
import ru.soune.nocopy.service.tariff.TariffInfoService; import ru.soune.nocopy.service.tariff.TariffInfoService;
import ru.soune.nocopy.service.violation.ViolationService; import ru.soune.nocopy.service.violation.ViolationService;
@@ -41,8 +41,6 @@ public class LawCaseHandler implements RequestHandler {
private final LawCaseService lawCaseService; private final LawCaseService lawCaseService;
private final AuthService authService;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
private final UserRepository userRepository; private final UserRepository userRepository;
@@ -51,11 +49,13 @@ public class LawCaseHandler implements RequestHandler {
private final ViolationService violationService; private final ViolationService violationService;
private final HttpServletRequest httpServletRequest;
@Override @Override
public BaseResponse handle(BaseRequest request) throws Exception { public BaseResponse handle(BaseRequest request) throws Exception {
LawCaseRequest lawCaseRequest = objectMapper.convertValue(request.getMessageBody(), LawCaseRequest lawCaseRequest = objectMapper.convertValue(request.getMessageBody(),
LawCaseRequest.class); LawCaseRequest.class);
Long userId = authService.useUserAuthToken(lawCaseRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
String action = lawCaseRequest.getAction(); String action = lawCaseRequest.getAction();
return switch (action) { return switch (action) {
@@ -6,11 +6,10 @@ import org.springframework.stereotype.Component;
import ru.soune.nocopy.dto.*; import ru.soune.nocopy.dto.*;
import ru.soune.nocopy.dto.register.LoginAnswer; import ru.soune.nocopy.dto.register.LoginAnswer;
import ru.soune.nocopy.dto.register.LoginRequest; 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.entity.user.User;
import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.exception.NotValidFieldException;
import ru.soune.nocopy.repository.UserRepository; 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.Arrays;
import java.util.Map; import java.util.Map;
@@ -21,10 +20,10 @@ public class LoginRequestHandler implements RequestHandler {
private final UserRepository userRepository; private final UserRepository userRepository;
private final AuthService authService;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
private final JwtUtil jwtUtil;
@Override @Override
public BaseResponse handle(BaseRequest request) { public BaseResponse handle(BaseRequest request) {
LoginRequest loginRequest = objectMapper.convertValue(request.getMessageBody(), LoginRequest.class); LoginRequest loginRequest = objectMapper.convertValue(request.getMessageBody(), LoginRequest.class);
@@ -60,14 +59,11 @@ public class LoginRequestHandler implements RequestHandler {
MessageCode.PERMISSION_NOT_FOUND.getDescription(), loginAnswer); MessageCode.PERMISSION_NOT_FOUND.getDescription(), loginAnswer);
} }
AuthToken authToken = authService.login(loginRequest); String token = jwtUtil.generateToken(user.getId(), user.getEmail());
String token = authToken.getToken();
LoginAnswer loginAnswer = new LoginAnswer(); LoginAnswer loginAnswer = new LoginAnswer();
loginAnswer.setToken(token); loginAnswer.setToken(token);
authService.useUserAuthToken(token);
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(),
MessageCode.SUCCESS.getDescription(), loginAnswer); MessageCode.SUCCESS.getDescription(), loginAnswer);
} }
@@ -11,8 +11,6 @@ import ru.soune.nocopy.entity.user.User;
import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.exception.NotValidFieldException;
import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.repository.UserRepository;
import ru.soune.nocopy.service.register.AuthService;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@@ -20,8 +18,6 @@ import java.util.Optional;
@RequiredArgsConstructor @RequiredArgsConstructor
public class LogoutRequestHandler implements RequestHandler { public class LogoutRequestHandler implements RequestHandler {
private final AuthService authService;
private final AuthTokenRepository authTokenRepository; private final AuthTokenRepository authTokenRepository;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
@@ -49,9 +45,6 @@ public class LogoutRequestHandler implements RequestHandler {
new LogoutRequest(logoutRequest.getEmail(), logoutRequest.getToken()))); new LogoutRequest(logoutRequest.getEmail(), logoutRequest.getToken())));
} }
authService.logout(logoutRequest.getToken());
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(), return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(),
new LogOutAnswer(logoutRequest.getEmail())); new LogOutAnswer(logoutRequest.getEmail()));
} }
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; 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.MonitoringStatusResponse;
import ru.soune.nocopy.dto.monitoring.SetMonitoringRequest; import ru.soune.nocopy.dto.monitoring.SetMonitoringRequest;
import ru.soune.nocopy.entity.monitoring.MonitoringType; 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.exception.UserNotHavePermission;
import ru.soune.nocopy.service.monitoring.FileMonitoringService; import ru.soune.nocopy.service.monitoring.FileMonitoringService;
import ru.soune.nocopy.service.register.AuthService;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.util.Arrays; import java.util.Arrays;
@@ -29,24 +27,14 @@ public class MonitoringHandler implements RequestHandler {
private final FileMonitoringService monitoringService; private final FileMonitoringService monitoringService;
private final AuthService authService; private final HttpServletRequest httpServletRequest;
@Override @Override
public BaseResponse handle(BaseRequest request) throws Exception { public BaseResponse handle(BaseRequest request) throws Exception {
SetMonitoringRequest setRequest = objectMapper.convertValue( SetMonitoringRequest setRequest = objectMapper.convertValue(
request.getMessageBody(), SetMonitoringRequest.class); request.getMessageBody(), SetMonitoringRequest.class);
String authToken = setRequest.getAuthToken(); Long userId = (Long) httpServletRequest.getAttribute("userId");
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();
String typeStr = setRequest.getMonitoringType(); String typeStr = setRequest.getMonitoringType();
MonitoringType monitoringType; MonitoringType monitoringType;
@@ -64,7 +52,7 @@ public class MonitoringHandler implements RequestHandler {
} catch (UserNotHavePermission e) { } catch (UserNotHavePermission e) {
return new BaseResponse(request.getMsgId(), return new BaseResponse(request.getMsgId(),
MessageCode.USER_NOT_HAD_PERMISSION.getCode(), 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) { } catch (FileNotFoundException e) {
return new BaseResponse(request.getMsgId(), return new BaseResponse(request.getMsgId(),
MessageCode.FILE_NOT_FOUND.getCode(), MessageCode.FILE_NOT_FOUND.getCode(),
@@ -1,20 +1,18 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.soune.nocopy.dto.BaseRequest; import ru.soune.nocopy.dto.BaseRequest;
import ru.soune.nocopy.dto.BaseResponse; import ru.soune.nocopy.dto.BaseResponse;
import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.MessageCode;
import ru.soune.nocopy.dto.statistic.MonitoringStatisticRequest;
import ru.soune.nocopy.dto.statistic.MonitoringStatisticResponse; import ru.soune.nocopy.dto.statistic.MonitoringStatisticResponse;
import ru.soune.nocopy.entity.company.Company; import ru.soune.nocopy.entity.company.Company;
import ru.soune.nocopy.entity.monitoring.MonitoringType; import ru.soune.nocopy.entity.monitoring.MonitoringType;
import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.entity.user.User;
import ru.soune.nocopy.repository.FileMonitoringRepository; import ru.soune.nocopy.repository.FileMonitoringRepository;
import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.repository.UserRepository;
import ru.soune.nocopy.service.register.AuthService;
import java.util.List; import java.util.List;
@@ -23,24 +21,19 @@ import java.util.List;
@RequiredArgsConstructor @RequiredArgsConstructor
public class MonitoringStatisticHandler implements RequestHandler { public class MonitoringStatisticHandler implements RequestHandler {
private final ObjectMapper objectMapper;
private final AuthService authService;
private final FileMonitoringRepository fileMonitoringRepository; private final FileMonitoringRepository fileMonitoringRepository;
private final UserRepository userRepository; private final UserRepository userRepository;
private final HttpServletRequest httpServletRequest;
@Override @Override
public BaseResponse handle(BaseRequest request) throws Exception { public BaseResponse handle(BaseRequest request) throws Exception {
MonitoringStatisticRequest monitoringStatisticRequest = objectMapper.convertValue(request.getMessageBody(),
MonitoringStatisticRequest.class);
try { try {
String authToken = monitoringStatisticRequest.getAuthToken(); Long userId = (Long) httpServletRequest.getAttribute("userId");
Long userId = authService.useUserAuthToken(authToken);
User user = userRepository.findById(userId).orElseThrow(); User user = userRepository.findById(userId).orElseThrow();
Company company = user.getCompany(); Company company = user.getCompany();
List<Long> userIds = company == null ? List.of(userId) : List<Long> userIds = company == null ? List.of(userId) :
user.getCompany() user.getCompany()
.getUsers() .getUsers()
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; 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.dto.notification.*;
import ru.soune.nocopy.entity.notification.Notification; import ru.soune.nocopy.entity.notification.Notification;
import ru.soune.nocopy.entity.user.User; 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.Arrays;
import java.util.List; import java.util.List;
@@ -31,7 +32,9 @@ public class NotificationHandler implements RequestHandler {
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
private final AuthService authService; private final HttpServletRequest httpServletRequest;
private final UserService userService;
@Override @Override
public BaseResponse handle(BaseRequest request) throws Exception { public BaseResponse handle(BaseRequest request) throws Exception {
@@ -56,7 +59,16 @@ public class NotificationHandler implements RequestHandler {
case "list": { case "list": {
NotificationListRequest listRequest = objectMapper.convertValue(request.getMessageBody(), NotificationListRequest listRequest = objectMapper.convertValue(request.getMessageBody(),
NotificationListRequest.class); 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<Notification> page = notificationService.getAllNotifications( Page<Notification> page = notificationService.getAllNotifications(
user, user,
@@ -87,7 +99,8 @@ public class NotificationHandler implements RequestHandler {
case "active": { case "active": {
ActivateNotificationRequest activateRequest = objectMapper.convertValue(request.getMessageBody(), ActivateNotificationRequest activateRequest = objectMapper.convertValue(request.getMessageBody(),
ActivateNotificationRequest.class); ActivateNotificationRequest.class);
User user = authService.getUser(activateRequest.getAuthToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.getUserById(userId).orElse(null);
List<Notification> recent = notificationService.getActiveNotifications(user); List<Notification> recent = notificationService.getActiveNotifications(user);
@@ -107,7 +120,8 @@ public class NotificationHandler implements RequestHandler {
case "markRead": { case "markRead": {
MarkAsReadRequest markRequest = objectMapper.convertValue(request.getMessageBody(), MarkAsReadRequest markRequest = objectMapper.convertValue(request.getMessageBody(),
MarkAsReadRequest.class); 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()); int updated = notificationService.markAsRead(user, markRequest.getNotificationIds());
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.soune.ReferralInvitee; 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.BaseResponse;
import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.MessageCode;
import ru.soune.nocopy.dto.referral.ReferralRequest; import ru.soune.nocopy.dto.referral.ReferralRequest;
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.user.UserService;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -24,7 +25,9 @@ public class ReferralHandler implements RequestHandler {
private final ReferralService referralService; private final ReferralService referralService;
private final AuthTokenRepository authTokenRepository; private final HttpServletRequest httpServletRequest;
private final UserService userService;
private final ObjectMapper mapper = new ObjectMapper(); private final ObjectMapper mapper = new ObjectMapper();
@@ -32,20 +35,28 @@ public class ReferralHandler implements RequestHandler {
public BaseResponse handle(BaseRequest request) throws Exception { public BaseResponse handle(BaseRequest request) throws Exception {
ReferralRequest referralRequest = mapper.convertValue(request.getMessageBody(), ReferralRequest.class); ReferralRequest referralRequest = mapper.convertValue(request.getMessageBody(), ReferralRequest.class);
String action = referralRequest.getAction(); String action = referralRequest.getAction();
String token = referralRequest.getToken(); Long userId = (Long) httpServletRequest.getAttribute("userId");
AuthToken authToken = authTokenRepository.findByToken(token).orElseThrow(); 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) { switch (action) {
case "refill": case "refill":
return handleRefill(request, authToken.getUser().getId(), referralRequest.getAmount()); return handleRefill(request, userId, referralRequest.getAmount());
case "levels": case "levels":
return handleReferralLevels(request); return handleReferralLevels(request);
case "level": case "level":
return handleUserLevel(request, authToken.getUser().getId()); return handleUserLevel(request, userId);
case "userStats" : case "userStats" :
return handleUserStats(request, authToken.getUser().getId()); return handleUserStats(request, userId);
case "invitees": case "invitees":
return handleInvitees(referralRequest, request, authToken.getUser().getId()); return handleInvitees(referralRequest, request, userId);
} }
return null; return null;
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -11,17 +12,17 @@ import ru.soune.nocopy.dto.*;
import ru.soune.nocopy.dto.register.RegAnswer; import ru.soune.nocopy.dto.register.RegAnswer;
import ru.soune.nocopy.dto.register.RegRequest; import ru.soune.nocopy.dto.register.RegRequest;
import ru.soune.nocopy.entity.referral.Referral; 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.EmailVerificationToken;
import ru.soune.nocopy.entity.user.User;
import ru.soune.nocopy.exception.CompanyAlreadyExist; import ru.soune.nocopy.exception.CompanyAlreadyExist;
import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.exception.NotValidFieldException;
import ru.soune.nocopy.exception.ValidationException; import ru.soune.nocopy.exception.ValidationException;
import ru.soune.nocopy.handler.validator.RegRequestValidator; import ru.soune.nocopy.handler.validator.RegRequestValidator;
import ru.soune.nocopy.repository.ReferralJpaRepository; 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.mail.EmailService;
import ru.soune.nocopy.service.user.AdditionalInfoService; 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.Arrays;
import java.util.Map; import java.util.Map;
@@ -30,12 +31,10 @@ import java.util.Map;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class RegRequestHandler implements RequestHandler { public class RegRequestHandler implements RequestHandler {
private final UserRepository userRepository; private final UserService userService;
private final RegRequestValidator regRequestValidator; private final RegRequestValidator regRequestValidator;
private final AuthService authService;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
private final EmailService emailService; private final EmailService emailService;
@@ -46,11 +45,15 @@ public class RegRequestHandler implements RequestHandler {
private final AdditionalInfoService additionalInfoService; private final AdditionalInfoService additionalInfoService;
private final JwtUtil jwtUtil;
private final HttpServletRequest httpServletRequest;
@Override @Override
public BaseResponse handle(BaseRequest request) throws ValidationException { public BaseResponse handle(BaseRequest request) throws ValidationException {
RegRequest regRequest = objectMapper.convertValue(request.getMessageBody(), RegRequest.class); RegRequest regRequest = objectMapper.convertValue(request.getMessageBody(), RegRequest.class);
try { try {
if (userRepository.existsByEmail(regRequest.getEmail()) || userRepository.existsByPhone(regRequest.getPhone())) { if (userService.existsByEmailOrPhone(regRequest.getEmail(), regRequest.getPhone())) {
RegAnswer regAnswer = new RegAnswer(); RegAnswer regAnswer = new RegAnswer();
regAnswer.setFieldErrors(Arrays.asList(Map.of("email", regRequest.getEmail()))); regAnswer.setFieldErrors(Arrays.asList(Map.of("email", regRequest.getEmail())));
regAnswer.setFieldErrors(Arrays.asList(Map.of("phone", regRequest.getPhone()))); regAnswer.setFieldErrors(Arrays.asList(Map.of("phone", regRequest.getPhone())));
@@ -92,14 +95,16 @@ public class RegRequestHandler implements RequestHandler {
} }
boolean verified = mailVerified.equals("true"); boolean verified = mailVerified.equals("true");
Long createrId = (Long) httpServletRequest.getAttribute("userId");
AuthToken authToken = authService.register(regRequest, verified); User user = userService.createUser(regRequest, verified, createrId);
EmailVerificationToken emailToken = emailService.createEmailVerificationToken(authToken);
EmailVerificationToken emailToken = emailService.createEmailVerificationToken(user);
RegAnswer regAnswer = new RegAnswer(); RegAnswer regAnswer = new RegAnswer();
if (verified) { if (verified) {
try { try {
emailService.sendVerificationEmail(authToken.getUser(), emailToken.getToken()); emailService.sendVerificationEmail(user, emailToken.getToken());
} catch (Exception e) { } catch (Exception e) {
return new BaseResponse(request.getMsgId(), MessageCode.SEND_EMAIL_EXCEPTION.getCode(), return new BaseResponse(request.getMsgId(), MessageCode.SEND_EMAIL_EXCEPTION.getCode(),
MessageCode.SEND_EMAIL_EXCEPTION.getDescription(), Map.of( MessageCode.SEND_EMAIL_EXCEPTION.getDescription(), Map.of(
@@ -111,23 +116,22 @@ public class RegRequestHandler implements RequestHandler {
regAnswer.setVerified(false); regAnswer.setVerified(false);
regAnswer.setActive(false); regAnswer.setActive(false);
} else { } else {
regAnswer.setUserId(authToken.getUser().getId()); regAnswer.setUserId(user.getId());
regAnswer.setVerified(true); regAnswer.setVerified(true);
regAnswer.setActive(true); regAnswer.setActive(true);
} }
String token = authToken.getToken(); String token = jwtUtil.generateToken(user.getId(), user.getEmail());
authService.useUserAuthToken(token);
regAnswer.setToken(token); regAnswer.setToken(token);
regAnswer.setUserId(authToken.getUser().getId()); regAnswer.setUserId(user.getId());
if (regRequest.getAccountType().equals("b2c")) { 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(), return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(),
MessageCode.SUCCESS.getDescription(), regAnswer); MessageCode.SUCCESS.getDescription(), regAnswer);
@@ -11,21 +11,16 @@ import ru.soune.nocopy.dto.MessageCode;
import ru.soune.nocopy.dto.file.ActionResponse; import ru.soune.nocopy.dto.file.ActionResponse;
import ru.soune.nocopy.dto.register.ResetPasswordRequest; import ru.soune.nocopy.dto.register.ResetPasswordRequest;
import ru.soune.nocopy.dto.register.ResetPasswordResponse; 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.EmailVerificationToken;
import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.entity.user.User;
import ru.soune.nocopy.exception.NotValidFieldException;
import ru.soune.nocopy.exception.UserNotFoundException; import ru.soune.nocopy.exception.UserNotFoundException;
import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.repository.EmailVerificationTokenRepository; import ru.soune.nocopy.repository.EmailVerificationTokenRepository;
import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.repository.UserRepository;
import ru.soune.nocopy.service.mail.EmailService; 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.Arrays;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
@Component @Component
@Slf4j @Slf4j
@@ -36,35 +31,33 @@ public class ResetPasswordHandler implements RequestHandler{
private final EmailService emailService; private final EmailService emailService;
private final AuthService authService;
private final UserRepository userRepository; private final UserRepository userRepository;
private final EmailVerificationTokenRepository emailVerificationTokenRepository; private final EmailVerificationTokenRepository emailVerificationTokenRepository;
private final AuthTokenRepository authTokenRepository;
private final PasswordEncoder passwordEncoder; private final PasswordEncoder passwordEncoder;
private final JwtUtil jwtUtil;
@Override @Override
public BaseResponse handle(BaseRequest request) throws Exception { public BaseResponse handle(BaseRequest request) throws Exception {
ResetPasswordRequest resetPasswordRequest = objectMapper.convertValue(request.getMessageBody(), ResetPasswordRequest resetPasswordRequest = objectMapper.convertValue(request.getMessageBody(),
ResetPasswordRequest.class); ResetPasswordRequest.class);
String action = resetPasswordRequest.getAction(); String action = resetPasswordRequest.getAction();
User user = userRepository.findByEmail(resetPasswordRequest.getEmail()); User user = userRepository.findByEmail(resetPasswordRequest.getEmail());
AuthToken authToken;
if (user == null) { if (user == null) {
throw new UserNotFoundException("User not found with email: " + resetPasswordRequest.getEmail()); throw new UserNotFoundException("User not found with email: " + resetPasswordRequest.getEmail());
} }
String authToken;
switch (action) { switch (action) {
case "resetPassword": 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()); return successResponse(request, authToken, user, MessageCode.SUCCESS.getDescription());
case "confirmVerification": case "confirmVerification":
@@ -78,9 +71,7 @@ public class ResetPasswordHandler implements RequestHandler{
MessageCode.INVALID_TOKEN.getDescription(), Map.of("verifyToken", verifyToken)); MessageCode.INVALID_TOKEN.getDescription(), Map.of("verifyToken", verifyToken));
} }
List<AuthToken> authTokens = authTokenRepository.findByUserId(user.getId()); authToken = jwtUtil.generateToken(user.getId(), user.getEmail());
authToken = authTokens.isEmpty() ? authService.generateAuthToken(user): authTokens.getFirst();
user.setPassword(passwordEncoder.encode(resetPasswordRequest.getPassword())); user.setPassword(passwordEncoder.encode(resetPasswordRequest.getPassword()));
user.setActive(true); 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 resetPasswordResponse = new ResetPasswordResponse();
resetPasswordResponse.setAuthToken(authToken.getToken()); resetPasswordResponse.setAuthToken(authToken);
resetPasswordResponse.setUserId(user.getId()); resetPasswordResponse.setUserId(user.getId());
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), message, resetPasswordResponse); return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), message, resetPasswordResponse);
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; 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.entity.user.User;
import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.service.tariff.TariffService; import ru.soune.nocopy.service.tariff.TariffService;
import ru.soune.nocopy.service.user.UserService;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -28,7 +30,9 @@ public class TariffHandler implements RequestHandler {
private final TariffService tariffService; private final TariffService tariffService;
private final AuthTokenRepository authTokenRepository; private final UserService userService;
private final HttpServletRequest httpServletRequest;
@Override @Override
public BaseResponse handle(BaseRequest request) throws Exception { public BaseResponse handle(BaseRequest request) throws Exception {
@@ -128,8 +132,16 @@ public class TariffHandler implements RequestHandler {
} }
private BaseResponse handleGetTariffs(BaseRequest request, TariffRequest tariffRequest) { private BaseResponse handleGetTariffs(BaseRequest request, TariffRequest tariffRequest) {
AuthToken authToken = authTokenRepository.findByToken(tariffRequest.getUserToken()).orElseThrow(); Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = authToken.getUser(); 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( if (tariffRequest.getTariffTerm() == null || !TariffTimeTerm.validTerms().contains(
tariffRequest.getTariffTerm())) { tariffRequest.getTariffTerm())) {
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; 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.dto.tokenoperation.TokenOperationRequest;
import ru.soune.nocopy.entity.tokenoperation.OperationType; import ru.soune.nocopy.entity.tokenoperation.OperationType;
import ru.soune.nocopy.entity.tokenoperation.TokenOperation; import ru.soune.nocopy.entity.tokenoperation.TokenOperation;
import ru.soune.nocopy.service.register.AuthService;
import ru.soune.nocopy.service.tokenoperation.TokenOperationService; import ru.soune.nocopy.service.tokenoperation.TokenOperationService;
import java.util.HashMap; import java.util.HashMap;
@@ -26,7 +26,7 @@ public class TokenOperationHandler implements RequestHandler {
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
private final AuthService authService; private final HttpServletRequest httpServletRequest;
@Override @Override
public BaseResponse handle(BaseRequest request) throws Exception { public BaseResponse handle(BaseRequest request) throws Exception {
@@ -91,16 +91,7 @@ public class TokenOperationHandler implements RequestHandler {
} }
private BaseResponse handleGetList(Integer msgId, TokenOperationRequest request) { private BaseResponse handleGetList(Integer msgId, TokenOperationRequest request) {
if (request.getToken() == null) { Long userId = (Long) httpServletRequest.getAttribute("userId");
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());
try { try {
Page<TokenOperation> page = tokenOperationService.findByUserId( Page<TokenOperation> page = tokenOperationService.findByUserId(
@@ -189,16 +180,7 @@ public class TokenOperationHandler implements RequestHandler {
} }
private BaseResponse handleCreate(Integer msgId, TokenOperationRequest request) { private BaseResponse handleCreate(Integer msgId, TokenOperationRequest request) {
if (request.getToken() == null) { Long userId = (Long) httpServletRequest.getAttribute("userId");
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());
try { try {
TokenOperation operation = tokenOperationService.create( TokenOperation operation = tokenOperationService.create(
@@ -316,16 +298,7 @@ public class TokenOperationHandler implements RequestHandler {
} }
private BaseResponse handleDeleteAllByUser(Integer msgId, TokenOperationRequest request) { private BaseResponse handleDeleteAllByUser(Integer msgId, TokenOperationRequest request) {
if (request.getToken() == null) { Long userId = (Long) httpServletRequest.getAttribute("userId");
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());
try { try {
tokenOperationService.deleteByUserId(userId); tokenOperationService.deleteByUserId(userId);
@@ -350,16 +323,7 @@ public class TokenOperationHandler implements RequestHandler {
} }
private BaseResponse handleGetStats(Integer msgId, TokenOperationRequest request) { private BaseResponse handleGetStats(Integer msgId, TokenOperationRequest request) {
if (request.getToken() == null) { Long userId = (Long) httpServletRequest.getAttribute("userId");
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());
if (userId == null) { if (userId == null) {
return new BaseResponse( return new BaseResponse(
@@ -405,16 +369,7 @@ public class TokenOperationHandler implements RequestHandler {
} }
private BaseResponse handleFilter(Integer msgId, TokenOperationRequest request) { private BaseResponse handleFilter(Integer msgId, TokenOperationRequest request) {
if (request.getToken() == null) { Long userId = (Long) httpServletRequest.getAttribute("userId");
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());
try { try {
Page<TokenOperation> page = tokenOperationService.findByFilters( Page<TokenOperation> page = tokenOperationService.findByFilters(
@@ -10,22 +10,18 @@ import ru.soune.nocopy.dto.BaseResponse;
import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.MessageCode;
import ru.soune.nocopy.dto.register.RegAnswer; import ru.soune.nocopy.dto.register.RegAnswer;
import ru.soune.nocopy.dto.register.VerifyUserRequest; 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.EmailVerificationToken;
import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.entity.user.User;
import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.exception.NotValidFieldException;
import ru.soune.nocopy.exception.UserNotFoundException; import ru.soune.nocopy.exception.UserNotFoundException;
import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.repository.EmailVerificationTokenRepository; import ru.soune.nocopy.repository.EmailVerificationTokenRepository;
import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.repository.UserRepository;
import ru.soune.nocopy.service.mail.EmailService; 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.service.user.UserService;
import ru.soune.nocopy.util.JwtUtil;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
@Component @Component
@Slf4j @Slf4j
@@ -41,9 +37,7 @@ public class VerifyRegisterUserHandler implements RequestHandler {
private final UserService userService; private final UserService userService;
private final AuthTokenRepository authTokenRepository; private final JwtUtil jwtUtil;
private final AuthService authService;
@Override @Override
public BaseResponse handle(BaseRequest request) throws MessagingException, IOException { public BaseResponse handle(BaseRequest request) throws MessagingException, IOException {
@@ -54,45 +48,37 @@ public class VerifyRegisterUserHandler implements RequestHandler {
User user = userRepository.findById(userId) User user = userRepository.findById(userId)
.orElseThrow(() -> new UserNotFoundException("User not found with id: " + userId)); .orElseThrow(() -> new UserNotFoundException("User not found with id: " + userId));
List<AuthToken> userAuthTokens = authTokenRepository.findByUserId(userId);
AuthToken authToken = userAuthTokens.isEmpty() ? authService.generateAuthToken(user): userAuthTokens.getFirst();
if (verifyUserRequest.getResend() != null && verifyUserRequest.getResend() == 1) { 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()); 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()); 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) { if (token != null) {
emailVerificationTokenRepository.delete(token); emailVerificationTokenRepository.delete(token);
} }
EmailVerificationToken newToken = emailService.createEmailVerificationToken(authToken); EmailVerificationToken newToken = emailService.createEmailVerificationToken(user);
emailService.sendVerificationEmail(user, newToken.getToken()); emailService.sendVerificationEmail(user, newToken.getToken());
log.info("New verification token generated for user {}", user.getEmail()); 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", return successResponse(request, authToken, "New verification code has been sent",
false, false, user.getEmail()); 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); EmailVerificationToken token = emailVerificationTokenRepository.findByUserIdAndToken(user.getId(), providedToken);
@@ -110,10 +96,10 @@ public class VerifyRegisterUserHandler implements RequestHandler {
updateUser.isEmailVerified(), updateUser.getEmail()); 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) { boolean isVerified, String email) {
RegAnswer regAnswer = new RegAnswer(); RegAnswer regAnswer = new RegAnswer();
regAnswer.setToken(authToken.getToken()); regAnswer.setToken(authToken);
regAnswer.setVerified(isVerified); regAnswer.setVerified(isVerified);
regAnswer.setActive(isActive); regAnswer.setActive(isActive);
regAnswer.setEmail(email); regAnswer.setEmail(email);
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; 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.complaint.LawCaseService;
import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileEntityService;
import ru.soune.nocopy.service.geo.GeoCountryService; 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.ViolationService;
import ru.soune.nocopy.service.violation.ViolationStatus; import ru.soune.nocopy.service.violation.ViolationStatus;
@@ -40,8 +40,6 @@ public class ViolationHandler implements RequestHandler {
private final FileEntityRepository fileRepository; private final FileEntityRepository fileRepository;
private final AuthService authService;
private final FileEntityService fileEntityService; private final FileEntityService fileEntityService;
private final GeoCountryService geoCountryService; private final GeoCountryService geoCountryService;
@@ -50,6 +48,8 @@ public class ViolationHandler implements RequestHandler {
private final ComplaintEntityService complaintEntityService; private final ComplaintEntityService complaintEntityService;
private final HttpServletRequest httpServletRequest;
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override @Override
@@ -57,9 +57,7 @@ public class ViolationHandler implements RequestHandler {
ViolationRequest violationRequest = objectMapper.convertValue(request.getMessageBody(), ViolationRequest.class); ViolationRequest violationRequest = objectMapper.convertValue(request.getMessageBody(), ViolationRequest.class);
validateRequest(violationRequest); validateRequest(violationRequest);
Long userId = (Long) httpServletRequest.getAttribute("userId");
String token = violationRequest.getToken();
Long userId = authService.useUserAuthToken(token);
List<FileEntity> targetFiles; List<FileEntity> targetFiles;
@@ -135,23 +133,6 @@ public class ViolationHandler implements RequestHandler {
.messageBody(groupedData) .messageBody(groupedData)
.build(); .build();
} else { } else {
// Page<Violation> 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<Violation> violationPage = violationService.getViolationsByFilesAndFilters( Page<Violation> violationPage = violationService.getViolationsByFilesAndFilters(
targetFiles, targetFiles,
startDate, startDate,
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -8,12 +9,9 @@ import ru.soune.nocopy.dto.BaseRequest;
import ru.soune.nocopy.dto.BaseResponse; import ru.soune.nocopy.dto.BaseResponse;
import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.MessageCode;
import ru.soune.nocopy.dto.violation.*; import ru.soune.nocopy.dto.violation.*;
import ru.soune.nocopy.entity.user.AuthToken;
import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.service.violation.ViolationNotionService; import ru.soune.nocopy.service.violation.ViolationNotionService;
import java.util.List; import java.util.List;
import java.util.Optional;
@Slf4j @Slf4j
@Component @Component
@@ -23,7 +21,7 @@ public class ViolationNotionHandler implements RequestHandler {
private final ViolationNotionService notionService; private final ViolationNotionService notionService;
private final AuthTokenRepository authTokenRepository; private final HttpServletRequest httpServletRequest;
@Override @Override
public BaseResponse handle(BaseRequest request) { public BaseResponse handle(BaseRequest request) {
@@ -31,24 +29,7 @@ public class ViolationNotionHandler implements RequestHandler {
ViolationNotionRequest notionRequest = objectMapper.convertValue( ViolationNotionRequest notionRequest = objectMapper.convertValue(
request.getMessageBody(), ViolationNotionRequest.class); request.getMessageBody(), ViolationNotionRequest.class);
if (notionRequest.getToken() == null) { Long userId = (Long) httpServletRequest.getAttribute("userId");
return new BaseResponse(
request.getMsgId(),
MessageCode.INVALID_TOKEN.getCode(),
"Token is required",
"field: token");
}
Optional<AuthToken> 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();
String action = notionRequest.getAction(); String action = notionRequest.getAction();
if (action == null || action.trim().isEmpty()) { if (action == null || action.trim().isEmpty()) {
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler; package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; 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.MessageCode;
import ru.soune.nocopy.dto.violation.ViolationStatisticsRequest; import ru.soune.nocopy.dto.violation.ViolationStatisticsRequest;
import ru.soune.nocopy.dto.violation.ViolationStatisticsResponse; 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.FileEntityNotFoundException;
import ru.soune.nocopy.exception.UserNotHavePermission; import ru.soune.nocopy.exception.UserNotHavePermission;
import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.service.violation.ViolationService; import ru.soune.nocopy.service.violation.ViolationService;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException; import java.time.format.DateTimeParseException;
import java.util.Optional;
@Slf4j @Slf4j
@Component @Component
@@ -28,7 +26,7 @@ public class ViolationStatisticsHandler implements RequestHandler {
private final ViolationService violationService; 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"); 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 statRequest = objectMapper.convertValue(request.getMessageBody(),
ViolationStatisticsRequest.class); ViolationStatisticsRequest.class);
validateRequest(statRequest);
LocalDateTime startDate = null; LocalDateTime startDate = null;
LocalDateTime endDate = null; LocalDateTime endDate = null;
@@ -51,13 +47,7 @@ public class ViolationStatisticsHandler implements RequestHandler {
} }
} }
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(statRequest.getToken()); Long userId = (Long) httpServletRequest.getAttribute("userId");
if (tokenOptional.isEmpty()) {
throw new IllegalArgumentException("User token is required");
}
Long userId = tokenOptional.orElseThrow().getUser().getId();
ViolationStatisticsResponse statistics; ViolationStatisticsResponse statistics;
try { try {
@@ -91,12 +81,6 @@ public class ViolationStatisticsHandler implements RequestHandler {
.build(); .build();
} }
private void validateRequest(ViolationStatisticsRequest request) {
if (request.getToken() == null) {
throw new IllegalArgumentException("Token is required");
}
}
private LocalDateTime parseDate(String dateStr) { private LocalDateTime parseDate(String dateStr) {
try { try {
return LocalDateTime.parse(dateStr, DATE_FORMATTER); return LocalDateTime.parse(dateStr, DATE_FORMATTER);
@@ -84,8 +84,4 @@ public class FileUploadRequestValidator implements Validator {
"Invalid file type. Valid types: " + Arrays.toString(FileType.values())); "Invalid file type. Valid types: " + Arrays.toString(FileType.values()));
} }
} }
private String getFileExtension(String fileName) {
return fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
}
} }
@@ -20,7 +20,6 @@ import ru.soune.nocopy.repository.*;
import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.service.file.cloud.CloudStorageService;
import ru.soune.nocopy.util.FileUtil; import ru.soune.nocopy.util.FileUtil;
import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.security.MessageDigest; import java.security.MessageDigest;
@@ -38,8 +37,6 @@ public class FileSimilarityService {
private final FileUtil fileUtil; private final FileUtil fileUtil;
private final AuthTokenRepository authTokenRepository;
private final FileEntityRepository fileEntityRepository; private final FileEntityRepository fileEntityRepository;
private final CloudStorageService cloudStorageService; private final CloudStorageService cloudStorageService;
@@ -149,7 +146,7 @@ public class FileSimilarityService {
String fileId, String fileId,
List<String> similarityLevels, List<String> similarityLevels,
Pageable pageable, Pageable pageable,
String authToken) { Long userId) {
try { try {
var imageHashEntity = hashRepository.findById(fileId) var imageHashEntity = hashRepository.findById(fileId)
@@ -159,7 +156,6 @@ public class FileSimilarityService {
List<Long> userIds; List<Long> userIds;
List<SimilarImageProjection> candidates = repository.findCandidates(fileId); List<SimilarImageProjection> candidates = repository.findCandidates(fileId);
Long userId = authTokenRepository.findUserIdByToken(authToken);
User user = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("User not found")); User user = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("User not found"));
Company company = user.getCompany(); Company company = user.getCompany();
@@ -30,16 +30,12 @@ import ru.soune.nocopy.service.cost.CostService;
import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileEntityService;
import ru.soune.nocopy.service.file.FileUploadService; import ru.soune.nocopy.service.file.FileUploadService;
import ru.soune.nocopy.service.file.cloud.CloudStorageService; 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.notification.NotificationService;
import ru.soune.nocopy.service.register.AuthService;
import ru.soune.nocopy.service.tariff.TariffInfoService; import ru.soune.nocopy.service.tariff.TariffInfoService;
import ru.soune.nocopy.util.FileUtil; import ru.soune.nocopy.util.FileUtil;
import java.io.*; import java.io.*;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL; import java.net.URL;
import java.nio.file.*; import java.nio.file.*;
import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermission;
@@ -97,10 +93,6 @@ public class FileUploadServiceImpl implements FileUploadService {
private final NotificationService notificationService; private final NotificationService notificationService;
private final AuthService authService;
private final ModerationFileService moderationFileService;
private final CloudStorageService cloudStorageService; private final CloudStorageService cloudStorageService;
@PostConstruct @PostConstruct
@@ -105,6 +105,7 @@ public class EmailService {
} }
@Transactional @Transactional
@Deprecated
public EmailVerificationToken createEmailVerificationToken(AuthToken authToken) { public EmailVerificationToken createEmailVerificationToken(AuthToken authToken) {
EmailVerificationToken existingToken = emailVerificationTokenRepository EmailVerificationToken existingToken = emailVerificationTokenRepository
.findByUserId(authToken.getUser().getId()); .findByUserId(authToken.getUser().getId());
@@ -121,6 +122,23 @@ public class EmailService {
return emailVerificationTokenRepository.save(emailToken); 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() { private String generateVerificationCode() {
SecureRandom random = new SecureRandom(); SecureRandom random = new SecureRandom();
int code = 100000 + random.nextInt(900000); int code = 100000 + random.nextInt(900000);
@@ -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<Company> 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<UserNotActive> 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);
}
}
}
@@ -1,21 +1,30 @@
package ru.soune.nocopy.service.user; package ru.soune.nocopy.service.user;
import jakarta.persistence.EntityNotFoundException;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; 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.ChangePasswordRequest;
import ru.soune.nocopy.dto.register.RegRequest;
import ru.soune.nocopy.dto.tarriff.TariffInfoDTO; import ru.soune.nocopy.dto.tarriff.TariffInfoDTO;
import ru.soune.nocopy.dto.user.UserDTO; import ru.soune.nocopy.dto.user.UserDTO;
import ru.soune.nocopy.dto.user.UserRequest; 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.Tariff;
import ru.soune.nocopy.entity.tarif.TariffInfo; 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.entity.user.User;
import ru.soune.nocopy.exception.CompanyAlreadyExist;
import ru.soune.nocopy.exception.InvalidUserEmail; import ru.soune.nocopy.exception.InvalidUserEmail;
import ru.soune.nocopy.exception.NotValidationPasswordException; import ru.soune.nocopy.exception.NotValidationPasswordException;
import ru.soune.nocopy.exception.UserNotFoundException; import ru.soune.nocopy.exception.UserNotFoundException;
import ru.soune.nocopy.repository.CompanyRepository;
import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.repository.UserRepository;
import ru.soune.nocopy.service.file.FileStatsService; import ru.soune.nocopy.service.file.FileStatsService;
import ru.soune.nocopy.service.tariff.TariffInfoService;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@@ -30,6 +39,10 @@ public class UserService {
private final FileStatsService fileStatsService; private final FileStatsService fileStatsService;
private final CompanyRepository companyRepository;
private final TariffInfoService tariffInfoService;
@Transactional @Transactional
public User changePassword(User user, ChangePasswordRequest request) { public User changePassword(User user, ChangePasswordRequest request) {
if (!passwordEncoder.matches(request.getCurrentPassword(), user.getPassword())) { if (!passwordEncoder.matches(request.getCurrentPassword(), user.getPassword())) {
@@ -82,6 +95,93 @@ public class UserService {
return userRepository.save(user); return userRepository.save(user);
} }
@Transactional
public User createUser(RegRequest registerRequest, boolean verified, Long createrId) {
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(user, createrId);
}
if (registerRequest.getPhone() != null) {
user.setPhone(registerRequest.getPhone());
}
return userRepository.save(user);
}
public Optional<User> 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<Company> 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(User user, Long companyUserId) {
User companyUser = getUserById(companyUserId).orElseThrow(() ->
new EntityNotFoundException("Not found user id: " + companyUserId));
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) { private void updateUserFromRequest(User user, UserRequest request) {
if (request.getFullName() != null) { if (request.getFullName() != null) {
user.setFullName(request.getFullName()); user.setFullName(request.getFullName());
@@ -0,0 +1,66 @@
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.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
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;
import java.util.List;
@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;
}
Long userId = jwtUtil.extractUserId(token);
String email = jwtUtil.extractEmail(token);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(email, null, List.of(new SimpleGrantedAuthority("ROLE_USER")));
SecurityContextHolder.getContext().setAuthentication(authentication);
request.setAttribute("userId", userId);
request.setAttribute("email", email);
filterChain.doFilter(request, response);
}
}
@@ -0,0 +1,65 @@
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;
@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) {
return Jwts.builder()
.setSubject(email)
.claim("userId", userId)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expiration))
.signWith(getSigningKey(), SignatureAlgorithm.HS256)
.compact();
}
public Claims extractClaims(String token) {
return Jwts.parser()
.setSigningKey(getSigningKey())
.build()
.parseClaimsJws(token)
.getBody();
}
public String extractEmail(String token) {
return extractClaims(token).getSubject();
}
public Long extractUserId(String token) {
return extractClaims(token).get("userId", Long.class);
}
public boolean isTokenExpired(String token) {
return extractClaims(token).getExpiration().before(new Date());
}
public boolean validateToken(String token) {
try {
return !isTokenExpired(token);
} catch (Exception e) {
return false;
}
}
}
+4
View File
@@ -129,6 +129,10 @@ search:
host: "193.46.217.94" host: "193.46.217.94"
port: 3128 port: 3128
jwt:
secret: SF9fsWH0ahlmTk9pKGXVdPHKxkdjUZnquCs9j7gYNZR
expiration: 3600000
yookassa: yookassa:
secret-key: test_0Yns_0NHV5GJf6ypJ5HC4NSfnLO8SJkw-1PwrVWsDl4 secret-key: test_0Yns_0NHV5GJf6ypJ5HC4NSfnLO8SJkw-1PwrVWsDl4
shop-id: 1276731 shop-id: 1276731