feat(logo): migrar token Logo.dev para runtime server-side

NEXT_PUBLIC_LOGO_DEV_TOKEN renomeado para LOGO_DEV_TOKEN — lido apenas
em runtime no servidor. URL construída nos endpoints /api/logo/mapping e
/api/logo/search; cliente nunca recebe o token. Novo server.ts com
isLogoDevEnabled() e buildLogoDevUrl(). LogoDevProvider (Context) propaga
flag `enabled` para Client Components. Build arg removido do Dockerfile
e do workflow docker-publish.yml.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Felipe Coutinho
2026-04-20 17:52:24 +00:00
parent 6d81ff8b53
commit e005add233
12 changed files with 147 additions and 91 deletions

View File

@@ -1,14 +1,5 @@
/**
* Logo utilities
*
* Consolidated from:
* - /lib/logo.ts (utility functions)
*/
/**
* Normalizes logo path to get just the filename
* @param logo - Logo path or URL
* @returns Filename only
*/
export const normalizeLogo = (logo?: string | null) =>
logo?.split("/").filter(Boolean).pop() ?? "";
@@ -45,13 +36,11 @@ export const deriveNameFromLogo = (logo?: string | null) => {
export const toNameKey = (name: string): string => name.trim().toLowerCase();
// === Logo.dev ===
export const LOGO_DEV_TOKEN = process.env.NEXT_PUBLIC_LOGO_DEV_TOKEN;
export function buildLogoDevUrl(domain?: string | null): string | null {
if (!LOGO_DEV_TOKEN || !domain) return null;
return `https://img.logo.dev/${domain}?token=${LOGO_DEV_TOKEN}&size=64&format=png`;
}
//
// A construção de URLs e a leitura do token acontecem server-side em
// `./server.ts`. O cliente consome `logoUrl` pré-construída a partir das
// API routes (`/api/logo/mapping` e `/api/logo/search`) e usa o
// `LogoDevProvider` para saber se a integração está habilitada.
export const logoQueryKeys = {
mapping: (nameKey: string) => ["logo-mapping", nameKey] as const,

View File

@@ -0,0 +1,30 @@
/**
* Helpers server-only para Logo.dev.
*
* IMPORTANTE: este módulo lê `process.env.LOGO_DEV_TOKEN`, que não existe
* no bundle do cliente. Nunca importe este arquivo de Client Components
* — use o `LogoDevProvider` para propagar o estado `enabled` e consuma
* `logoUrl` a partir das respostas das API routes.
*/
function getLogoDevToken(): string | undefined {
const token = process.env.LOGO_DEV_TOKEN;
return token && token.length > 0 ? token : undefined;
}
/**
* Indica se a integração Logo.dev está configurada.
* Usado para habilitar o picker e a exibição de logos na UI.
*/
export function isLogoDevEnabled(): boolean {
return getLogoDevToken() !== undefined;
}
/**
* Constrói a URL final da imagem Logo.dev com o token aplicado server-side.
* Retorna null se o token não estiver configurado ou se o domínio for vazio.
*/
export function buildLogoDevUrl(domain?: string | null): string | null {
const token = getLogoDevToken();
if (!token || !domain) return null;
return `https://img.logo.dev/${domain}?token=${token}&size=64&format=png`;
}