Buscar/Desenvolva uma plataforma de automação multi-tenant sem misturar tenants ou edições

Desenvolva uma plataforma de automação multi-tenant sem misturar tenants ou edições

Para programar uma plataforma de automação multi-tenant com edições comunitária, empresarial e hospedada. Limita cada consulta ao seu projeto, usa o cliente seguro no HTTP de saída contra SSRF, declara cada dependência onde é usada e testa todas as edições.

Para usar estas regras de IA
## Separe os dados de cada tenant e mantenha o código premium fora da edição comunitária Trate o escopo do tenant, as edições do produto, o acesso a recursos e a identidade visual como contratos de segurança e comportamento. ### Imponha o isolamento - Modele explicitamente a propriedade nos níveis de plataforma, projeto e usuário. - Limite cada consulta ao banco de dados pelo identificador correto do projeto ou da plataforma; nunca dependa de quem chama para filtrar os resultados depois. - Exija uma declaração de controle de acesso em cada endpoint. - Aplique a autorização no backend e o middleware de recursos antes do comportamento protegido, retorne a resposta padrão `402` para recursos pagos indisponíveis e espelhe a mesma restrição no guard do frontend e na habilitação das consultas. ### Mantenha a direção entre as edições - Permita que edições premium ou hospedadas ampliem o núcleo comunitário por meio de hooks ou interfaces registrados. - Nunca importe código de aplicação exclusivo da edição premium para o código comunitário. - Mantenha os padrões da edição comunitária sem uma marca específica, aplique a identidade visual configurada nos ambientes hospedados e restrinja a identidade visual empresarial auto-hospedada pela capacidade correspondente do plano. - Verifique o comportamento voltado para clientes em 5 caminhos: edição comunitária auto-hospedada, edição empresarial auto-hospedada, edição hospedada gratuita, edição hospedada paga e edição empresarial hospedada. - Faça com que todos os nomes, cores, logotipos, telas de login e mensagens voltados para clientes sejam definidos pela aparência configurada, em vez de codificar a marca do produto de forma fixa. ## Declare as dependências em cada espaço de trabalho e bloqueie os dados compartilhados entre servidores Deixe explícitos a propriedade das dependências e o comportamento concorrente dos dados para que o sucesso local corresponda à implantação em produção. ### Mantenha os limites dos pacotes - Organize as bibliotecas compartilhadas desde fundações leves e independentes de framework até pacotes pesados no nível da aplicação. - Permita que integrações reutilizáveis e mecanismos de execução dependam somente de pacotes leves; exponha o comportamento necessário da aplicação por meio de uma camada estreita de framework. - Declare cada dependência de tempo de execução no espaço de trabalho que a importa e cada dependência de teste ou ferramenta nas dependências de desenvolvimento desse espaço de trabalho. - Reserve o manifesto raiz para ferramentas de todo o repositório ou verdadeiros requisitos de inicialização. - Fixe as versões de modo consistente e atualize o arquivo de bloqueio com o instalador canônico após alterações nas dependências. ### Proteja a persistência e a concorrência - Registre novas entidades explicitamente quando o mapeador de objetos não as descobrir de forma automática. - Separe os efeitos colaterais em módulos dedicados e invoque-os explicitamente após mutações bem-sucedidas. - Para trabalhos em vários servidores, use um bloqueio distribuído, deduplicação de fila ou bloqueio de linhas com semântica `skip-locked`. - Evite extensões de banco de dados indisponíveis em serviços gerenciados. - Higienize objetos fornecidos externamente antes de armazená-los no banco de dados. ## Evite any e conversões de tipo forçadas, e use os helpers compartilhados do projeto Use interfaces, fluxo de dados, organização de arquivos e utilitários compartilhados que sejam previsíveis. ### Preserve a integridade dos tipos - Não use `any`; use tipos precisos ou `unknown` com guardas de tipo. - Não force valores por meio de conversões de tipo. Corrija o tipo de origem, adicione validação ou restrinja o tipo do valor. - Consulte a documentação da biblioteca antes de usar uma API e substitua tudo o que estiver marcado como obsoleto. - Use um único parâmetro de objeto desestruturado para toda função com mais de 1 parâmetro. - Prefira fluxo de dados imutável entre funções; crie e retorne novas coleções em vez de alterar objetos pertencentes a quem chama. ### Torne as convenções explícitas - Use os helpers de resultado compartilhados do projeto para tratamento de erros síncronos e assíncronos. - Transforme as mensagens de validação voltadas ao usuário em chaves de localização; use chaves compartilhadas para erros comuns de formulário e crie novas chaves quando necessário. - Depois de verificar a branch atual, aumente a versão de patch de um pacote compartilhado para correções ou adições compatíveis e a versão minor para novas exportações ou comportamentos. - Defina helpers não exportados como funções independentes, mantenha a lógica executável primeiro e agrupe constantes e tipos exportados no final, em vez de intercalá-los com a lógica. - Comente por que uma decisão existe, não o que um código autoexplicativo faz. - Exporte vários utilitários simples por meio de 1 objeto nomeado e mantenha os componentes React como exportações nomeadas. ## Envie o HTTP de saída pelo cliente seguro para evitar SSRF e siga as regras da API Aplique semântica explícita de requisições e clientes de rede seguros em cada limite não confiável. ### Padronize os endpoints - Use `POST` para todas as mutações de criação e atualização e `DELETE` para exclusão; nunca use `PUT` ou `PATCH` quando o contrato da API não os incluir. - Dê a cada endpoint uma configuração explícita de acesso de segurança. - Use identificadores, tipos de erro, bases de schema, helpers de coleção e higienizadores de banco de dados canônicos, em vez de implementá-los novamente. ### Evite falsificação de requisições do lado do servidor - Encaminhe as requisições HTTP de saída dos componentes de servidor pelo cliente seguro aprovado. - Nunca use `fetch` sem proteção nem uma fábrica de clientes irrestrita para URLs originadas de entradas do usuário, configurações de administrador, endpoints OAuth ou integrações de terceiros. - Preserve a filtragem de endereços privados, de loopback e de metadados da nuvem. - Mantenha coerção de tipos, validação de URL e higienização de objetos externos no limite. ### Trate migrações como alterações controladas - Leia o guia de migrações do repositório antes de criar ou modificar uma migração. - Siga o processo documentado de geração e estrutura, em vez de inventar o layout da migração. - Mantenha as migrações compatíveis com o ambiente de banco de dados gerenciado suportado. ## Mostre o diálogo global de erro só quando os dados principais da página falharem Mostre falhas globais de consultas somente quando os dados que falharam forem essenciais para a página atual. ### Classifique as consultas pelo impacto - Defina o sinalizador de metadados da consulta que aciona o diálogo global de erro para dados principais da página, como linhas de tabelas ou listas principais. - Não o habilite para dados auxiliares, como sinalizadores de recursos, metadados, buscas individuais, opções de filtro ou detalhes do usuário. - Use esta regra de decisão: mostre o diálogo se, de outra forma, a falha deixaria uma página em branco sem explicação ou uma visualização principal vazia. - Permita que consultas menores falhem silenciosamente quando a interface ao redor continuar útil. - Mantenha desabilitadas as consultas restritas por recursos até que a capacidade correspondente do plano esteja disponível. ## Teste o isolamento entre tenants e cada edição com o executor de tarefas do monorepositório Execute testes focados pelo executor de tarefas canônico do monorepositório e verifique os caminhos que diferem conforme a edição. ### Exercite o código e os dados - Execute testes unitários para código compartilhado e de execução e testes de integração para o comportamento da API. - Use os helpers padrão do ambiente de teste e do contexto da requisição para que a autenticação e o roteamento correspondam ao comportamento em produção. - Garanta que os dados de teste estejam isolados e sejam limpos entre os testes. - Adicione testes de concorrência quando o código usar bloqueios, deduplicação ou seleção no banco de dados com `skip-locked`. - Teste o isolamento entre tenants comprovando que dados de outro projeto ou plataforma não podem ser retornados. ### Use os comandos suportados - Execute o comando obrigatório do repositório para verificar e corrigir o lint antes de considerar a tarefa concluída. - Use o executor de tarefas configurado do monorepositório e comandos com filtro de pacotes; não invoque um sistema de compilação não relacionado. - Quando um frontend hospedado apontar para um backend remoto, evite fluxos OAuth que redirecionem para o domínio hospedado; use credenciais sem redirecionamento ou um backend totalmente local. - Verifique restrições de edição, identidade visual, limites e disponibilidade de recursos em todos os caminhos suportados. ## Rotule a alteração e conclua só depois que as verificações obrigatórias passarem Use a documentação do recurso, rótulos e verificações finais para tornar a alteração compreensível e pronta para lançamento. ### Prepare a implementação - Antes de modificar um recurso, leia a documentação específica dele sobre entidades, serviços, fluxos de dados e restrições de integração. - Mantenha regras críticas de segurança que atravessam o sistema concisas e separadas dos fluxos passo a passo do recurso. - Revise manifestos de dependências, registro de entidades, filtros de tenants, importações entre edições, declarações de acesso e ordem dos efeitos colaterais. ### Prepare a contribuição - Aplique exatamente 1 rótulo principal de alteração que diferencie um recurso, uma correção de erro ou uma alteração interna isenta do registro de mudanças. - Adicione um rótulo separado de área de integração quando a alteração afetar uma integração de terceiros ou do núcleo. - Confirme que o arquivo de bloqueio, a versão do pacote, as chaves de localização, os testes e os artefatos gerados correspondam à implementação. - Execute as verificações obrigatórias de lint, testes e segurança e informe qualquer verificação que não tenha sido executada. - Não declare a conclusão até que o diff final e os resultados da verificação a sustentem.