This commit is contained in:
@@ -8,15 +8,22 @@ import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.validation.BindingResult;
|
||||
import org.springframework.validation.FieldError;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import ru.soune.nocopy.dto.BaseRequest;
|
||||
import ru.soune.nocopy.dto.BaseResponse;
|
||||
import ru.soune.nocopy.dto.MessageCode;
|
||||
import ru.soune.nocopy.dto.RegAnswer;
|
||||
import ru.soune.nocopy.dto.file.ChunkUploadResponse;
|
||||
import ru.soune.nocopy.dto.file.CompleteUploadResponse;
|
||||
import ru.soune.nocopy.dto.file.UploadProgress;
|
||||
import ru.soune.nocopy.entity.file.UploadStatus;
|
||||
import ru.soune.nocopy.exception.NotValidFieldException;
|
||||
import ru.soune.nocopy.exception.ValidationException;
|
||||
import ru.soune.nocopy.handler.FileUploadHandler;
|
||||
import ru.soune.nocopy.handler.LoginRequestHandler;
|
||||
import ru.soune.nocopy.handler.RegRequestHandler;
|
||||
import ru.soune.nocopy.handler.RequestHandler;
|
||||
import ru.soune.nocopy.service.file.FileUploadService;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -29,6 +36,7 @@ import java.util.stream.Collectors;
|
||||
@RequiredArgsConstructor
|
||||
public class ApiController {
|
||||
private final ApplicationContext applicationContext;
|
||||
private final FileUploadService fileUploadService;
|
||||
|
||||
private Map<Integer, RequestHandler> handlers = new HashMap<>();
|
||||
|
||||
@@ -36,7 +44,9 @@ public class ApiController {
|
||||
public void init() {
|
||||
RegRequestHandler regHandler = applicationContext.getBean(RegRequestHandler.class);
|
||||
LoginRequestHandler loginHandler = applicationContext.getBean(LoginRequestHandler.class);
|
||||
FileUploadHandler fileUploadHandler = applicationContext.getBean(FileUploadHandler.class);
|
||||
|
||||
handlers.put(20004, fileUploadHandler);
|
||||
handlers.put(20002, regHandler);
|
||||
handlers.put(20001, loginHandler);
|
||||
}
|
||||
@@ -76,6 +86,155 @@ public class ApiController {
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping("/v{version}/files/chunk")
|
||||
public ResponseEntity<BaseResponse> uploadChunk(
|
||||
@PathVariable("version") int version,
|
||||
@RequestParam("upload_id") String uploadId,
|
||||
@RequestParam("chunk_number") Integer chunkNumber,
|
||||
@RequestParam("chunk") MultipartFile chunk) {
|
||||
|
||||
log.info("Uploading chunk {} for session {}, file size: {} bytes, version: {}",
|
||||
chunkNumber, uploadId, chunk.getSize(), version);
|
||||
|
||||
if (chunk.isEmpty()) {
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004, MessageCode.FILE_UPLOAD_ERROR.getCode(),
|
||||
"Chunk file is empty", null));
|
||||
}
|
||||
|
||||
if (uploadId == null || uploadId.isBlank()) {
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004, MessageCode.FILE_UPLOAD_ERROR.getCode(),
|
||||
"Upload ID is required", null));
|
||||
}
|
||||
|
||||
if (chunkNumber == null || chunkNumber < 0) {
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004, MessageCode.FILE_UPLOAD_ERROR.getCode(),
|
||||
"Valid chunk number is required", null));
|
||||
}
|
||||
|
||||
try {
|
||||
fileUploadService.uploadChunk(uploadId, chunkNumber, chunk);
|
||||
|
||||
ChunkUploadResponse responseBody = ChunkUploadResponse.builder()
|
||||
.uploadId(uploadId)
|
||||
.chunkNumber(chunkNumber)
|
||||
.chunkSize(chunk.getSize())
|
||||
.message("Chunk uploaded successfully")
|
||||
.build();
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004, MessageCode.SUCCESS.getCode(),
|
||||
"Chunk uploaded successfully", responseBody));
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("Error uploading chunk", e);
|
||||
|
||||
ChunkUploadResponse responseBody = ChunkUploadResponse.builder()
|
||||
.uploadId(uploadId)
|
||||
.chunkNumber(chunkNumber)
|
||||
.build();
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(
|
||||
20004, MessageCode.FILE_UPLOAD_ERROR.getCode(),
|
||||
"Failed to upload chunk: " + e.getMessage(), responseBody));
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping("/v{version}/files/progress/{uploadId}")
|
||||
public ResponseEntity<BaseResponse> getUploadProgress(
|
||||
@PathVariable("version") int version,
|
||||
@PathVariable String uploadId) {
|
||||
|
||||
log.info("Getting progress for upload session: {}, version: {}", uploadId, version);
|
||||
|
||||
try {
|
||||
var progress = fileUploadService.getUploadProgress(uploadId);
|
||||
|
||||
UploadProgress responseBody = UploadProgress.builder()
|
||||
.uploadId(progress.getUploadId())
|
||||
.fileName(progress.getFileName())
|
||||
.totalChunks(progress.getTotalChunks())
|
||||
.uploadedChunks(progress.getUploadedChunks())
|
||||
.status(progress.getStatus().toString())
|
||||
.progressPercentage(progress.getProgressPercentage())
|
||||
.filePath(progress.getFilePath())
|
||||
.remainingChunks(progress.getTotalChunks() - progress.getUploadedChunks())
|
||||
.build();
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(
|
||||
20004, MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(), responseBody));
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("Error getting progress for upload: {}", uploadId, e);
|
||||
|
||||
UploadProgress responseBody = UploadProgress.builder()
|
||||
.uploadId(uploadId)
|
||||
.build();
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(
|
||||
20004, MessageCode.FILE_UPLOAD_ERROR.getCode(),
|
||||
"Failed to get upload progress: " + e.getMessage(), responseBody));
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping("/v{version}/files/{uploadId}/complete")
|
||||
public ResponseEntity<BaseResponse> completeUpload(
|
||||
@PathVariable("version") int version,
|
||||
@PathVariable String uploadId) {
|
||||
|
||||
log.info("Completing upload session: {}, version: {}", uploadId, version);
|
||||
|
||||
try {
|
||||
var progress = fileUploadService.getUploadProgress(uploadId);
|
||||
|
||||
if (progress.getStatus() == UploadStatus.COMPLETED) {
|
||||
CompleteUploadResponse responseBody = CompleteUploadResponse.builder()
|
||||
.uploadId(progress.getUploadId())
|
||||
.status(progress.getStatus().toString())
|
||||
.uploadedChunks(progress.getUploadedChunks())
|
||||
.totalChunks(progress.getTotalChunks())
|
||||
.message("Upload already completed")
|
||||
.filePath(progress.getFilePath())
|
||||
.build();
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004, MessageCode.SUCCESS.getCode(),
|
||||
"Upload already completed", responseBody));
|
||||
}
|
||||
|
||||
if (progress.getUploadedChunks() < progress.getTotalChunks()) {
|
||||
CompleteUploadResponse responseBody = CompleteUploadResponse.builder()
|
||||
.uploadId(progress.getUploadId())
|
||||
.status(progress.getStatus().toString())
|
||||
.uploadedChunks(progress.getUploadedChunks())
|
||||
.totalChunks(progress.getTotalChunks())
|
||||
.message("Not all chunks uploaded")
|
||||
.build();
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004, MessageCode.INCOMPLETE_UPLOAD.getCode(),
|
||||
"Not all chunks uploaded", responseBody));
|
||||
}
|
||||
|
||||
CompleteUploadResponse responseBody = CompleteUploadResponse.builder()
|
||||
.uploadId(progress.getUploadId())
|
||||
.status(progress.getStatus().toString())
|
||||
.uploadedChunks(progress.getUploadedChunks())
|
||||
.totalChunks(progress.getTotalChunks())
|
||||
.message("File assembly in progress")
|
||||
.build();
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004, MessageCode.SUCCESS.getCode(),
|
||||
"File assembly in progress", responseBody));
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("Error completing upload: {}", uploadId, e);
|
||||
|
||||
CompleteUploadResponse responseBody = CompleteUploadResponse.builder()
|
||||
.uploadId(uploadId)
|
||||
.build();
|
||||
|
||||
return ResponseEntity.ok().body(new BaseResponse(20004, MessageCode.FILE_UPLOAD_ERROR.getCode(),
|
||||
"Failed to complete upload: " + e.getMessage(), responseBody));
|
||||
}
|
||||
}
|
||||
|
||||
private ResponseEntity<BaseResponse> createValidationErrorResponse(BindingResult bindingResult, Integer msgId) {
|
||||
List<Map<String, String>> fieldErrors = bindingResult.getFieldErrors()
|
||||
.stream()
|
||||
|
||||
Reference in New Issue
Block a user