import { Public } from "@edr/api-common"; import { Controller, Get, Header, Param, ParseUUIDPipe, Query, Res } from "@nestjs/common"; import { Response } from "express"; import { ApiOperation, ApiQuery, ApiTags } from "@nestjs/swagger"; import { PublicationsService } from "./publications.service"; /** * The portal's /publications page — a public library of PDFs, Markdown * write-ups and PowerPoint decks about the platform. No login required, same * as /help, /faq and the legal pages: prospects reach it before any account * exists. */ @ApiTags("publications") @Public() @Controller("publications") export class PublicPublicationsController { constructor(private readonly service: PublicationsService) {} @Get() // Cheap to serve stale for a few minutes; every anonymous page view hits it. @Header("Cache-Control", "public, max-age=300") @ApiOperation({ summary: "List published publications for the public library" }) list() { return this.service.listPublic(); } @Get(":id/file") @ApiQuery({ name: "download", required: false, description: "Set to 1/true to force a download instead of inline preview.", }) @ApiOperation({ summary: "Stream a published publication's file" }) async getFile( @Param("id", ParseUUIDPipe) id: string, @Query("download") download: string | undefined, @Res() res: Response, ) { const { stream, record } = await this.service.getPublishedFileStream(id); const forceDownload = download === "1" || download === "true"; res.setHeader("Content-Type", record.fileMimeType); res.setHeader( "Content-Disposition", `${forceDownload ? "attachment" : "inline"}; filename="${record.fileName}"`, ); res.setHeader("Cache-Control", "public, max-age=300"); stream.pipe(res); } }