Fastify com Postgres 18 na API, HTML, CSS e JavaScript sem framework no front, e o
mesmo processo servindo as duas coisas na mesma origem — o que elimina CORS do sistema
inteiro. Sessão em
cookie httpOnly com o estado no servidor, senha em bcrypt, e nada de credencial
em armazenamento do navegador, onde qualquer script da página alcança.
O banco nem sempre foi próprio. O sistema rodava sobre um banco de terceiro, com
automações fora, e o código guardava identificadores opacos daquele serviço no lugar dos
nomes das tabelas. Trazer para um Postgres local trocou os identificadores por nomes
reais, e a diferença aparece no erro: tabela que não existe agora falha dizendo o
nome, em vez de devolver um “não encontrado” silencioso que parecia lista vazia.
A migração deixou uma marca visível, e ela fica. O front tem cerca de duzentos
usos da chave primária no formato do serviço antigo, com maiúscula. O Postgres, deixado
à vontade, dobraria o nome para minúsculo e quebraria os duzentos. A chave nasceu entre
aspas, com um comentário no arquivo do esquema dizendo por quê. Consertar direito
seria reescrever as duzentas chamadas para ganhar zero para quem usa o sistema — dívida
que se anota e se deixa viva vale mais que refatoração que ninguém pediu.