Tooark.Entities
4.0.1
dotnet add package Tooark.Entities --version 4.0.1
NuGet\Install-Package Tooark.Entities -Version 4.0.1
<PackageReference Include="Tooark.Entities" Version="4.0.1" />
<PackageVersion Include="Tooark.Entities" Version="4.0.1" />
<PackageReference Include="Tooark.Entities" />
paket add Tooark.Entities --version 4.0.1
#r "nuget: Tooark.Entities, 4.0.1"
#:package Tooark.Entities@4.0.1
#addin nuget:?package=Tooark.Entities&version=4.0.1
#tool nuget:?package=Tooark.Entities&version=4.0.1
Tooark.Entities
Biblioteca com entidades base para aplicações .NET, incluindo suporte a identificadores únicos, auditoria, controle de versão e exclusão lógica.
📦 Conteúdo do Pacote
Entidades
| Classe | Descrição |
|---|---|
BaseEntity |
Identificador único + suporte a notificações/validações |
InitialEntity |
Informações de criação (CreatedById/CreatedAt) |
DetailedEntity |
Informações de atualização (UpdatedById/UpdatedAt) |
VersionedEntity |
Controle de versão (Version) incrementada em atualizações |
SoftDeletableEntity |
Exclusão lógica simples (Deleted) + atualização via UpdatedById |
AuditableEntity |
Auditoria completa: versão (Version) + exclusão(Deleted)/restauração com usuário/data (DeletedById/DeletedAt/RestoredById/RestoredAt) |
FileEntity |
Entidade base para arquivos (FileName, Title, Link, FileFormat, Type, Size) |
Value Objects usados nas entidades
As entidades recebem Value Objects do pacote Tooark.ValueObjects — CreatedBy, UpdatedBy,
DeletedBy, RestoredBy, FileStorage e Title — e guardam o valor já convertido. O que entra é o
objeto de valor (CreatedBy); o que a entidade expõe é o Guid (CreatedById).
🔧 Instalação
dotnet add package Tooark.Entities
⚙️ Configuração
Não há configuração adicional.
Como as operações de escrita reagem a valor inválido
Os métodos Set* lançam BadRequestException e não deixam notificação na entidade. Uma chamada
recusada não altera nada: a entidade segue íntegra e a chamada seguinte, se correta, é aceita
normalmente.
using Tooark.Entities;
using Tooark.Exceptions;
public static class Exemplo
{
public static void Excluir(AuditableEntity entidade, Guid usuario)
{
try
{
// Recusada: o identificador é vazio
entidade.SetDeleted(Guid.Empty);
}
catch (BadRequestException)
{
// A entidade não guardou nada da chamada recusada e segue íntegra
}
// Aceita normalmente
entidade.SetDeleted(usuario);
}
}
A exceção do valor ausente é diferente da do valor inválido: null produz Field.Required;<campo>, e
valor presente mas reprovado produz Field.Invalid;<campo>.
O SetId do BaseEntity é a única exceção: ele acumula notificação em vez de lançar, porque roda
no construtor. Verifique IsValid depois de construir uma entidade com identificador informado.
Já ValidateNotDeleted() acumula notificação de propósito — é o método para checar sem interromper o
fluxo. Quem quer interromper usa EnsureNotDeleted(), que lança.
🧩 Entidades (Detalhes)
BaseEntity
- Propriedades
Id(Guid) — colunaid(uuid)
- Construtores (para classes derivadas)
BaseEntity()— geraIdautomaticamenteBaseEntity(Guid id)— defineIddeterminístico (seed/testes/factories)
- Observações
- O
Idtem setter privado. Classes derivadas definem o identificador peloSetIdprotegido, que recusaGuid.Emptye recusa trocar a identidade de uma entidade já criada — nos dois casos por notificação, sem lançar. - A igualdade compara tipo e identificador: entidades de tipos diferentes com o mesmo
Idnão são iguais. A comparação aceita herança nos dois sentidos, para não quebrar com os proxies de carregamento tardio do Entity Framework. - Exemplos de Uso.
- O
InitialEntity
- Propriedades
CreatedById(Guid) — colunacreated_by(uuid)CreatedAt(DateTime/UTC) — colunacreated_at(timestamp with time zone)
- Métodos
SetCreatedBy(CreatedBy createdById)
- Observações
- Herda de
BaseEntity. SetCreatedByrecebe o Value ObjectCreatedBy, que aceita conversão implícita a partir deGuid.- Em caso de dados inválidos, lança
BadRequestException. - Exemplos de Uso.
- Herda de
DetailedEntity
- Propriedades
UpdatedById(Guid) — colunaupdated_by(uuid)UpdatedAt(DateTime/UTC) — colunaupdated_at(timestamp with time zone)
- Métodos
SetCreatedBy(CreatedBy createdById)— define tambémUpdatedByIdeUpdatedAt, iguais aos da criaçãoSetUpdatedBy(UpdatedBy updatedById)
- Observações
- Herda de
InitialEntity. SetUpdatedByrecebe o Value ObjectUpdatedBy, que aceita conversão implícita a partir deGuid.- Em caso de dados inválidos, lança
BadRequestException. - Exemplos de Uso.
- Herda de
VersionedEntity
- Propriedades
Version(long) — colunaversion(bigint), valor padrão1
- Métodos
SetUpdatedBy(UpdatedBy updatedById)— atualiza e incrementa a versão
- Observações
- Herda de
DetailedEntity. - Em caso de dados inválidos, lança
BadRequestException. - Exemplos de Uso.
- Herda de
SoftDeletableEntity
- Propriedades
Deleted(bool) — colunadeleted(bool), valor padrãofalse
- Métodos
ValidateNotDeleted()— valida se não está deletada e adiciona notificaçãoEnsureNotDeleted()— lança exception se estiver deletadaSetDeleted(UpdatedBy changedById)— marca como deletada e atualiza; ignorada se já estiver deletadaSetRestored(UpdatedBy changedById)— restaura e atualiza; ignorada se não estiver deletada
- Observações
- Herda de
DetailedEntity. - Em caso de dados inválidos, lança
BadRequestException. - Exemplos de Uso.
- Herda de
AuditableEntity
- Propriedades
Version(long)Deleted(bool)DeletedById(Guid?) — colunadeleted_by(uuid)DeletedAt(DateTime?) — colunadeleted_at(timestamp with time zone)RestoredById(Guid?) — colunarestored_by(uuid)RestoredAt(DateTime?) — colunarestored_at(timestamp with time zone)
- Métodos
ValidateNotDeleted()— valida se não está deletada e adiciona notificaçãoEnsureNotDeleted()— lança exception se estiver deletadaSetUpdatedBy(UpdatedBy updatedById)— atualiza e incrementa a versãoSetDeleted(DeletedBy deletedById)— marca como deletada, registra o usuário e a data da exclusão, atualizaUpdatedById/UpdatedAte incrementa a versãoSetRestored(RestoredBy restoredById)— restaura, registra o usuário e a data da restauração, atualizaUpdatedById/UpdatedAte incrementa a versão
- Observações
- Herda de
DetailedEntity. - Em caso de dados inválidos, lança
BadRequestException. - Exemplos de Uso.
- Herda de
FileEntity
- Propriedades
FileName(string) — colunafile_name(text)Title(string) — colunatitle(varchar(255))Link(string) — colunalink(text)FileFormat(string?) — colunafile_format(varchar(10))Type(EFileType) — colunatype(int)Size(long) — colunasize(bigint)
- Construtores (para classes derivadas)
FileEntity(FileStorage file, Title title, CreatedBy createdById)FileEntity(FileStorage file, Title title, string fileFormat, EFileType type, long size, CreatedBy createdById)
- Observações
- Herda de
InitialEntity. FileStorageeTitlesão Value Objects. Em caso de dados inválidos, lançaBadRequestException.- Exemplos de Uso.
- Herda de
📝 Exemplos de Uso
Entidade Base
using Tooark.Entities;
public class Produto : BaseEntity
{
public Produto() { }
public Produto(Guid id) : base(id) { }
public string Nome { get; set; } = string.Empty;
public decimal Valor { get; set; }
}
public class Program
{
public static void Main()
{
var produto = new Produto
{
Nome = "Produto A",
Valor = 100.0m
};
var idGerado = produto.Id;
var produtoDeterministico = new Produto(Guid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"));
}
}
Entidade Inicial
using Tooark.Entities;
public class Produto : InitialEntity
{
public string Nome { get; set; } = string.Empty;
public decimal Valor { get; set; }
}
public class Program
{
public static void Main()
{
var produto = new Produto
{
Nome = "Produto A",
Valor = 100.0m
};
// SetCreatedBy recebe CreatedBy (Value Object), mas Guid converte implicitamente.
produto.SetCreatedBy(Guid.NewGuid());
}
}
Entidade Detalhada
using Tooark.Entities;
public class Produto : DetailedEntity
{
public string Nome { get; set; } = string.Empty;
public decimal Valor { get; set; }
}
public class Program
{
public static void Main()
{
var produto = new Produto
{
Nome = "Produto A",
Valor = 100.0m
};
produto.SetCreatedBy(Guid.NewGuid());
produto.SetUpdatedBy(Guid.NewGuid());
}
}
Entidade Versionada
using Tooark.Entities;
public class Produto : VersionedEntity
{
public string Nome { get; set; } = string.Empty;
public decimal Valor { get; set; }
}
public class Program
{
public static void Main()
{
var produto = new Produto
{
Nome = "Produto A",
Valor = 100.0m
};
produto.SetCreatedBy(Guid.NewGuid());
produto.SetUpdatedBy(Guid.NewGuid());
var version = produto.Version;
}
}
Entidade Deletável
using Tooark.Entities;
public class Produto : SoftDeletableEntity
{
public string Nome { get; set; } = string.Empty;
public decimal Valor { get; set; }
}
public class Program
{
public static void Main()
{
var produto = new Produto
{
Nome = "Produto A",
Valor = 100.0m
};
produto.SetCreatedBy(Guid.NewGuid());
produto.SetDeleted(Guid.NewGuid());
produto.SetRestored(Guid.NewGuid());
}
}
Entidade Auditável
using Tooark.Entities;
public class Produto : AuditableEntity
{
public string Nome { get; set; } = string.Empty;
public decimal Valor { get; set; }
}
public class Program
{
public static void Main()
{
var produto = new Produto
{
Nome = "Produto A",
Valor = 100.0m
};
produto.SetCreatedBy(Guid.NewGuid());
produto.SetUpdatedBy(Guid.NewGuid());
produto.SetDeleted(Guid.NewGuid());
produto.SetRestored(Guid.NewGuid());
}
}
Entidade de Arquivo
using Tooark.Entities;
using Tooark.Enums;
using Tooark.ValueObjects;
public class Arquivo : FileEntity
{
public Arquivo(string link, string name, string title, Guid createdById)
: base(new FileStorage(link, name), new Title(title), new CreatedBy(createdById))
{ }
public Arquivo(string link, string name, string title, string fileFormat, EFileType type, long size, Guid createdById)
: base(new FileStorage(link, name), new Title(title), fileFormat, type, size, createdById)
{ }
}
public class Program
{
public static void Main()
{
var arquivo = new Arquivo(
link: "https://bucket.com/arquivo.pdf",
name: "Arquivo.pdf",
title: "Arquivo de teste",
createdById: Guid.NewGuid()
);
var arquivoDetalhado = new Arquivo(
link: "https://bucket.com/arquivo.pdf",
name: "Arquivo.pdf",
title: "Arquivo de teste",
fileFormat: "pdf",
type: EFileType.Document,
size: 1024,
createdById: Guid.NewGuid()
);
}
}
📋 Dependências
| Pacote | Versão | Descrição |
|---|---|---|
Tooark.Enums |
4.x | Tipos compartilhados, como o EFileType |
Tooark.Exceptions |
4.x | BadRequestException, lançada pelas operações de escrita |
Tooark.Notifications |
4.x | Base de notificações das entidades |
Tooark.Validations |
4.x | Regras usadas na validação do FileEntity |
Tooark.ValueObjects |
4.x | Objetos de valor recebidos pelos construtores e métodos |
⚠️ Códigos de Erro, Notificações e Soluções
Os códigos de erro para notificações seguem o padrão T.ENT.<SIGLA><N> (ex.: T.ENT.BAS1).
Códigos emitidos pelas entidades:
| Código | Emissor | Situação |
|---|---|---|
T.ENT.BAS1 |
BaseEntity.SetId |
Identificador vazio |
T.ENT.BAS2 |
BaseEntity.SetId |
Tentativa de trocar o identificador |
T.ENT.INI1 |
InitialEntity.SetCreatedBy |
Autoria da criação já registrada |
T.ENT.SOF1 |
SoftDeletableEntity.ValidateNotDeleted |
Registro excluído logicamente |
T.ENT.AUD1 |
AuditableEntity.ValidateNotDeleted |
Registro excluído logicamente |
O código acompanha a notificação, esteja ela registrada na entidade ou transportada pela exceção. As
mensagens que vêm dos objetos de valor — Field.Invalid;CreatedBy e as demais — são emitidas pelo
Tooark.ValueObjects e carregam o código dele, não um T.ENT.*. Repare que o link reprovado do
FileEntity reporta ProtocolHttp, que é o objeto de valor interno do FileStorage, e não
FileStorage.
Tabela de erros/notificações:
| Entidade | Mensagem | Descrição | Solução | Retorno |
|---|---|---|---|---|
BaseEntity |
Field.Empty;Id |
Identificador vazio | Defina um identificador válido para a entidade | Notification |
BaseEntity |
Field.ChangeBlocked;Id |
Identificador não pode ser alterado | Não troque o identificador de uma entidade já criada | Notification |
InitialEntity |
Field.ChangeBlocked;CreatedBy |
Criador já registrado | A autoria da criação é definida uma única vez; não a redefina | Exception |
InitialEntity |
Field.Invalid;CreatedBy |
Campo do Criador inválido | Informe um criador válido | Exception |
DetailedEntity |
Field.ChangeBlocked;CreatedBy |
Criador já registrado | A autoria da criação é definida uma única vez; não a redefina | Exception |
DetailedEntity |
Field.Invalid;CreatedBy |
Campo do Criador inválido | Informe um criador válido | Exception |
DetailedEntity |
Field.Invalid;UpdatedBy |
Campo do Atualizador inválido | Informe um atualizador válido | Exception |
VersionedEntity |
Field.ChangeBlocked;CreatedBy |
Criador já registrado | A autoria da criação é definida uma única vez; não a redefina | Exception |
VersionedEntity |
Field.Invalid;CreatedBy |
Campo do Criador inválido | Informe um criador válido | Exception |
VersionedEntity |
Field.Invalid;UpdatedBy |
Campo do Atualizador inválido | Informe um atualizador válido | Exception |
SoftDeletableEntity |
Field.ChangeBlocked;CreatedBy |
Criador já registrado | A autoria da criação é definida uma única vez; não a redefina | Exception |
SoftDeletableEntity |
Field.Invalid;CreatedBy |
Campo do Criador inválido | Informe um criador válido | Exception |
SoftDeletableEntity |
Field.Invalid;UpdatedBy |
Campo do Atualizador inválido | Informe um atualizador válido | Exception |
SoftDeletableEntity |
Record.Deleted |
Registro deletado | Análise se é necessário restaurar o registro antes de realizar operações | Notification |
SoftDeletableEntity |
Record.Deleted |
Registro deletado | Restaure o registro se necessário antes de realizar operações | Exception |
AuditableEntity |
Field.ChangeBlocked;CreatedBy |
Criador já registrado | A autoria da criação é definida uma única vez; não a redefina | Exception |
AuditableEntity |
Field.Invalid;CreatedBy |
Campo do Criador inválido | Informe um criador válido | Exception |
AuditableEntity |
Field.Invalid;UpdatedBy |
Campo do Atualizador inválido | Informe um atualizador válido | Exception |
AuditableEntity |
Field.Invalid;DeletedBy |
Campo do Deletador inválido | Informe um deletador válido | Exception |
AuditableEntity |
Field.Invalid;RestoredBy |
Campo do Restaurador inválido | Informe um restaurador válido | Exception |
AuditableEntity |
Record.Deleted |
Registro deletado | Análise se é necessário restaurar o registro antes de realizar operações | Notification |
AuditableEntity |
Record.Deleted |
Registro deletado | Restaure o registro se necessário antes de realizar operações | Exception |
FileEntity |
Field.Invalid;ProtocolHttp |
Link do arquivo inválido | Informe um link HTTP ou HTTPS válido | Exception |
FileEntity |
Field.Invalid;Title |
Título do arquivo inválido | Informe um título válido | Exception |
FileEntity |
Field.Required;FileStorage |
Arquivo não informado | Informe o FileStorage do arquivo |
Exception |
FileEntity |
Field.Required;Title |
Título não informado | Informe o Title do arquivo |
Exception |
FileEntity |
Field.Required;FileFormat |
Formato do arquivo não informado | Informe o formato do arquivo | Exception |
FileEntity |
Field.Invalid;Size |
Tamanho do arquivo negativo | Informe um tamanho maior ou igual a zero | Exception |
Vale para todas as entidades: argumento nulo produz Field.Required;<campo> — CreatedBy,
UpdatedBy, DeletedBy ou RestoredBy, conforme a operação — como Exception.
🪪 Contribuição
Contribuições são bem-vindas! Sinta-se à vontade para abrir issues e pull requests no repositório Tooark.Entities.
📄 Licença
Este projeto está licenciado sob a licença BSD 3-Clause. Veja o arquivo LICENSE para mais detalhes.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.AspNetCore.Http (>= 2.3.12)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.11)
- Microsoft.Extensions.Localization (>= 10.0.11)
- Microsoft.Extensions.Options (>= 10.0.11)
- Tooark.Enums (>= 4.0.1)
- Tooark.Exceptions (>= 4.0.1)
- Tooark.Notifications (>= 4.0.1)
- Tooark.Validations (>= 4.0.1)
- Tooark.ValueObjects (>= 4.0.1)
-
net8.0
- Microsoft.AspNetCore.Http (>= 2.3.12)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Localization (>= 8.0.30)
- Microsoft.Extensions.Options (>= 8.0.2)
- Tooark.Enums (>= 4.0.1)
- Tooark.Exceptions (>= 4.0.1)
- Tooark.Notifications (>= 4.0.1)
- Tooark.Validations (>= 4.0.1)
- Tooark.ValueObjects (>= 4.0.1)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Tooark.Entities:
| Package | Downloads |
|---|---|
|
Tooark
Package with all Tooark resources for .NET applications. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.0.1 | 121 | 8/25/2026 |
| 4.0.0 | 95 | 8/25/2026 |
| 3.3.5 | 97 | 8/25/2026 |
| 3.3.4 | 283 | 8/12/2026 |
| 3.3.3 | 356 | 7/27/2026 |
| 3.3.2 | 298 | 6/11/2026 |
| 3.3.1 | 143 | 6/6/2026 |
| 3.3.0 | 148 | 4/17/2026 |
| 3.2.3 | 136 | 4/17/2026 |
| 3.2.2 | 133 | 3/23/2026 |
| 3.2.1 | 132 | 3/23/2026 |
| 3.2.0 | 147 | 1/21/2026 |
| 3.1.0 | 147 | 1/10/2026 |
| 3.0.0 | 156 | 1/9/2026 |
| 2.3.4 | 95 | 8/25/2026 |
| 2.3.3 | 101 | 7/27/2026 |
| 2.3.2 | 132 | 4/17/2026 |
| 2.3.1 | 134 | 3/23/2026 |
| 2.3.0 | 139 | 1/21/2026 |
| 2.2.1 | 141 | 1/6/2026 |