Sobre o projeto

Visão Geral Este repositório, sqlite-multi-tenant, é um gerenciador de banco de dados SQLite multi-tenant para .NET (descrito nos metadados do repositório como fornecendo isolamento por tenant, migrações e backups). O README é uma referência classe por classe: cada seção documenta um serviço, auxiliar ou validador e o ilustra com exemplos de uso em C#. Ele é escrito como documentação de API em vez de um guia de início rápido, portanto, o material abaixo reflete o que o README realmente demonstra. Estratégias de multi-tenancy Os testes de isolamento de ponta a ponta do README descrevem duas abordagens suportadas: - Conexão por tenant: cada tenant é suportado por seu próprio arquivo SQLite físico, proporcionando isolamento ao nível de arquivo. A string de conexão de um tenant aponta apenas para o banco de dados daquele tenant. - Esquema compartilhado: todos os tenants compartilham um único arquivo SQLite, e uma coluna discriminadora TenantId define o escopo de cada consulta, para que cada tenant leia ou escreva apenas suas próprias linhas. Os testes de isolamento são apresentados como verificações deliberadamente hostis de que um tenant não pode ler, atualizar ou excluir as linhas de outro tenant em qualquer um dos modelos. O código de teste de exemplo cria arquivos de banco de dados temporários por tenant, insere documentos marcados por tenant e afirma que a consulta com um filtro TenantId retorna apenas os títulos daquele tenant. O mesmo padrão é mostrado para um arquivo compartilhado contendo linhas para vários tenants. Métodos auxiliares nos exemplos constroem strings de conexão, criam uma tabela Documents com colunas Id, TenantId e Title, inserem linhas com comandos parametrizados e leem títulos filtrados por tenant. Verificação de integridade O IntegrityCheckService executa operações SQLite PRAGMA integrity_check em bancos de dados de tenants. Pontos de entrada documentados: - Verificar um único tenant por id. - Verificar uma lista explícita de tenants, com um argumento maxDegreeOfParallelism. - Verificar todos os tenants no sistema, também com paralelismo configurável. - Verificar apenas tenants ativos. Os resultados são expostos como objetos TenantIntegrityCheckResult que revelam pelo menos TenantId e IsOk. O paralelismo configurável é apresentado como uma forma de gerenciar a carga do sistema durante a validação. Auxiliares de contexto de tenant O TenantContextHelperExtensions adiciona métodos de extensão ao TenantContextHelper para trabalhar dentro de escopos multi-tenant. O README mostra: verificar se o tenant atual corresponde a um id de destino, criar um escopo validado que pode carregar um id de tenant e um id de usuário e é usado em um bloco using, recuperar o contexto de tenant necessário, recuperar o id do tenant necessário diretamente e executar uma ação ou uma função que retorna um valor dentro de um contexto de tenant especificado. Estes visam reduzir a repetição de código estrutural em caminhos de código cientes de tenants. Validação de Middleware Dois validadores são documentados: - RateLimitingMiddlewareValidation valida uma instância de RateLimitingMiddleware, um objeto RateLimitingConfig (com campos como MaxRequestsPerSecond, MaxBurst, WindowSize, Enabled e BanDuration), um RateLimitExceededResult (IsExceeded, RetryAfter, CurrentRequestCount, Limit, Window) e RateLimitStatistics (TotalRequests, AllowedRequests, DeniedRequests, PeakRequestsPerSecond, CurrentActiveLimits). Para cada sobrecarga, o README mostra o Validate retornando uma lista de strings de problema, IsValid retornando um booleano e EnsureValid lançando uma exceção quando a entrada é inválida. Um exemplo de fluxo de trabalho valida a configuração do middleware antes do uso e captura a exceção de argumento resultante. - ErrorHandlingMiddlewareValidation fornece métodos de extensão que validam uma instância de ErrorHandlingMiddleware e objetos Result. Ele verifica referências nulas, consistência entre flags de sucesso e mensagens de erro, e se os resultados bem-sucedidos carregam um valor não padrão. A superfície documentada é Validate, IsValid e EnsureValid no middleware, além dos mesmos três métodos em valores Result, para que invariantes possam ser aplicadas precocemente no pipeline de requisição. Acesso a configurações O SettingsControllerExtensions adiciona operações fortemente tipadas e em lote ao SettingsController. Os métodos documentados incluem: ler uma configuração como um tipo concreto, opcionalmente com uma função de análise personalizada (por exemplo, para DateTime); escrever um valor fortemente tipado; atualizar um dicionário de configurações em uma única chamada de lote; testar se uma configuração existe; e recuperar configurações filtradas por um predicado, retornando uma lista de valores de configuração. Os resultados são encapsulados em um objeto de resposta de API com um payload Data, conforme mostrado pelas verificações de OkObjectResult nos exemplos. Utilitários de serialização - ReportGeneratorJsonExtensions encapsula a serialização System.Text.Json para dados de monitoramento: resumos de saúde, estatísticas de operação e métricas de desempenho. Documenta ToJson para escrita, FromJsonToOperationStatistics para leitura de estatísticas e TryFromJson para métricas de desempenho com um resultado booleano de sucesso. - StringUtilitiesJsonExtensions serializa e desserializa strings, com variantes que anexam um hash SHA256 ou convertem para snake_case, além de um método try-deserialize que relata o sucesso sem lançar exceções. Utilitários de teste O TenantNameValidatorTestsExtensions fornece auxiliares no estilo de asserção para validação de nome de tenant: verificar se um nome mapeia para um id de tenant normalizado esperado, se um nome é considerado um id de tenant válido, se um nome inválido gera uma mensagem de erro específica esperada e enumerar as coleções integradas de ids de tenants inválidos com seus erros e mapeamentos válidos de nome para id. Estes destinam-se a ser reutilizados a partir de suítes de teste. Notas para avaliação O README é uma documentação de APIs individuais com trechos de uso; ele não inclui instruções de instalação, nomes de pacotes, versões do .NET suportadas, guias de migração ou backup, ou detalhes de licença e contribuição, embora migrações e backups sejam mencionados na descrição do repositório. Os exemplos referenciam namespaces como SqliteMultiTenant.Services, SqliteMultiTenant.Models, SqliteMultiTenant.Utilities, SqliteMultiTenant.Middleware, SqliteMultiTenant.Monitoring, SqliteMultiTenant.Validation e SqliteMultiTenant.Api.Controllers, e dependem de System.Data.SQLite e de um framework de teste. Os leitores devem tratar os exemplos como ilustrativos e confirmar as APIs atuais, empacotamento e garantias de isolamento contra o código-fonte antes de adotá-los. Os blocos repetidos ao final do README sugerem alguma duplicidade no próprio documento.