Cases da SEV Moda Íntima e da Lavação 047; case no formato cliente, problema, entrega, mídia e contato, com detalhes técnicos recolhidos; sem GitHub, ressalvas e fontes de commit. /cases separa clientes e Laboratório. Serviços mostram o case de cliente certo e o bloco de investimento e prazo só aparece preenchido. Metadata social própria por página, not-found com noindex, sitemap com /ia.
24 lines
702 B
TypeScript
24 lines
702 B
TypeScript
import { existsSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import {
|
|
type Device,
|
|
getShowcaseAssets,
|
|
type ShowcaseAssets,
|
|
} from "@/lib/project-showcase";
|
|
|
|
const idPattern = /^[a-z0-9-]+$/;
|
|
|
|
/**
|
|
* Pôster e vídeo gravados em public/videos/<id>/, ou `undefined` quando o projeto não tem captura.
|
|
* Roda no servidor (na geração das páginas): olha se o pôster existe no disco.
|
|
*/
|
|
export function getCaseMedia(
|
|
id: string,
|
|
device: Device,
|
|
): ShowcaseAssets | undefined {
|
|
if (!idPattern.test(id)) return undefined;
|
|
const assets = getShowcaseAssets(id, device);
|
|
const file = join(process.cwd(), "public", assets.poster);
|
|
return existsSync(file) ? assets : undefined;
|
|
}
|