// SPDX-FileCopyrightText: 2024 John Livingston // // SPDX-License-Identifier: AGPL-3.0-only import type { RegisterServerOptions } from '@peertube/peertube-types'; import type { Router, Request, Response, NextFunction } from 'express'; import { asyncMiddleware } from '../middlewares/async'; import { Emojis } from '../emojis'; export async function initEmojisRouter( options: RegisterServerOptions, router: Router ): Promise { const logger = options.peertubeHelpers.logger; router.get( '/emojis/channel/:channelId/definition', asyncMiddleware( async ( req: Request, res: Response, _next: NextFunction ): Promise => { try { const emojis = Emojis.singletonSafe(); if (!emojis) { res.sendStatus(404); return; } const channelId = parseInt(req.params.channelId); if (!channelId || isNaN(channelId)) { res.sendStatus(400); return; } if (!(await emojis.channelHasCustomEmojis(channelId))) { res.sendStatus(404); return; } res.sendFile(emojis.channelCustomEmojisDefinitionPath(channelId)); } catch (err) { logger.error(err); res.sendStatus(500); } } ) ); // Note: CORS is handled by Peertube. router.get( '/emojis/channel/:channelId/files/:fileName', asyncMiddleware( async ( req: Request, res: Response, _next: NextFunction ): Promise => { try { const emojis = Emojis.singletonSafe(); if (!emojis) { res.sendStatus(404); return; } const channelId = parseInt(req.params.channelId); if (!channelId || isNaN(channelId)) { res.sendStatus(400); return; } const fileName = req.params.fileName; if (!emojis.validImageFileName(fileName)) { res.sendStatus(400); return; } if (!(await emojis.channelHasCustomEmojis(channelId))) { res.sendStatus(404); return; } res.sendFile( emojis.channelCustomEmojisFilePath(channelId, fileName), { immutable: true, maxAge: 1000 * 60 * 60 * 24, // 24h }, (err) => { if (err) { res.sendStatus(404); } } ); } catch (err) { logger.error(err); res.sendStatus(500); } } ) ); }