{"id":29632945,"url":"https://github.com/megabytemark/intradotnet-infrastructure-core","last_synced_at":"2025-07-21T13:35:47.509Z","repository":{"id":303688571,"uuid":"1016355651","full_name":"MegaByteMark/intradotnet-infrastructure-core","owner":"MegaByteMark","description":"A convenience library for reducing common infrastructure (data access) boilerplate.","archived":false,"fork":false,"pushed_at":"2025-07-08T22:34:25.000Z","size":0,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-08T22:47:43.414Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MegaByteMark.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-08T22:18:14.000Z","updated_at":"2025-07-08T22:34:13.000Z","dependencies_parsed_at":"2025-07-08T22:47:45.369Z","dependency_job_id":"73d625e2-3f4c-48f6-84bf-a56b26c643be","html_url":"https://github.com/MegaByteMark/intradotnet-infrastructure-core","commit_stats":null,"previous_names":["megabytemark/intradotnet-infrastructure-core"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MegaByteMark/intradotnet-infrastructure-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MegaByteMark%2Fintradotnet-infrastructure-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MegaByteMark%2Fintradotnet-infrastructure-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MegaByteMark%2Fintradotnet-infrastructure-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MegaByteMark%2Fintradotnet-infrastructure-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MegaByteMark","download_url":"https://codeload.github.com/MegaByteMark/intradotnet-infrastructure-core/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MegaByteMark%2Fintradotnet-infrastructure-core/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266312210,"owners_count":23909745,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-21T11:47:31.412Z","response_time":64,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-07-21T13:35:43.131Z","updated_at":"2025-07-21T13:35:47.496Z","avatar_url":"https://github.com/MegaByteMark.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IntraDotNet Infrastructure Core\n\nThe `IntraDotNet.Infrastructure.Core` library provides a set of interfaces that help implement common auditing and versioning patterns in your domain entities. These interfaces are designed to work seamlessly with Entity Framework Core and other ORM frameworks to automatically track entity lifecycle events.\n\n## Features\n\n- **Audit Tracking**: Automatically track creation, update, and soft deletion events\n- **Concurrency Control**: Built-in row versioning support for optimistic concurrency\n- **Flexible Implementation**: Modular interfaces that can be implemented individually or combined\n- **.NET 9.0 Support**: Built for the latest .NET framework with nullable reference types enabled\n\n## Interfaces\n\n### Core Auditing Interfaces\n\n#### [`ICreateAuditable`](intradotnet-infrastructure-core/ICreateAuditable.cs)\nTracks entity creation information:\n```csharp\npublic interface ICreateAuditable\n{\n    public DateTimeOffset? CreatedOn { get; set; }\n    public string? CreatedBy { get; set; }\n}\n```\n\n#### [`IUpdateAuditable`](intradotnet-infrastructure-core/IUpdateAuditable.cs)\nTracks entity update information:\n```csharp\npublic interface IUpdateAuditable\n{\n    public DateTimeOffset? LastUpdateOn { get; set; }\n    public string? LastUpdateBy { get; set; }\n}\n```\n\n#### [`ISoftDeleteAuditable`](intradotnet-infrastructure-core/ISoftDeleteAuditable.cs)\nTracks soft deletion without physically removing entities:\n```csharp\npublic interface ISoftDeleteAuditable\n{\n    public DateTimeOffset? DeletedOn { get; set; }\n    public string? DeletedBy { get; set; }\n}\n```\n\n#### [`IAuditable`](intradotnet-infrastructure-core/IAuditable.cs)\nCombines all auditing interfaces for comprehensive tracking:\n```csharp\npublic interface IAuditable : ICreateAuditable, IUpdateAuditable, ISoftDeleteAuditable\n{\n}\n```\n\n### Concurrency Control\n\n#### [`IRowVersion`](intradotnet-infrastructure-core/IRowVersion.cs)\nProvides optimistic concurrency control:\n```csharp\npublic interface IRowVersion\n{\n    [Timestamp]\n    byte[]? RowVersion { get; set; }\n}\n```\n\n## Usage Examples\n\n### Basic Entity with Full Auditing\n\n```csharp\nusing IntraDotNet.Infrastructure.Core;\n\npublic class Product : IAuditable, IRowVersion\n{\n    public int Id { get; set; }\n    public string Name { get; set; } = string.Empty;\n    public decimal Price { get; set; }\n    \n    // IAuditable properties\n    public DateTimeOffset? CreatedOn { get; set; }\n    public string? CreatedBy { get; set; }\n    public DateTimeOffset? LastUpdateOn { get; set; }\n    public string? LastUpdateBy { get; set; }\n    public DateTimeOffset? DeletedOn { get; set; }\n    public string? DeletedBy { get; set; }\n    \n    // IRowVersion property\n    public byte[]? RowVersion { get; set; }\n}\n```\n\n### Entity with Selective Auditing\n\n```csharp\nusing IntraDotNet.Infrastructure.Core;\n\npublic class Category : ICreateAuditable, IUpdateAuditable\n{\n    public int Id { get; set; }\n    public string Name { get; set; } = string.Empty;\n    \n    // Only track creation and updates, not deletions\n    public DateTimeOffset? CreatedOn { get; set; }\n    public string? CreatedBy { get; set; }\n    public DateTimeOffset? LastUpdateOn { get; set; }\n    public string? LastUpdateBy { get; set; }\n}\n```\n\n### Entity Framework Core Integration\n\n```csharp\npublic class ApplicationDbContext : DbContext\n{\n    public DbSet\u003cProduct\u003e Products { get; set; }\n    public DbSet\u003cCategory\u003e Categories { get; set; }\n    \n    public override int SaveChanges()\n    {\n        UpdateAuditableEntities();\n        return base.SaveChanges();\n    }\n    \n    public override async Task\u003cint\u003e SaveChangesAsync(CancellationToken cancellationToken = default)\n    {\n        UpdateAuditableEntities();\n        return await base.SaveChangesAsync(cancellationToken);\n    }\n    \n    private void UpdateAuditableEntities()\n    {\n        var entries = ChangeTracker.Entries()\n            .Where(e =\u003e e.State == EntityState.Added || e.State == EntityState.Modified);\n            \n        var currentUser = GetCurrentUser(); // Implement your user resolution logic\n        var timestamp = DateTimeOffset.UtcNow;\n        \n        foreach (var entry in entries)\n        {\n            if (entry.Entity is ICreateAuditable createAuditable \u0026\u0026 entry.State == EntityState.Added)\n            {\n                createAuditable.CreatedOn = timestamp;\n                createAuditable.CreatedBy = currentUser;\n            }\n            \n            if (entry.Entity is IUpdateAuditable updateAuditable \u0026\u0026 entry.State == EntityState.Modified)\n            {\n                updateAuditable.LastUpdateOn = timestamp;\n                updateAuditable.LastUpdateBy = currentUser;\n            }\n        }\n    }\n    \n    private string GetCurrentUser()\n    {\n        // Implement your logic to get the current user\n        return \"system\"; // placeholder\n    }\n}\n```\n\n### Soft Delete Implementation\n\n```csharp\npublic static class SoftDeleteExtensions\n{\n    public static void SoftDelete\u003cT\u003e(this T entity, string deletedBy) \n        where T : ISoftDeleteAuditable\n    {\n        entity.DeletedOn = DateTimeOffset.UtcNow;\n        entity.DeletedBy = deletedBy;\n    }\n    \n    public static IQueryable\u003cT\u003e WhereNotDeleted\u003cT\u003e(this IQueryable\u003cT\u003e query) \n        where T : ISoftDeleteAuditable\n    {\n        return query.Where(e =\u003e e.DeletedOn == null);\n    }\n}\n\n// Usage\nvar product = await context.Products.FindAsync(id);\nif (product != null)\n{\n    product.SoftDelete(\"current-user\");\n    await context.SaveChangesAsync();\n}\n\n// Query non-deleted entities\nvar activeProducts = context.Products.WhereNotDeleted().ToList();\n```\n\n## Installation\n\nInstall the package via NuGet:\n\n```bash\ndotnet add package IntraDotNet.Infrastructure.Core\n```\n\nOr via Package Manager Console:\n\n```powershell\nInstall-Package IntraDotNet.Infrastructure.Core\n```\n\n## Requirements\n\n- .NET 9.0 or later\n- Compatible with Entity Framework Core and other ORM frameworks\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Repository\n\n[https://github.com/MegaByteMark/intradotnet-infrastructure-core](https://github.com/MegaByteMark/intradotnet-infrastructure-core)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmegabytemark%2Fintradotnet-infrastructure-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmegabytemark%2Fintradotnet-infrastructure-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmegabytemark%2Fintradotnet-infrastructure-core/lists"}