import { Controller, Get, Param, Post, Query, Req, Res, UseGuards } from "@nestjs/common"; import { Request, Response } from "express"; import { ok } from "../common/response"; import { ExportsService } from "./exports.service"; import { CurrentUser } from "../common/decorators/current-user.decorator"; import { requestContextFrom } from "../abuse/abuse.types"; import { RequiredPlan, SubscriptionGuard } from "../stripe/subscription.guard"; import { Public } from "../common/decorators/public.decorator"; @Controller("exports") @RequiredPlan("pro") @UseGuards(SubscriptionGuard) export class ExportsController { constructor(private readonly exportsService: ExportsService) {} @Get("csv") async exportCsv(@CurrentUser() userId: string, @Query() query: Record, @Req() req: Request) { const data = await this.exportsService.createSignedDownloadUrl(userId, "csv", query, requestContextFrom(req)); return ok(data); } @Get("json") async exportJson(@CurrentUser() userId: string, @Query() query: Record, @Req() req: Request) { const data = await this.exportsService.createSignedDownloadUrl(userId, "json", query, requestContextFrom(req)); return ok(data); } @Get("xlsx") async exportXlsx(@CurrentUser() userId: string, @Query() query: Record, @Req() req: Request) { const data = await this.exportsService.createSignedDownloadUrl(userId, "xlsx", query, requestContextFrom(req)); return ok(data); } @Get("pdf") async exportPdf(@CurrentUser() userId: string, @Query() query: Record, @Req() req: Request) { const data = await this.exportsService.createSignedDownloadUrl(userId, "pdf", query, requestContextFrom(req)); return ok(data); } @Public() @Get("download/:token") async downloadSignedExport(@Param("token") token: string, @Req() req: Request, @Res() res: Response) { const file = await this.exportsService.consumeSignedDownloadUrl(token, requestContextFrom(req)); res.setHeader("Content-Type", file.mimeType); res.setHeader("Content-Disposition", `attachment; filename="${file.fileName.replace(/"/g, "")}"`); res.setHeader("Cache-Control", "no-store"); res.send(file.content); } @Post("sheets") async exportSheets(@CurrentUser() userId: string, @Query() query: Record, @Req() req: Request) { const data = await this.exportsService.exportSheets(userId, query, requestContextFrom(req)); return ok(data); } }