ledgerone_backend/src/exports/exports.controller.ts

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);
}
}