Merge branch 'dev' into NCBACK-35
# Conflicts: # README.md # src/main/java/ru/soune/nocopy/controller/ApiController.java # src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java # src/main/java/ru/soune/nocopy/service/file/FileCleanupService.java # src/main/java/ru/soune/nocopy/service/file/FileEntityService.java # src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java # src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java
This commit is contained in:
@@ -3,6 +3,8 @@ package ru.soune.nocopy.controller;
|
||||
import com.vrt.NoCopyFileService;
|
||||
import com.vrt.fileprotection.FileProtector;
|
||||
import com.vrt.fileprotection.NoCopyCheckResult;
|
||||
import com.vrt.fileprotection.audio.AudioCheckResult;
|
||||
import com.vrt.fileprotection.documents.DocumentCheckResult;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.core.io.FileSystemResource;
|
||||
@@ -21,16 +23,20 @@ import ru.soune.nocopy.dto.BaseResponse;
|
||||
import ru.soune.nocopy.dto.MessageCode;
|
||||
import ru.soune.nocopy.dto.file.*;
|
||||
import ru.soune.nocopy.dto.register.RegAnswer;
|
||||
import ru.soune.nocopy.entity.company.Company;
|
||||
import ru.soune.nocopy.entity.file.FileEntity;
|
||||
import ru.soune.nocopy.entity.file.FileStatus;
|
||||
import ru.soune.nocopy.entity.file.ProtectionStatus;
|
||||
import ru.soune.nocopy.entity.file.UploadStatus;
|
||||
import ru.soune.nocopy.entity.user.AuthToken;
|
||||
import ru.soune.nocopy.entity.user.User;
|
||||
import ru.soune.nocopy.exception.*;
|
||||
import ru.soune.nocopy.handler.*;
|
||||
import ru.soune.nocopy.repository.AuthTokenRepository;
|
||||
import ru.soune.nocopy.repository.FileEntityRepository;
|
||||
import ru.soune.nocopy.repository.UserRepository;
|
||||
import ru.soune.nocopy.service.FileSimilarityService;
|
||||
import ru.soune.nocopy.service.file.CheckCounterService;
|
||||
import ru.soune.nocopy.service.file.ProtectionsLimitService;
|
||||
import ru.soune.nocopy.service.file.cloud.CloudStorageService;
|
||||
import ru.soune.nocopy.service.register.AuthService;
|
||||
@@ -74,6 +80,10 @@ public class ApiController {
|
||||
|
||||
private final AuthTokenRepository authTokenRepository;
|
||||
|
||||
private final UserRepository userRepository;
|
||||
|
||||
private final CheckCounterService checkCounterService;
|
||||
|
||||
private final CloudStorageService cloudStorageService;
|
||||
|
||||
@PostMapping("/v{version}/data")
|
||||
@@ -156,46 +166,124 @@ public class ApiController {
|
||||
MessageCode.DUPLICATE_FILE_UPLOAD.getDescription(),
|
||||
duplicateData
|
||||
));
|
||||
} catch (FileFormatException e){
|
||||
return buildErrorResponse(uploadId, chunkNumber, e.getMessage());
|
||||
} catch (Exception e) {
|
||||
log.error("Error uploading chunk", e);
|
||||
return buildErrorResponse(uploadId, chunkNumber, "Failed to upload chunk: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private final NoCopyFileService noCopyFileService;
|
||||
|
||||
@GetMapping("/v{version}/files/{fileId}/similar")
|
||||
public ResponseEntity<BaseResponse> findSimilarFiles(
|
||||
@PathVariable("version") int version,
|
||||
@PathVariable String fileId,
|
||||
@RequestParam(value = "auth_token",required = false) String authToken,
|
||||
@RequestParam(value = "auth_token", required = false) String authToken,
|
||||
@RequestParam(required = false) List<String> similarityLevels,
|
||||
@PageableDefault(size = 20, sort = "hammingDistance") Pageable pageable) {
|
||||
SimilarityFilter filter = SimilarityFilter.builder()
|
||||
.similarityLevels(similarityLevels)
|
||||
.build();
|
||||
Page<SimilarFileDTO> similarFiles = fileSimilarityService.findSimilarFiles(fileId, filter, pageable, authToken);
|
||||
|
||||
String messageDesc;
|
||||
MessageCode success;
|
||||
try {
|
||||
FileEntity fileEntity = fileEntityRepository.findByFileId(fileId);
|
||||
|
||||
if (similarFiles.isEmpty()) {
|
||||
messageDesc = MessageCode.FILE_NOT_FOUND.getDescription();
|
||||
success = MessageCode.SUCCESS;
|
||||
} else {
|
||||
messageDesc = MessageCode.SIMILAR_FILES_FOUND.getDescription();
|
||||
success = MessageCode.SUCCESS;
|
||||
if (fileEntity == null) {
|
||||
return ResponseEntity.ok().body(new BaseResponse(0, MessageCode.INVALID_FIELD.getCode(),
|
||||
MessageCode.INVALID_FIELD.getDescription(), null));
|
||||
}
|
||||
|
||||
BaseResponse response;
|
||||
if ("image".equals(fileEntity.getMimeType())) {
|
||||
Page<SimilarFileDTO> similarFilesPage = fileSimilarityService.findSimilarFiles(
|
||||
fileId, similarityLevels, pageable, authToken);
|
||||
response = buildSuccessResponse(similarFilesPage, MessageCode.SIMILAR_FILES_FOUND);
|
||||
} else {
|
||||
List<SimilarFileDTO> results = processNonImageFile(fileEntity, authToken);
|
||||
log.info("results: {}", results);
|
||||
response = buildSuccessResponse(results, MessageCode.SIMILAR_FILES_FOUND);
|
||||
checkCounterService.incrementCheckCount(fileEntity.getUserId(), fileEntity.getMimeType());
|
||||
}
|
||||
|
||||
return ResponseEntity.ok(response);
|
||||
|
||||
} catch(IllegalArgumentException e) {
|
||||
log.error("Error with file extensions : {}", e.getMessage(), e);
|
||||
return ResponseEntity.ok().body(new BaseResponse(MessageCode.FILE_FOR_SEARCH_NOT_VALID.getCode(),
|
||||
MessageCode.FILE_FOR_SEARCH_NOT_VALID.getCode(),
|
||||
MessageCode.FILE_FOR_SEARCH_NOT_VALID.getDescription(), null));
|
||||
} catch (Exception e) {
|
||||
log.error("Error finding similar files: {}", e.getMessage(), e);
|
||||
return ResponseEntity.ok().body(new BaseResponse(MessageCode.INVALID_FIELD.getCode(),
|
||||
MessageCode.INVALID_FIELD.getCode(),
|
||||
MessageCode.INVALID_FIELD.getDescription(), null));
|
||||
}
|
||||
}
|
||||
|
||||
private List<SimilarFileDTO> processNonImageFile(FileEntity fileEntity, String authToken) throws Exception {
|
||||
List<SimilarFileDTO> results = new ArrayList<>();
|
||||
|
||||
FileEntity duplicateByHash = fileSimilarityService.findDuplicateByHash(fileEntity.getFilePath(),
|
||||
fileEntity.getMimeType(), fileEntity.getUserId());
|
||||
log.info("duplicateByHash: {}", duplicateByHash);
|
||||
if (duplicateByHash != null) {
|
||||
results.add(fileSimilarityService.buildDTO(duplicateByHash));
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
Map<String, Object> responseData = new HashMap<>();
|
||||
responseData.put("content", similarFiles.getContent());
|
||||
responseData.put("page", similarFiles.getNumber());
|
||||
responseData.put("size", similarFiles.getSize());
|
||||
responseData.put("totalElements", similarFiles.getTotalElements());
|
||||
responseData.put("totalPages", similarFiles.getTotalPages());
|
||||
responseData.put("hasNext", similarFiles.hasNext());
|
||||
responseData.put("hasPrevious", similarFiles.hasPrevious());
|
||||
File file = new File(fileEntity.getFilePath());
|
||||
FileProtector.Type type = "document".equals(fileEntity.getMimeType()) ?
|
||||
FileProtector.Type.DOC : FileProtector.Type.AUDIO;
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.body(new BaseResponse(20004, success.getCode(), messageDesc, responseData));
|
||||
NoCopyCheckResult checkResult = noCopyFileService.checkFile(file, type);
|
||||
log.info("checkResult: {}", checkResult);
|
||||
|
||||
switch (checkResult) {
|
||||
case DocumentCheckResult.Success success -> {
|
||||
FileProtector.FileInfo info = success.getInfo();
|
||||
FileEntity entity = fileEntityRepository.findByFileId(info.getId());
|
||||
if (entity != null) {
|
||||
results.add(fileSimilarityService.buildDTO(entity));
|
||||
}
|
||||
}
|
||||
case AudioCheckResult.Success success -> {
|
||||
FileProtector.FileInfo info = success.getInfo();
|
||||
FileEntity entity = fileEntityRepository.findByFileId(info.getId());
|
||||
if (entity != null) {
|
||||
results.add(fileSimilarityService.buildDTO(entity));
|
||||
}
|
||||
}
|
||||
case DocumentCheckResult.Failed failed ->
|
||||
log.warn("Document check failed: {}", failed.getMessage());
|
||||
case AudioCheckResult.Failed failed ->
|
||||
log.warn("Audio check failed: {}", failed.getMessage());
|
||||
default -> log.warn("Unexpected result type: {}", checkResult.getClass().getSimpleName());
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
private BaseResponse buildSuccessResponse(Page<SimilarFileDTO> page, MessageCode messageCode) {
|
||||
Map<String, Object> responseData = new HashMap<>();
|
||||
responseData.put("content", page.getContent());
|
||||
responseData.put("page", page.getNumber());
|
||||
responseData.put("size", page.getSize());
|
||||
responseData.put("totalElements", page.getTotalElements());
|
||||
responseData.put("totalPages", page.getTotalPages());
|
||||
responseData.put("hasNext", page.hasNext());
|
||||
responseData.put("hasPrevious", page.hasPrevious());
|
||||
|
||||
return new BaseResponse(20004, messageCode.getCode(),
|
||||
messageCode.getDescription(), responseData);
|
||||
}
|
||||
|
||||
private BaseResponse buildSuccessResponse(List<SimilarFileDTO> list, MessageCode messageCode) {
|
||||
Map<String, Object> responseData = new HashMap<>();
|
||||
responseData.put("content", list);
|
||||
responseData.put("totalElements", list.size());
|
||||
|
||||
return new BaseResponse(20004, messageCode.getCode(),
|
||||
messageCode.getDescription(), responseData);
|
||||
}
|
||||
|
||||
@GetMapping("/v{version}/files/progress/{uploadId}")
|
||||
@@ -300,28 +388,52 @@ public class ApiController {
|
||||
@PathVariable(required = false) Integer version,
|
||||
@RequestHeader(value = "Authorization", required = false) String tokenHeader) {
|
||||
try {
|
||||
if (tokenHeader == null) {
|
||||
if (tokenHeader == null || tokenHeader.isBlank()) {
|
||||
Map<String, Object> errorData = new HashMap<>();
|
||||
errorData.put("token", tokenHeader);
|
||||
errorData.put("fileId", fileId);
|
||||
errorData.put("version", version);
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004,
|
||||
MessageCode.FILE_DOWNLOAD_ERROR_NOT_CORRECT_FIELD.getCode(),
|
||||
MessageCode.FILE_DOWNLOAD_ERROR_NOT_CORRECT_FIELD.getDescription(),
|
||||
MessageCode.TOKEN_IS_NULL.getCode(),
|
||||
MessageCode.TOKEN_IS_NULL.getDescription(),
|
||||
errorData));
|
||||
}
|
||||
|
||||
Long userId = authService.useUserAuthToken(tokenHeader);
|
||||
FileEntityResponse entityResponse = fileEntityService.getById(fileId, version);
|
||||
FileStatus status = entityResponse.getStatus();
|
||||
|
||||
if (!entityResponse.getUserId().equals(userId)) {
|
||||
if (status.equals(FileStatus.BLOCKED) || status.equals(FileStatus.DELETED) ||
|
||||
status.equals(FileStatus.REMOVED)) {
|
||||
Map<String, Object> errorData = new HashMap<>();
|
||||
errorData.put("fileId", entityResponse.getId());
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004,
|
||||
MessageCode.FILE_IS_BLOCKED.getCode(),
|
||||
MessageCode.FILE_IS_BLOCKED.getDescription(),
|
||||
errorData));
|
||||
}
|
||||
|
||||
User fileUser = userRepository.findById(entityResponse.getUserId()).orElseThrow();
|
||||
User user = userRepository.findById(userId).orElseThrow();
|
||||
Company companyUser = user.getCompany();
|
||||
|
||||
if (companyUser != null && !fileUser.getCompany().getId().equals(companyUser.getId())) {
|
||||
Map<String, Object> errorData = new HashMap<>();
|
||||
errorData.put("token", tokenHeader);
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004,
|
||||
MessageCode.FILE_DOWNLOAD_ERROR.getCode(),
|
||||
MessageCode.FILE_DOWNLOAD_ERROR.getDescription(),
|
||||
MessageCode.USER_NOT_HAD_PERMISSION.getCode(),
|
||||
MessageCode.USER_NOT_HAD_PERMISSION.getDescription(),
|
||||
errorData));
|
||||
}
|
||||
|
||||
if (companyUser == null && !entityResponse.getUserId().equals(userId)) {
|
||||
Map<String, Object> errorData = new HashMap<>();
|
||||
errorData.put("token", tokenHeader);
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004,
|
||||
MessageCode.USER_NOT_HAD_PERMISSION.getCode(),
|
||||
MessageCode.USER_NOT_HAD_PERMISSION.getDescription(),
|
||||
errorData));
|
||||
}
|
||||
|
||||
@@ -330,8 +442,8 @@ public class ApiController {
|
||||
errorData.put("file_status", entityResponse.getStatus());
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004,
|
||||
MessageCode.FILE_DOWNLOAD_ERROR.getCode(),
|
||||
MessageCode.FILE_DOWNLOAD_ERROR.getDescription(),
|
||||
MessageCode.FILE_DELETE.getCode(),
|
||||
MessageCode.FILE_DELETE.getDescription(),
|
||||
errorData));
|
||||
}
|
||||
|
||||
@@ -340,8 +452,8 @@ public class ApiController {
|
||||
errorData.put("onDisk", entityResponse.isExistsOnDisk());
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004,
|
||||
MessageCode.FILE_DOWNLOAD_ERROR.getCode(),
|
||||
MessageCode.FILE_DOWNLOAD_ERROR.getDescription(),
|
||||
MessageCode.FILE_NOT_EXIST.getCode(),
|
||||
MessageCode.FILE_NOT_EXIST.getDescription(),
|
||||
errorData));
|
||||
}
|
||||
|
||||
@@ -376,7 +488,15 @@ public class ApiController {
|
||||
MessageCode.FILE_NOT_FOUND.getCode(),
|
||||
MessageCode.FILE_NOT_FOUND.getDescription(),
|
||||
errorData));
|
||||
} catch (NotFoundAuthToken | IOException e) {
|
||||
} catch (NotFoundAuthToken e) {
|
||||
Map<String, Object> errorData = new HashMap<>();
|
||||
errorData.put("token", tokenHeader);
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004,
|
||||
MessageCode.AUTH_TOKEN_NOT_FOUND.getCode(),
|
||||
MessageCode.AUTH_TOKEN_NOT_FOUND.getDescription(),
|
||||
errorData));
|
||||
} catch (IOException e) {
|
||||
Map<String, Object> errorData = new HashMap<>();
|
||||
errorData.put("token", tokenHeader);
|
||||
errorData.put("fileId", fileId);
|
||||
@@ -389,45 +509,6 @@ public class ApiController {
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping("/protect/{fileId}")
|
||||
public ResponseEntity<?> protect( @PathVariable(required = false) String fileId) {
|
||||
Optional<FileEntity> optionalFileEntity = fileEntityRepository.findById(fileId);
|
||||
|
||||
if (!optionalFileEntity.isPresent()) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
FileEntity fileEntity = optionalFileEntity.get();
|
||||
FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(fileEntity);
|
||||
|
||||
noCopyFileService.addFile(fileInfo);
|
||||
|
||||
fileEntity.setProtectionStatus(ProtectionStatus.PROCESSING);
|
||||
fileEntityRepository.save(fileEntity);
|
||||
|
||||
return ResponseEntity.ok().build();
|
||||
}
|
||||
|
||||
@GetMapping("/check/{fileId}/{type}")
|
||||
public ResponseEntity<?> check(@PathVariable(required = false) String fileId,
|
||||
@PathVariable(required = false) String type) {
|
||||
Optional<FileEntity> optionalFileEntity = fileEntityRepository.findById(fileId);
|
||||
|
||||
if (!optionalFileEntity.isPresent()) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
FileEntity fileEntity = optionalFileEntity.get();
|
||||
|
||||
Path path = Paths.get(fileEntity.getProtectedFilePath());
|
||||
|
||||
File file = path.toFile();
|
||||
|
||||
NoCopyCheckResult noCopyCheckResult = noCopyFileService.checkFile(file,
|
||||
FileProtector.Type.valueOf(type.toUpperCase()));
|
||||
|
||||
return ResponseEntity.ok().body(noCopyCheckResult);
|
||||
}
|
||||
|
||||
@GetMapping("/check/file_stats")
|
||||
public ResponseEntity<?> checkFileProtectStats(@RequestHeader("Authorization") String tokenHeader) {
|
||||
String token = tokenHeader.replace("Bearer ", "");
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package ru.soune.nocopy.controller;
|
||||
|
||||
import com.vrt.NoCopyFileService;
|
||||
import com.vrt.fileprotection.FileProtector;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.*;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import ru.soune.nocopy.dto.file.CheckStatus;
|
||||
import ru.soune.nocopy.entity.file.FileEntity;
|
||||
@@ -16,10 +16,17 @@ import ru.soune.nocopy.repository.FileEntityRepository;
|
||||
import ru.soune.nocopy.repository.UserRepository;
|
||||
import ru.soune.nocopy.service.file.CheckCounterService;
|
||||
import ru.soune.nocopy.service.file.FileStorageService;
|
||||
import org.springframework.http.ContentDisposition;
|
||||
import ru.soune.nocopy.service.file.ImageResizeService;
|
||||
import ru.soune.nocopy.util.FileUtil;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/files")
|
||||
@@ -38,43 +45,96 @@ public class FileController {
|
||||
@Autowired
|
||||
private UserRepository userRepository;
|
||||
|
||||
@Autowired
|
||||
private ImageResizeService imageResizeService;
|
||||
|
||||
@Autowired
|
||||
private NoCopyFileService noCopyFileService;
|
||||
|
||||
@Autowired
|
||||
private FileUtil fileUtil;
|
||||
|
||||
@GetMapping("/public/{fileId}")
|
||||
public ResponseEntity<Resource> getPublicFile(
|
||||
@PathVariable String fileId) throws IOException {
|
||||
public ResponseEntity<Resource> getPublicFile(@PathVariable String fileId) {
|
||||
try {
|
||||
FileEntity fileEntity = fileRepository.findById(fileId)
|
||||
.orElseThrow(() -> new FileNotFoundException("Not found: " + fileId));
|
||||
|
||||
FileEntity fileEntity = fileRepository.findById(fileId)
|
||||
.orElseThrow(() -> new RuntimeException("File not found"));
|
||||
Path filePath = Paths.get(fileEntity.getFilePath());
|
||||
if (!Files.exists(filePath)) {
|
||||
log.error("Not on disk: {}", fileEntity.getFilePath());
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
Resource resource = fileStorageService.loadFileAsResource(fileEntity.getFilePath());
|
||||
Resource resource = fileStorageService.loadFileAsResource(fileEntity.getFilePath());
|
||||
|
||||
ContentDisposition contentDisposition = ContentDisposition.inline()
|
||||
.filename(fileEntity.getOriginalFileName(), StandardCharsets.UTF_8)
|
||||
.build();
|
||||
MediaType mediaType = getMediaType(fileEntity);
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.contentType(new MediaType(fileEntity.getMimeType(), fileEntity.getFileExtension()))
|
||||
.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString())
|
||||
.body(resource);
|
||||
ContentDisposition contentDisposition = ContentDisposition.inline()
|
||||
.filename(fileEntity.getOriginalFileName(), StandardCharsets.UTF_8)
|
||||
.build();
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.contentType(mediaType)
|
||||
.contentLength(Files.size(filePath))
|
||||
.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString())
|
||||
.header(HttpHeaders.CACHE_CONTROL, "public, max-age=3600")
|
||||
.body(resource);
|
||||
|
||||
} catch (FileNotFoundException e) {
|
||||
log.warn("Not on disk: {}", fileId);
|
||||
return ResponseEntity.notFound().build();
|
||||
} catch (IOException e) {
|
||||
log.error("Read file exception: {}", fileId, e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping("/protected/{fileId}")
|
||||
private MediaType getMediaType(FileEntity fileEntity) {
|
||||
try {
|
||||
return MediaType.parseMediaType(fileEntity.getMimeType());
|
||||
} catch (InvalidMediaTypeException e) {
|
||||
String extension = fileEntity.getFileExtension().toLowerCase();
|
||||
switch (extension) {
|
||||
case "jpg":
|
||||
case "jpeg":
|
||||
return MediaType.IMAGE_JPEG;
|
||||
case "png":
|
||||
return MediaType.IMAGE_PNG;
|
||||
case "pdf":
|
||||
return MediaType.APPLICATION_PDF;
|
||||
default:
|
||||
return MediaType.APPLICATION_OCTET_STREAM;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping("/protected/{fileId}/{type}")
|
||||
public ResponseEntity<Resource> getProtectedFile(
|
||||
@PathVariable String fileId) throws IOException {
|
||||
@PathVariable String fileId, @PathVariable String type) throws IOException {
|
||||
|
||||
FileEntity fileEntity = fileRepository.findById(fileId)
|
||||
.orElseThrow(() -> new RuntimeException("File not found"));
|
||||
|
||||
Resource resource = fileStorageService.loadFileAsResource(fileEntity.getProtectedFilePath());
|
||||
String path = imageResizeService.getPath(fileEntity, type);
|
||||
|
||||
Resource resource = fileStorageService.loadFileAsResource(path);
|
||||
|
||||
if (fileEntity.getProtectionStatus() == ProtectionStatus.NOT_PROTECTED ||
|
||||
fileEntity.getProtectionStatus() == ProtectionStatus.PROCESSING) {
|
||||
throw new RuntimeException("File is not protected");
|
||||
}
|
||||
|
||||
String fileName = fileEntity.getOriginalFileName().replace("." +
|
||||
fileEntity.getFileExtension(), "") + "_nocopy_protected" +
|
||||
"." + fileEntity.getFileExtension();
|
||||
String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8)
|
||||
.replace("+", "%20");
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.contentType(new MediaType(fileEntity.getMimeType(), fileEntity.getFileExtension()))
|
||||
.header(HttpHeaders.CONTENT_DISPOSITION,
|
||||
"inline; filename=\"" + fileEntity.getOriginalFileName() + "\"")
|
||||
"inline; filename*=UTF-8''" + encodedFileName)
|
||||
.body(resource);
|
||||
}
|
||||
|
||||
@@ -94,4 +154,16 @@ public class FileController {
|
||||
.ok()
|
||||
.body(protectedFileCheck);
|
||||
}
|
||||
|
||||
@PostMapping("protect/{fileId}/{convertTo}")
|
||||
public ResponseEntity<FileProtector.FileInfo> convert(@PathVariable String fileId, @PathVariable String convertTo) {
|
||||
FileEntity file = fileRepository.findByFileId(fileId);
|
||||
FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(file, convertTo);
|
||||
|
||||
noCopyFileService.addFile(fileInfo);
|
||||
|
||||
return ResponseEntity
|
||||
.ok()
|
||||
.body(fileInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,173 @@
|
||||
package ru.soune.nocopy.controller;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import ru.soune.nocopy.dto.search.GlobalSearchStartRequest;
|
||||
import ru.soune.nocopy.dto.search.GlobalSearchStartResponse;
|
||||
import ru.soune.nocopy.dto.search.GlobalSearchStatusResponse;
|
||||
import ru.soune.nocopy.dto.violation.FileViolationSummaryDTO;
|
||||
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.register.AuthService;
|
||||
import ru.soune.nocopy.service.search.GlobalSearchService;
|
||||
import ru.soune.nocopy.service.violation.ViolationService;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/global-search")
|
||||
@RequiredArgsConstructor
|
||||
public class GlobalSearchController {
|
||||
|
||||
private final AuthService authService;
|
||||
|
||||
private final GlobalSearchService globalSearchService;
|
||||
|
||||
private final GlobalSearchTaskRepository globalSearchTaskRepository;
|
||||
|
||||
private final GlobalSearchTaskRepository searchTaskRepository;
|
||||
|
||||
private final ViolationService violationService;
|
||||
|
||||
@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));
|
||||
}
|
||||
|
||||
GlobalSearchStartResponse response = new GlobalSearchStartResponse();
|
||||
|
||||
try {
|
||||
Long userId = authService.useUserAuthToken(tokenHeader);
|
||||
|
||||
List<FileEntity> filesToProcess = globalSearchService.getFilesToProcess(request, userId);
|
||||
|
||||
if (filesToProcess.isEmpty()) return ResponseEntity.ok().body("Files for search not found");
|
||||
|
||||
String taskId = globalSearchService.startSearch(request, userId, filesToProcess);
|
||||
|
||||
Optional<GlobalSearchTask> taskOptional = globalSearchTaskRepository.findById(taskId);
|
||||
|
||||
if (taskOptional.isEmpty()) return ResponseEntity.ok().body("Task not found");
|
||||
|
||||
GlobalSearchTask task = taskOptional.orElseThrow();
|
||||
|
||||
response.setTaskId(taskId);
|
||||
response.setStatus(SearchStatus.ACCEPTED.name());
|
||||
response.setTotalFiles(task.getTotalFiles());
|
||||
} 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);
|
||||
}
|
||||
|
||||
@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));
|
||||
}
|
||||
|
||||
Optional<GlobalSearchTask> taskOptional;
|
||||
|
||||
try {
|
||||
Long userId = authService.useUserAuthToken(tokenHeader);
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
List<FileViolationSummaryDTO> fileViolationsSummary;
|
||||
|
||||
try {
|
||||
Long userId = authService.useUserAuthToken(tokenHeader);
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
return ResponseEntity.ok(fileViolationsSummary);
|
||||
}
|
||||
|
||||
@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));
|
||||
}
|
||||
GlobalSearchStatusResponse response;
|
||||
|
||||
try {
|
||||
Long userId = authService.useUserAuthToken(tokenHeader);
|
||||
|
||||
Optional<GlobalSearchTask> taskOptional = searchTaskRepository.findByTaskIdAndUserId(taskId, userId);
|
||||
|
||||
if (taskOptional.isEmpty()) return ResponseEntity.ok().body("Task not found");
|
||||
|
||||
GlobalSearchTask task = taskOptional.orElseThrow();
|
||||
|
||||
int progress = task.getTotalFiles() > 0 ? task.getProcessedFiles() * 100 / task.getTotalFiles() : 0;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
package ru.soune.nocopy.controller;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import ru.soune.nocopy.dto.search.GlobalSearchStartResponse;
|
||||
import ru.soune.nocopy.entity.payment.Payment;
|
||||
import ru.soune.nocopy.exception.PaymentNotFoundException;
|
||||
import ru.soune.nocopy.exception.TariffNotFoundException;
|
||||
import ru.soune.nocopy.exception.UserNotFoundException;
|
||||
import ru.soune.nocopy.service.payment.PaymentService;
|
||||
import ru.soune.nocopy.service.register.AuthService;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/payments")
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class PaymentController {
|
||||
|
||||
private final PaymentService paymentService;
|
||||
|
||||
private final AuthService authService;
|
||||
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<?> createPayment(@RequestParam String email, @RequestParam Long tariffId,
|
||||
@RequestParam String operationType, @RequestParam String operationUuid) {
|
||||
try {
|
||||
Payment payment = paymentService.createPayment(email, tariffId, operationType, operationUuid);
|
||||
|
||||
return ResponseEntity.ok(payment);
|
||||
} catch (TariffNotFoundException e) {
|
||||
return ResponseEntity
|
||||
.status(HttpStatus.NOT_FOUND)
|
||||
.body(Map.of("error", "Tariff not found", "message", e.getMessage()));
|
||||
} catch (UserNotFoundException e) {
|
||||
return ResponseEntity
|
||||
.status(HttpStatus.NOT_FOUND)
|
||||
.body(Map.of("error", "User not found", "message", e.getMessage()));
|
||||
} catch (Exception e) {
|
||||
return ResponseEntity
|
||||
.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body(Map.of("error", "Internal server error", "message", e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping("webhook/yookassa")
|
||||
public void handleYooKassaNotification(@RequestBody Map<String, Object> notification) {
|
||||
try {
|
||||
paymentService.handlePaymentNotification(notification);
|
||||
log.info("Notification from yookassa: " + notification);
|
||||
} catch (PaymentNotFoundException e) {
|
||||
log.error("Error processing payment notification", e);
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping("/auto-renewal")
|
||||
public ResponseEntity<?> disableAutoRenewal(@RequestParam(value = "renewal") Boolean renewal,
|
||||
@RequestHeader(value = "Authorization", required = false) String tokenHeader) {
|
||||
try {
|
||||
if (tokenHeader == null || tokenHeader.isBlank()) {
|
||||
Map<String, Object> errorData = new HashMap<>();
|
||||
errorData.put("token", tokenHeader);
|
||||
|
||||
return ResponseEntity.ok().body(Map.of("error", errorData));
|
||||
}
|
||||
|
||||
paymentService.changeAutoRenewal(authService.useUserAuthToken(tokenHeader), renewal);
|
||||
return ResponseEntity.ok(Map.of("message", "Auto-renewal disabled"));
|
||||
} catch (UserNotFoundException e) {
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND)
|
||||
.body(Map.of("error", e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
@DeleteMapping("/methods/{paymentMethodId}")
|
||||
public ResponseEntity<?> deletePaymentMethod(@RequestHeader(value = "Authorization", required = false) String tokenHeader,
|
||||
@PathVariable String paymentMethodId) {
|
||||
try {
|
||||
if (tokenHeader == null || tokenHeader.isBlank()) {
|
||||
Map<String, Object> errorData = new HashMap<>();
|
||||
errorData.put("token", tokenHeader);
|
||||
|
||||
return ResponseEntity.ok().body(Map.of("error", errorData));
|
||||
}
|
||||
|
||||
paymentService.deletePaymentMethod(authService.useUserAuthToken(tokenHeader), paymentMethodId);
|
||||
return ResponseEntity.ok(Map.of("message", "Payment method deleted"));
|
||||
} catch (UserNotFoundException e) {
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND)
|
||||
.body(Map.of("error", e.getMessage()));
|
||||
} catch (RuntimeException e) {
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
|
||||
.body(Map.of("error", e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping("/methods")
|
||||
public ResponseEntity<?> getPaymentMethods(@RequestHeader(value = "Authorization", required = false) String tokenHeader) {
|
||||
try {
|
||||
if (tokenHeader == null || tokenHeader.isBlank()) {
|
||||
Map<String, Object> errorData = new HashMap<>();
|
||||
errorData.put("token", tokenHeader);
|
||||
|
||||
return ResponseEntity.ok().body(Map.of("error", errorData));
|
||||
}
|
||||
|
||||
return ResponseEntity.ok(paymentService.getUserPaymentMethods(
|
||||
authService.useUserAuthToken(tokenHeader)));
|
||||
} catch (UserNotFoundException e) {
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND)
|
||||
.body(Map.of("error", e.getMessage()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,216 @@
|
||||
package ru.soune.nocopy.controller;
|
||||
|
||||
|
||||
import jakarta.validation.Valid;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import ru.soune.nocopy.dto.payout.*;
|
||||
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 java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/payouts")
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class PayoutController {
|
||||
|
||||
private final PayoutRequestService payoutRequestService;
|
||||
|
||||
private final PayoutMethodService payoutMethodService;
|
||||
|
||||
private final AuthTokenRepository authTokenRepository;
|
||||
|
||||
/*
|
||||
Create payout
|
||||
*/
|
||||
@PostMapping("/create-request")
|
||||
public ResponseEntity<?> createPayoutRequest(@RequestHeader("Authorization") String tokenHeader,
|
||||
@Valid @RequestBody PayoutRequestDTO request) {
|
||||
String token = tokenHeader.replace("Bearer ", "");
|
||||
|
||||
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
|
||||
|
||||
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
|
||||
|
||||
User user = authToken.getUser();
|
||||
|
||||
try {
|
||||
PayoutRequest payoutRequest = payoutRequestService.createPayoutRequest(user.getId(), request);
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(payoutRequest);
|
||||
} catch (InsufficientFundsException | PendingPayoutExistsException | InvalidPayoutMethodException e) {
|
||||
return ResponseEntity.status(HttpStatus.CONFLICT).body(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Completed payout
|
||||
*/
|
||||
@PostMapping("/requests/{requestId}/process")
|
||||
public ResponseEntity<PayoutRequest> processPayoutRequest(@PathVariable Long requestId) {
|
||||
PayoutRequest processed = payoutRequestService.processRequest(requestId);
|
||||
|
||||
return ResponseEntity.ok(processed);
|
||||
}
|
||||
|
||||
/*
|
||||
Cancel payout
|
||||
*/
|
||||
@PostMapping("/requests/{requestId}/cancel")
|
||||
public ResponseEntity<PayoutRequest> cancelPayoutRequest(@PathVariable Long requestId,
|
||||
@RequestHeader("Authorization") String tokenHeader) {
|
||||
String token = tokenHeader.replace("Bearer ", "");
|
||||
|
||||
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
|
||||
|
||||
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
|
||||
|
||||
User user = authToken.getUser();
|
||||
|
||||
PayoutRequest cancelled = payoutRequestService.cancelPayoutRequest(user.getId(), requestId);
|
||||
|
||||
return ResponseEntity.ok(cancelled);
|
||||
}
|
||||
|
||||
/*
|
||||
Get user payouts
|
||||
*/
|
||||
@GetMapping("/requests")
|
||||
public ResponseEntity<List<PayoutRequest>> getUserRequests(@RequestHeader("Authorization") String tokenHeader) {
|
||||
String token = tokenHeader.replace("Bearer ", "");
|
||||
|
||||
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
|
||||
|
||||
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
|
||||
|
||||
User user = authToken.getUser();
|
||||
|
||||
return ResponseEntity.ok(payoutRequestService.getUserPayoutRequests(user.getId()));
|
||||
}
|
||||
|
||||
/*
|
||||
Get payout by id
|
||||
*/
|
||||
@GetMapping("/requests/{requestId}")
|
||||
public ResponseEntity<PayoutRequest> getPayoutRequest(@PathVariable Long requestId,
|
||||
@RequestHeader("Authorization") String tokenHeader) {
|
||||
String token = tokenHeader.replace("Bearer ", "");
|
||||
|
||||
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
|
||||
|
||||
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
|
||||
|
||||
User user = authToken.getUser();
|
||||
|
||||
return ResponseEntity.ok(payoutRequestService.getPayoutRequest(user.getId(), requestId));
|
||||
}
|
||||
|
||||
/*
|
||||
Get payout by id
|
||||
*/
|
||||
@GetMapping("user/payout-methods")
|
||||
public ResponseEntity<List<PayoutMethodDTO>> getUserMethods(@RequestHeader("Authorization") String tokenHeader) {
|
||||
String token = tokenHeader.replace("Bearer ", "");
|
||||
|
||||
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
|
||||
|
||||
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
|
||||
|
||||
User user = authToken.getUser();
|
||||
|
||||
return ResponseEntity.ok(payoutMethodService.getUserMethods(user.getId()));
|
||||
}
|
||||
|
||||
/*
|
||||
Get payout-methods
|
||||
*/
|
||||
@GetMapping("/payout-methods")
|
||||
public ResponseEntity<List<PayoutMethodTypeDTO>> getAvailableMethodTypes() {
|
||||
List<PayoutMethodTypeDTO> types = Arrays.stream(PayoutType.values())
|
||||
.map(type -> PayoutMethodTypeDTO.builder()
|
||||
.code(type.name())
|
||||
.name(type.getDisplayName())
|
||||
.build())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return ResponseEntity.ok(types);
|
||||
}
|
||||
/*
|
||||
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 ", "");
|
||||
|
||||
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
|
||||
|
||||
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
|
||||
|
||||
User user = authToken.getUser();
|
||||
|
||||
CardPayoutMethod method = payoutMethodService.addCardMethod(user.getId(), request);
|
||||
|
||||
return ResponseEntity.status(HttpStatus.CREATED)
|
||||
.body(payoutMethodService.convertToDto(method));
|
||||
}
|
||||
|
||||
/*
|
||||
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 ", "");
|
||||
|
||||
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
|
||||
|
||||
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
|
||||
|
||||
User user = authToken.getUser();
|
||||
|
||||
BankTransferPayoutMethod method = payoutMethodService.addBankTransferMethod(user.getId(), request);
|
||||
|
||||
return ResponseEntity.status(HttpStatus.CREATED)
|
||||
.body(payoutMethodService.convertToDto(method));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
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 ", "");
|
||||
|
||||
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
|
||||
|
||||
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
|
||||
|
||||
User user = authToken.getUser();
|
||||
|
||||
payoutMethodService.setDefaultMethod(user.getId(), methodId);
|
||||
|
||||
return ResponseEntity.ok().build();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package ru.soune.nocopy.controller;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import ru.soune.nocopy.configuration.search.SearchProperties;
|
||||
import ru.soune.nocopy.dto.BaseResponse;
|
||||
import ru.soune.nocopy.dto.search.config.SearchSettingsDto;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/api/search/settings")
|
||||
@RequiredArgsConstructor
|
||||
public class SearchSettingsController {
|
||||
|
||||
private final SearchProperties searchProperties;
|
||||
|
||||
@GetMapping
|
||||
public ResponseEntity<?> getSettings() {
|
||||
SearchSettingsDto dto = new SearchSettingsDto();
|
||||
|
||||
dto.setEngines(Map.of(
|
||||
"yandex", searchProperties.getEngines().get("yandex").isEnabled(),
|
||||
"google", searchProperties.getEngines().get("google").isEnabled()));
|
||||
|
||||
dto.setProxyEnabled(searchProperties.getProxy().isEnabled());
|
||||
|
||||
return ResponseEntity.ok().body(BaseResponse.builder()
|
||||
.messageDesc("Success")
|
||||
.messageBody(dto)
|
||||
.build());
|
||||
}
|
||||
|
||||
@PutMapping
|
||||
public ResponseEntity<?> updateSettings(@RequestBody SearchSettingsDto settings) {
|
||||
if (settings.getEngines() != null) {
|
||||
settings.getEngines().forEach((key, value) -> {
|
||||
if (searchProperties.getEngines().containsKey(key)) {
|
||||
searchProperties.getEngines().get(key).setEnabled(value);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (settings.getProxyEnabled() != null) {
|
||||
searchProperties.getProxy().setEnabled(settings.getProxyEnabled());
|
||||
}
|
||||
|
||||
log.info("Settings updated: {}", settings);
|
||||
|
||||
return ResponseEntity.ok().body(BaseResponse.builder()
|
||||
.messageDesc("Settings updated")
|
||||
.build());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user