all repos — red-anatomia @ main

red-anatomia

src/knowledge/arquitetura.ts (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
import type { Detection, Observations } from '../core/types.js';

export function inferirArquitetura(deteccoes: Detection[], obs: Observations): string[] {
  const tem = (nome: string) => deteccoes.some((d) => d.nome === nome);
  const temCategoria = (cat: string) => deteccoes.some((d) => d.categorias.includes(cat));
  const reais = deteccoes.filter((d) => d.evidencias.some((e) => e.fonte !== 'heuristica'));
  const cadeia: string[] = ['Navegador'];
  const nomesUsados = new Set<string>();

  const cdn = reais.find((d) => d.categorias.includes('CDN'));
  if (cdn) {
    cadeia.push(cdn.nome);
    nomesUsados.add(cdn.nome);
  } else if (obs.cdnAparente) {
    cadeia.push(obs.cdnAparente);
    nomesUsados.add(obs.cdnAparente);
  }

  const serverless = reais.find((d) => d.categorias.includes('PaaS'));
  const servidor = reais.find((d) => d.categorias.includes('Web servers'));

  if (servidor && !serverless) cadeia.push(`servidor web (${servidor.nome})`);
  else if (serverless && !nomesUsados.has(serverless.nome)) {
    cadeia.push(`plataforma serverless (${serverless.nome})`);
  } else if (obs.servidorAparente && !cdn) cadeia.push(`servidor (${obs.servidorAparente})`);

  const app =
    reais.find((d) => d.categorias.includes('CMS')) ??
    reais.find((d) => d.categorias.includes('Ecommerce')) ??
    reais.find((d) => d.categorias.includes('Web frameworks'));
  if (app) cadeia.push(app.nome);

  if (temCategoria('Databases') || tem('MySQL')) cadeia.push('banco de dados');

  if (cadeia.length <= 2 && temCategoria('JavaScript frameworks')) {
    const fw = deteccoes.find((d) => d.categorias.includes('JavaScript frameworks'));
    if (fw) cadeia.push(`aplicação de página única (${fw.nome})`);
  }

  return cadeia;
}