Files
documenso/apps/remix/app/routes/api+/branding.logo.team.$teamId.ts
T
2026-04-14 21:18:17 +10:00

84 lines
1.9 KiB
TypeScript

import { getTeamSettings } from '@documenso/lib/server-only/team/get-team-settings';
import { sha256 } from '@documenso/lib/universal/crypto';
import { getFileServerSide } from '@documenso/lib/universal/upload/get-file.server';
import { loadLogo } from '@documenso/lib/utils/images/logo';
import type { Route } from './+types/branding.logo.team.$teamId';
const CACHE_CONTROL = 'public, max-age=0, stale-while-revalidate=86400';
export async function loader({ params, request }: Route.LoaderArgs) {
const teamId = Number(params.teamId);
if (teamId === 0 || Number.isNaN(teamId)) {
return Response.json(
{
status: 'error',
message: 'Invalid team ID',
},
{ status: 400 },
);
}
const settings = await getTeamSettings({
teamId,
});
if (!settings || !settings.brandingLogo) {
return Response.json(
{
status: 'error',
message: 'Logo not found',
},
{ status: 404 },
);
}
if (!settings.brandingEnabled) {
return Response.json(
{
status: 'error',
message: 'Branding is not enabled',
},
{ status: 400 },
);
}
const etag = `"${Buffer.from(sha256(settings.brandingLogo)).toString('hex')}"`;
if (request.headers.get('If-None-Match') === etag) {
return new Response(null, {
status: 304,
headers: {
ETag: etag,
'Cache-Control': CACHE_CONTROL,
},
});
}
const file = await getFileServerSide(JSON.parse(settings.brandingLogo)).catch((e) => {
console.error(e);
});
if (!file) {
return Response.json(
{
status: 'error',
message: 'Not found',
},
{ status: 404 },
);
}
const { content, contentType } = await loadLogo(file);
return new Response(content, {
headers: {
'Content-Type': contentType,
'Content-Length': content.length.toString(),
'Cache-Control': CACHE_CONTROL,
ETag: etag,
},
});
}