62 lines
1.6 KiB
TypeScript
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);
|
|
}
|
|
}
|