209 похожих чатов

Всем привет. Сразу извиняюсь потому что я не профессионал, обращаюсь

к вам и надеюсь что поможете с находкой правильного решения поставленной задачей потому что я не уверен в моём подходе.

Стоит такая задача - Воплотить возможность скачивать все бэкап файлы в .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);
}
}

Можете пожалуйста подсказать, правильный ли подход? Можно ли его улучшить, если нет, как правильно воплотить такой функионал? Заранее огромное спасибо!

1 ответов

67 просмотров

Что конкретно ты хочешь улучшить? Если оно работает и не вызывает проблем, то я бы не трогал

Похожие вопросы

Обсуждают сегодня

Карта сайта