mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-05 18:53:38 +00:00
52 lines
1.8 KiB
TypeScript
52 lines
1.8 KiB
TypeScript
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);
|
|
}
|
|
}
|