56 lines
2.4 KiB
TypeScript
56 lines
2.4 KiB
TypeScript
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<string, string>, @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<string, string>, @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<string, string>, @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<string, string>, @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<string, string>, @Req() req: Request) {
|
|
const data = await this.exportsService.exportSheets(userId, query, requestContextFrom(req));
|
|
return ok(data);
|
|
}
|
|
}
|