web-service/apps/freeblox-web-service/src/services/assets/assets.controller.ts

62 lines
1.6 KiB
TypeScript

import {
Controller,
UseInterceptors,
ClassSerializerInterceptor,
Inject,
Get,
Param,
ParseUUIDPipe,
Res,
} from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';
import { ApiTags, ApiOperation } from '@nestjs/swagger';
import { User } from '../../decorators/user.decorator';
import { UserInfo } from '@freeblox/shared';
import { lastValueFrom } from 'rxjs';
import type { Response } from 'express';
import { HttpService } from '@nestjs/axios';
@Controller({
version: '1',
path: 'assets',
})
@ApiTags('Assets')
@UseInterceptors(ClassSerializerInterceptor)
export class AssetsController {
constructor(
@Inject('assets') private assets: ClientProxy,
private http: HttpService,
) {}
@Get(':assetId')
@ApiOperation({ summary: 'Get asset info' })
async getAsset(
@Param('assetId', new ParseUUIDPipe()) assetId: string,
@User() user?: UserInfo,
) {
return this.assets.send('assets.info.byId', { id: assetId, user });
}
@Get(':assetId/download')
@ApiOperation({ summary: 'Download asset' })
async downloadAsset(
@Param('assetId', new ParseUUIDPipe()) assetId: string,
@Res() res: Response,
@User() user?: UserInfo,
) {
const download = await lastValueFrom(
this.assets.send('assets.download.byId', { id: assetId, user }),
);
const { data } = await lastValueFrom(
this.http.get(download.url, { responseType: 'stream' }),
);
res.set({
'Content-Type': download.mimetype,
'Content-Disposition': `attachment; filename="${download.filename}"`,
});
data.pipe(res);
}
}