Package for managing base entities in .NET applications.
$ dotnet add package Tooark.EntitiesBiblioteca com entidades base para aplicações .NET, incluindo suporte a identificadores únicos, auditoria, controle de versão e exclusão lógica.
| 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) |
As entidades usam Value Objects do pacote Tooark.ValueObjects (ex.: CreatedById, UpdatedById, DeletedById, RestoredById, FileStorage, Title).
dotnet add package Tooark.Entities
Não há configuração adicional.
Id (Guid) — coluna id (uuid)BaseEntity() — gera Id automaticamenteBaseEntity(Guid id) — define Id determinístico (seed/testes/factories)Id tem setter privado; não existe SetId público.CreatedById (Guid) — coluna created_by (uuid)CreatedAt (DateTime/UTC) — coluna created_at (timestamp with time zone)SetCreatedBy(CreatedBy createdById)BaseEntity.CreatedById é Value Object e aceita conversão implícita a partir de Guid.BadRequestException.UpdatedById (Guid) — coluna updated_by (uuid)UpdatedAt (DateTime/UTC) — coluna updated_at (timestamp with time zone)SetCreatedBy(CreatedBy createdById) — define também UpdatedByIdSetUpdatedBy(UpdatedBy updatedById)InitialEntity.UpdatedById é Value Object e aceita conversão implícita a partir de Guid.BadRequestException.Version (long) — coluna version (bigint), valor padrão 1SetUpdatedBy(UpdatedBy updatedById) — atualiza e incrementa a versãoDetailedEntity.BadRequestException.Deleted (bool) — coluna deleted (bool), valor padrão falseValidateNotDeleted() — valida se não está deletada e adiciona notificaçãoEnsureNotDeleted() — lança exception se estiver deletadaSetDeleted(UpdatedBy changedById) — marca como deletada e atualizaSetRestored(UpdatedBy changedById) — restaura e atualizaDetailedEntity.BadRequestException.Version (long)Deleted (bool)DeletedById (Guid?) — coluna deleted_by (uuid)DeletedAt (DateTime?) — coluna deleted_at (timestamp with time zone)RestoredById (Guid?) — coluna restored_by (uuid)RestoredAt (DateTime?) — coluna restored_at (timestamp with time zone)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(DeletedById deletedById) — marca como deletada, registra o usuário e a data da exclusão, e incrementa a versãoSetRestored(RestoredById restoredById) — restaura, registra o usuário e a data da restauração, e incrementa a versãoDetailedEntity.BadRequestException.FileName (string) — coluna file_name (text)Title (string) — coluna title (varchar(255))Link (string) — coluna link (text)FileFormat (string?) — coluna file_format (varchar(10))Type (EFileType) — coluna type (int)Size (long) — coluna size (bigint)FileEntity(FileStorage file, Title title, CreatedBy createdById)FileEntity(FileStorage file, Title title, string fileFormat, EFileType type, long size, CreatedBy createdById)InitialEntity.FileStorage e Title são Value Objects. Em caso de dados inválidos, lança BadRequestException.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"));
}
}
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());
}
}
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());
}
}
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;
}
}
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());
}
}
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());
}
}
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()
);
}
}
| Projeto | Versão | Descrição |
|---|---|---|
Tooark.Enums | — | Tipos/enums compartilhados (ex.: EFileType) |
Tooark.Exceptions | — | Exceções (ex.: BadRequestException) |
Tooark.Notifications | — | Base de notificações usada pelas entidades |
Tooark.Utils | — | Utilitários internos do toolkit |
Tooark.ValueObjects | — | Value Objects usados por propriedades/métodos/constructores |
Os códigos de erro para notificações seguem o padrão T.ENT.<SIGLA><N> (ex.: T.ENT.BAS1).
Alguns códigos utilizados diretamente nas entidades:
BaseEntity: T.ENT.BAS1, T.ENT.BAS2InitialEntity: T.ENT.INI1SoftDeletableEntity: T.ENT.SOF1AuditableEntity: T.ENT.AUD1Tabela de erros/notificações:
| Entidade | Mensagem | Descrição | Solução | Retorno |
|---|---|---|---|---|
BaseEntity | Empty;Id | Identificador vazio | Defina um identificador válido para a entidade | Notification |
BaseEntity | ChangeBlocked;Id | Identificador não pode ser alterado | Informe o identificador do registro | Notification |
InitialEntity | ChangeBlocked;CreatedBy | Criador não pode ser alterado | Informe o criador do registro | Exception |
InitialEntity | Field.Invalid;CreatedBy | Campo do Criador inválido | Informe um criador válido | Exception |
DetailedEntity | ChangeBlocked;CreatedBy | Criador não pode ser alterado | Informe o criador do registro | 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 | ChangeBlocked;CreatedBy | Criador não pode ser alterado | Informe o criador do registro | 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 | ChangeBlocked;CreatedBy | Criador não pode ser alterado | Informe o criador do registro | 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 | ChangeBlocked;CreatedBy | Criador não pode ser alterado | Informe o criador do registro | 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 |
Contribuições são bem-vindas! Sinta-se à vontade para abrir issues e pull requests no repositório Tooark.Entities.
Este projeto está licenciado sob a licença BSD 3-Clause. Veja o arquivo LICENSE para mais detalhes.