@Override
public Mono<Context> execute(Context context) {
log.info(LoggingCodes.BUSINESS_INFO,
"Шаг: Процесс получения инфо для файла - {}{} с хешем {}",
context.getFullFileName(),
context.getFilePathName(),
context.getFileData().getHash());
// Пропускаем, если уже на нужном шаге
if (context.getFilePathName().equals(FILE_AWAITING_UPLOAD_TOKEN)) {
warnLogExpectedStatus(log, context, FILE_AWAITING_UPLOAD_TOKEN, getClassName());
return Mono.just(context);
}
// Получаем ID файла и продолжаем
return fetchFileId(context)
.doOnSuccess(ctx -> log.debug("File ID assigned: {}", ctx.getFileData().getFileId()))
.onErrorResume(e -> {
log.warn("Could not fetch file ID, continuing without it", e);
return Mono.just(context);
});
}
/**
* Получает ID файла из SZOF.
* Если файл не найден - возвращает context без изменений.
*/
private Mono<Context> fetchFileId(Context context) {
boolean isUploadToSubFolder = context.getFolderId() != null;
return (isUploadToSubFolder
? fetchFileIdFromSubFolder(context)
: fetchFileIdFromRootFolder(context))
.flatMap(response -> assignFileId(context, response.getFiles()))
.defaultIfEmpty(context);
}
/**
* Получает список файлов из подпапки.
*/
private Mono<FlashResponse> fetchFileIdFromSubFolder(Context context) {
return szofWebService.getFilesInSubFolderSzofWithFilter(
context.getFolderId(),
context.getFullFileName()
);
}
/**
* Получает список файлов из корневой папки.
*/
private Mono<FlashResponse> fetchFileIdFromRootFolder(Context context) {
return szofWebService.getFilesInFolderSzoFWithFilterParam(
context.getFullFileName()
);
}
/**
* Находит файл по имени и проставляет его ID в контекст.
*/
private Mono<Context> assignFileId(Context context, List<ObjectDto> files) {
if (files == null || files.isEmpty()) {
log.debug("No files found for name: {}", context.getFullFileName());
return Mono.just(context);
}
files.stream()
.filter(file -> file.getName().equals(context.getFullFileName()))
.findFirst()
.ifPresent(file -> {
context.getFileData().setFileId(file.getId());
log.debug("Assigned file ID {} to file {}", file.getId(), file.getName());
});
return Mono.just(context);
}