к вам и надеюсь что поможете с находкой правильного решения поставленной задачей потому что я не уверен в моём подходе.
Стоит такая задача - Воплотить возможность скачивать все бэкап файлы в .zip формате с помощью выполнения скрипта на удаленном сервере.
По скрипту - обычный скрипт который в stdout возвращает .zip файл, в нём уже находятся все файлы для определенного бэкапа.
Сама команда выглядит примерно так:
restore.py --id south1-a-10 --time 1693170301 --path serverpro-us/www --pxar wpn10.pxar.didx --dst stdout dl
Как на данный момент я думаю о выполнении решения
- Создать метод в микросервисе который будет выполнять этот скрипт с помощью promisify(execFile)('restore.py', [...]), так весь микросервис построен на данный момент и все работает вроде стабильно
Потом с помощью ReadableBufferStream из пакета stream-buffers, поставить ответ из stdout, примерно вот таким образом
const bufferStream = new ReadableStreamBuffer();
bufferStream.put(stdout);
bufferStream.stop();
return bufferStream;
И уже в главном сервисе возвращать его так -
async exportAllAsZip(exportAllAsZipDTO: ExportAllAsZipRequestDTO): Promise<ReadableStreamBuffer> {
return await lastValueFrom(
this.backupClient.send('export-all-as-zip', exportAllAsZipDTO)
).catch((error) => {
throw new HttpException('Something went wrong', error.status);
});
}
и так в контроллере
@ApiBearerAuth('JWT-auth')
@ResourceAuthGuard(ResourceTypeEnum.site, GuardResourceTypeEnum.update)
@Post('export-all-as-zip/:externalId')
@Header('Content-Type', 'application/zip')
@Header('Content-Disposition', 'attachment; filename=backup.zip')
async exportAllAsZip(
@Body() exportAllAsZipDTO: ExportAllAsZipRequestDTO,
@Param('externalId') externalId: string,
@InjectItems() allowedIds: string[] | undefined
): Promise<ReadableStreamBuffer> {
if (allowedIds && !allowedIds.includes(externalId?.toLowerCase()))
throw new ForbiddenException('You have no access to this site');
try {
return this.backupService.exportAllAsZip(exportAllAsZipDTO);
} catch (error) {
throw new BadRequestException(error.message);
}
}
Можете пожалуйста подсказать, правильный ли подход? Можно ли его улучшить, если нет, как правильно воплотить такой функионал? Заранее огромное спасибо!
Что конкретно ты хочешь улучшить? Если оно работает и не вызывает проблем, то я бы не трогал
Обсуждают сегодня