NCBACK-162
Test Workflow / test (push) Has been cancelled

This commit is contained in:
2026-06-01 14:49:36 +07:00
parent b107b805fc
commit 184f3a730c
9 changed files with 95 additions and 180 deletions
@@ -361,7 +361,6 @@ public class ApiController {
public ResponseEntity<BaseResponse> findSimilarFiles(
@PathVariable("version") int version,
@PathVariable String fileId,
@RequestParam(value = "auth_token", required = false) String authToken,
@RequestParam(required = false) List<String> similarityLevels,
@PageableDefault(size = 20, sort = "hammingDistance") Pageable pageable) {
@@ -373,10 +372,12 @@ public class ApiController {
MessageCode.INVALID_FIELD.getDescription(), null));
}
Long userId = (Long) httpServletRequest.getAttribute("userId");
BaseResponse response;
if ("image".equals(fileEntity.getMimeType())) {
Page<SimilarFileDTO> similarFilesPage = fileSimilarityService.findSimilarFiles(
fileId, similarityLevels, pageable, authToken);
fileId, similarityLevels, pageable, userId);
response = buildSuccessResponse(similarFilesPage, MessageCode.SIMILAR_FILES_FOUND);
} else {
List<SimilarFileDTO> results = processNonImageFile(fileEntity, true);
@@ -14,7 +14,6 @@ import ru.soune.nocopy.dto.violation.ViolationRequest;
import ru.soune.nocopy.entity.file.FileEntity;
import ru.soune.nocopy.entity.search.GlobalSearchTask;
import ru.soune.nocopy.entity.search.SearchStatus;
import ru.soune.nocopy.exception.NotFoundAuthToken;
import ru.soune.nocopy.repository.GlobalSearchTaskRepository;
import ru.soune.nocopy.service.search.GlobalSearchService;
import ru.soune.nocopy.service.violation.ViolationService;
@@ -37,92 +36,47 @@ public class GlobalSearchController {
@PostMapping("/start")
public ResponseEntity<?> startSearch(
@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));
}
@RequestBody GlobalSearchStartRequest request) {
GlobalSearchStartResponse response = new GlobalSearchStartResponse();
try {
Long userId = (Long) httpServletRequest.getAttribute("userId");
Long userId = (Long) httpServletRequest.getAttribute("userId");
List<FileEntity> filesToProcess = globalSearchService.getFilesToProcess(request, userId);
List<FileEntity> filesToProcess = globalSearchService.getFilesToProcess(request, userId);
if (filesToProcess.isEmpty()) return ResponseEntity.ok().body("Files for search not found");
if (filesToProcess.isEmpty()) return ResponseEntity.ok().body("Files for search not found");
String taskId = globalSearchService.startSearch(request, userId, filesToProcess);
String taskId = globalSearchService.startSearch(request, userId, filesToProcess);
response.setTaskId(taskId);
response.setStatus(SearchStatus.ACCEPTED.name());
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));
}
response.setTaskId(taskId);
response.setStatus(SearchStatus.ACCEPTED.name());
response.setTotalFiles(filesToProcess.size());
return ResponseEntity.ok(response);
}
@GetMapping("/actual-task")
public ResponseEntity<?> getStatus(@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));
}
public ResponseEntity<?> getStatus() {
Optional<GlobalSearchTask> taskOptional;
try {
Long userId = (Long) httpServletRequest.getAttribute("userId");
Long userId = (Long) httpServletRequest.getAttribute("userId");
taskOptional = searchTaskRepository.findByUserIdAndStatus(userId,
"PROCESSING");
taskOptional = searchTaskRepository.findByUserIdAndStatus(userId,
"PROCESSING");
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));
}
if (taskOptional.isEmpty()) return ResponseEntity.ok().body("Task not found");
return ResponseEntity.ok(taskOptional.get());
}
@GetMapping("/violation-summary")
public ResponseEntity<?> getSummary(@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));
}
public ResponseEntity<?> getSummary() {
List<FileViolationSummaryDTO> fileViolationsSummary;
try {
Long userId = (Long) httpServletRequest.getAttribute("userId");
Long userId = (Long) httpServletRequest.getAttribute("userId");
fileViolationsSummary = violationService.getFileViolationsSummary(userId);
fileViolationsSummary = violationService.getFileViolationsSummary(userId);
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));
}
if (fileViolationsSummary.isEmpty()) return ResponseEntity.ok().body("Violations summary not found");
return ResponseEntity.ok(fileViolationsSummary);
}
@@ -139,38 +93,23 @@ public class GlobalSearchController {
}
@GetMapping("/status/{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));
}
public ResponseEntity<?> getStatus(@PathVariable String taskId) {
GlobalSearchStatusResponse response;
Long userId = (Long) httpServletRequest.getAttribute("userId");
try {
Long userId = (Long) httpServletRequest.getAttribute("userId");
Optional<GlobalSearchTask> taskOptional = searchTaskRepository.findByTaskIdAndUserId(taskId, userId);
Optional<GlobalSearchTask> taskOptional = searchTaskRepository.findByTaskIdAndUserId(taskId, userId);
if (taskOptional.isEmpty()) return ResponseEntity.ok().body("Task not found");
if (taskOptional.isEmpty()) return ResponseEntity.ok().body("Task not found");
GlobalSearchTask task = taskOptional.orElseThrow();
GlobalSearchTask task = taskOptional.orElseThrow();
int progress = task.getTotalFiles() > 0 ? task.getProcessedFiles() * 100 / task.getTotalFiles() : 0;
int progress = task.getTotalFiles() > 0 ? task.getProcessedFiles() * 100 / task.getTotalFiles() : 0;
response = new GlobalSearchStatusResponse();
response.setTaskId(taskId);
response.setStatus(task.getStatus());
response.setProgress(progress);
response = new GlobalSearchStatusResponse();
response.setTaskId(taskId);
response.setStatus(task.getStatus());
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);
}
@@ -1,6 +1,7 @@
package ru.soune.nocopy.controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
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.PayoutRequest;
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.exception.InsufficientFundsException;
import ru.soune.nocopy.exception.InvalidPayoutMethodException;
import ru.soune.nocopy.exception.NotFoundAuthToken;
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.PayoutRequestService;
import ru.soune.nocopy.service.user.UserService;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
@RestController
@@ -38,21 +35,21 @@ public class PayoutController {
private final PayoutMethodService payoutMethodService;
private final AuthTokenRepository authTokenRepository;
private final HttpServletRequest httpServletRequest;
private final UserService userService;
/*
Create payout
*/
@PostMapping("/create-request")
public ResponseEntity<?> createPayoutRequest(@RequestHeader("Authorization") String tokenHeader,
@Valid @RequestBody PayoutRequestDTO request) {
String token = tokenHeader.replace("Bearer ", "");
public ResponseEntity<?> createPayoutRequest(@Valid @RequestBody PayoutRequestDTO request) {
Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
User user = authToken.getUser();
if (user == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found with id: " + userId);
}
try {
PayoutRequest payoutRequest = payoutRequestService.createPayoutRequest(user.getId(), request);
@@ -76,15 +73,13 @@ public class PayoutController {
Cancel payout
*/
@PostMapping("/requests/{requestId}/cancel")
public ResponseEntity<PayoutRequest> cancelPayoutRequest(@PathVariable Long requestId,
@RequestHeader("Authorization") String tokenHeader) {
String token = tokenHeader.replace("Bearer ", "");
public ResponseEntity<PayoutRequest> cancelPayoutRequest(@PathVariable Long requestId) {
Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
User user = authToken.getUser();
if (user == null) {
return ResponseEntity.notFound().build();
}
PayoutRequest cancelled = payoutRequestService.cancelPayoutRequest(user.getId(), requestId);
@@ -95,14 +90,13 @@ public class PayoutController {
Get user payouts
*/
@GetMapping("/requests")
public ResponseEntity<List<PayoutRequest>> getUserRequests(@RequestHeader("Authorization") String tokenHeader) {
String token = tokenHeader.replace("Bearer ", "");
public ResponseEntity<List<PayoutRequest>> getUserRequests() {
Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
User user = authToken.getUser();
if (user == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(payoutRequestService.getUserPayoutRequests(user.getId()));
}
@@ -111,15 +105,13 @@ public class PayoutController {
Get payout by id
*/
@GetMapping("/requests/{requestId}")
public ResponseEntity<PayoutRequest> getPayoutRequest(@PathVariable Long requestId,
@RequestHeader("Authorization") String tokenHeader) {
String token = tokenHeader.replace("Bearer ", "");
public ResponseEntity<PayoutRequest> getPayoutRequest(@PathVariable Long requestId) {
Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
User user = authToken.getUser();
if (user == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(payoutRequestService.getPayoutRequest(user.getId(), requestId));
}
@@ -128,14 +120,13 @@ public class PayoutController {
Get payout by id
*/
@GetMapping("user/payout-methods")
public ResponseEntity<List<PayoutMethodDTO>> getUserMethods(@RequestHeader("Authorization") String tokenHeader) {
String token = tokenHeader.replace("Bearer ", "");
public ResponseEntity<List<PayoutMethodDTO>> getUserMethods() {
Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
User user = authToken.getUser();
if (user == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(payoutMethodService.getUserMethods(user.getId()));
}
@@ -158,15 +149,13 @@ public class PayoutController {
add card method by userId
*/
@PostMapping("/payout-method/card")
public ResponseEntity<PayoutMethodDTO> addCardMethod(@Valid @RequestBody AddCardRequest request,
@RequestHeader("Authorization") String tokenHeader) {
String token = tokenHeader.replace("Bearer ", "");
public ResponseEntity<PayoutMethodDTO> addCardMethod(@Valid @RequestBody AddCardRequest request) {
Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
User user = authToken.getUser();
if (user == null) {
return ResponseEntity.notFound().build();
}
CardPayoutMethod method = payoutMethodService.addCardMethod(user.getId(), request);
@@ -178,15 +167,13 @@ public class PayoutController {
add bank payout-method
*/
@PostMapping("/payout-method/bank-transfer")
public ResponseEntity<PayoutMethodDTO> addBankTransferMethod(@Valid @RequestBody AddBankTransferRequest request,
@RequestHeader("Authorization") String tokenHeader) {
String token = tokenHeader.replace("Bearer ", "");
public ResponseEntity<PayoutMethodDTO> addBankTransferMethod(@Valid @RequestBody AddBankTransferRequest request) {
Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
User user = authToken.getUser();
if (user == null) {
return ResponseEntity.notFound().build();
}
BankTransferPayoutMethod method = payoutMethodService.addBankTransferMethod(user.getId(), request);
@@ -199,15 +186,13 @@ public class PayoutController {
set default bank payout-method
*/
@PutMapping("/payout-method/{methodId}/default")
public ResponseEntity<Void> setDefaultMethod(@PathVariable Long methodId,
@RequestHeader("Authorization") String tokenHeader) {
String token = tokenHeader.replace("Bearer ", "");
public ResponseEntity<Void> setDefaultMethod(@PathVariable Long methodId) {
Long userId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.getUserById(userId).orElse(null);
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
User user = authToken.getUser();
if (user == null) {
return ResponseEntity.notFound().build();
}
payoutMethodService.setDefaultMethod(user.getId(), methodId);
@@ -9,5 +9,4 @@ public class AppealRequest {
private String fileId;
private String appealReason;
private String additionalInfo;
private String token;
}
@@ -17,7 +17,4 @@ public class GetViolationsRequest {
@JsonProperty("mark_as_read")
private boolean markAsRead;
@JsonProperty("auth_token")
private String authToken;
}
@@ -1,6 +1,7 @@
package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -46,6 +47,8 @@ public class RegRequestHandler implements RequestHandler {
private final JwtUtil jwtUtil;
private final HttpServletRequest httpServletRequest;
@Override
public BaseResponse handle(BaseRequest request) throws ValidationException {
RegRequest regRequest = objectMapper.convertValue(request.getMessageBody(), RegRequest.class);
@@ -92,8 +95,9 @@ public class RegRequestHandler implements RequestHandler {
}
boolean verified = mailVerified.equals("true");
Long createrId = (Long) httpServletRequest.getAttribute("userId");
User user = userService.createUser(regRequest, verified);
User user = userService.createUser(regRequest, verified, createrId);
EmailVerificationToken emailToken = emailService.createEmailVerificationToken(user);
RegAnswer regAnswer = new RegAnswer();
@@ -9,12 +9,9 @@ import ru.soune.nocopy.dto.BaseRequest;
import ru.soune.nocopy.dto.BaseResponse;
import ru.soune.nocopy.dto.MessageCode;
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 java.util.List;
import java.util.Optional;
@Slf4j
@Component
@@ -20,7 +20,6 @@ import ru.soune.nocopy.repository.*;
import ru.soune.nocopy.service.file.cloud.CloudStorageService;
import ru.soune.nocopy.util.FileUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.MessageDigest;
@@ -38,8 +37,6 @@ public class FileSimilarityService {
private final FileUtil fileUtil;
private final AuthTokenRepository authTokenRepository;
private final FileEntityRepository fileEntityRepository;
private final CloudStorageService cloudStorageService;
@@ -149,7 +146,7 @@ public class FileSimilarityService {
String fileId,
List<String> similarityLevels,
Pageable pageable,
String authToken) {
Long userId) {
try {
var imageHashEntity = hashRepository.findById(fileId)
@@ -159,7 +156,6 @@ public class FileSimilarityService {
List<Long> userIds;
List<SimilarImageProjection> candidates = repository.findCandidates(fileId);
Long userId = authTokenRepository.findUserIdByToken(authToken);
User user = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("User not found"));
Company company = user.getCompany();
@@ -21,7 +21,6 @@ import ru.soune.nocopy.exception.CompanyAlreadyExist;
import ru.soune.nocopy.exception.InvalidUserEmail;
import ru.soune.nocopy.exception.NotValidationPasswordException;
import ru.soune.nocopy.exception.UserNotFoundException;
import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.repository.CompanyRepository;
import ru.soune.nocopy.repository.UserRepository;
import ru.soune.nocopy.service.file.FileStatsService;
@@ -44,7 +43,7 @@ public class UserService {
private final TariffInfoService tariffInfoService;
private final AuthTokenRepository authTokenRepository;
private final UserService userService;
@Transactional
public User changePassword(User user, ChangePasswordRequest request) {
@@ -99,7 +98,7 @@ public class UserService {
}
@Transactional
public User createUser(RegRequest registerRequest, boolean verified) {
public User createUser(RegRequest registerRequest, boolean verified, Long createrId) {
User user = new User();
user.setFullName(registerRequest.getFullName());
user.setEmail(registerRequest.getEmail());
@@ -118,7 +117,7 @@ public class UserService {
} else if (accountType == AccountType.B2C && registerRequest.getCompanyName() == null) {
createIndividualAccount(user);
} else {
createIndividualCompanyAccount(registerRequest, user);
createIndividualCompanyAccount(user, createrId);
}
if (registerRequest.getPhone() != null) {
@@ -167,11 +166,9 @@ public class UserService {
}
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));
private void createIndividualCompanyAccount(User user, Long companyUserId) {
User companyUser = userService.getUserById(companyUserId).orElseThrow(() ->
new EntityNotFoundException("Not found user id: " + companyUserId));
Company company = companyUser.getCompany();
if (company == null) {