eQuantic.Core.Api 1.7.12

There is a newer version of this package available.
See the version list below for details.
dotnet add package eQuantic.Core.Api --version 1.7.12                
NuGet\Install-Package eQuantic.Core.Api -Version 1.7.12                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="eQuantic.Core.Api" Version="1.7.12" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add eQuantic.Core.Api --version 1.7.12                
#r "nuget: eQuantic.Core.Api, 1.7.12"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install eQuantic.Core.Api as a Cake Addin
#addin nuget:?package=eQuantic.Core.Api&version=1.7.12

// Install eQuantic.Core.Api as a Cake Tool
#tool nuget:?package=eQuantic.Core.Api&version=1.7.12                

eQuantic.Core.Api Library

The eQuantic Core API provides all the implementation needed to publish standard APIs.

To install eQuantic.Core.Api, run the following command in the Package Manager Console

Install-Package eQuantic.Core.Api

Example of implementation

The data entities

[Table("orders")]
public class OrderData : EntityDataBase
{
    [Key]
    public string Id { get; set; } = string.Empty;
    public DateTime Date { get; set; }
    
    public virtual ICollection<OrderItemData> Items { get; set; } = new HashSet<OrderItemData>();
}

[Table("orderItems")]
public class OrderItemData : EntityDataBase, IWithReferenceId<OrderItemData, int>
{
    [Key]
    public int Id { get; set; }
    public int OrderId { get; set; }
    
    [ForeignKey(nameof(OrderId))]
    public virtual OrderData? Order { get; set; }
    
    [Required]
    [MaxLength(200)]
    public string Name { get; set; } = string.Empty;
}

The models

public class Order
{
    public string Id { get; set; } = string.Empty;
    public DateTime Date { get; set; }
}

public class OrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }
    public string Name { get; set; } = string.Empty;
}

The request models

public class OrderRequest
{
    public DateTime? Date { get; set; }
}

public class OrderItemRequest
{
    public string? Name { get; set; }
}

The mappers

public class OrderMapper : IMapper<OrderData, Order>, IMapper<OrderRequest, OrderData>
{
    public Order? Map(OrderData? source)
    {
        return Map(source, new Order());
    }

    public Order? Map(OrderData? source, Order? destination)
    {
        if (source == null)
        {
            return null;
        }

        if (destination == null)
        {
            return Map(source);
        }

        destination.Id = source.Id;
        destination.Date = source.Date;

        return destination;
    }

    public OrderData? Map(OrderRequest? source)
    {
        return Map(source, new OrderData());
    }

    public OrderData? Map(OrderRequest? source, OrderData? destination)
    {
        if (source == null)
        {
            return null;
        }

        if (destination == null)
        {
            return Map(source);
        }
        
        destination.Date = source.Date ?? DateTime.UtcNow;

        return destination;
    }
}

The services

public interface IOrderService : IApplicationService
{
    
}

[MapCrudEndpoints]
public class OrderService : IOrderService
{
    private readonly IMapperFactory _mapperFactory;
    private readonly ILogger<ExampleService> _logger;
    private readonly IAsyncQueryableRepository<IQueryableUnitOfWork, OrderData, int> _repository;
    
    public OrderService(
        IApplicationContext<int> applicationContext,
        IQueryableUnitOfWork unitOfWork, 
        IMapperFactory mapperFactory, 
        ILogger<OrderService> logger)
    {
        _mapperFactory = mapperFactory;
        _logger = logger;
        _repository = unitOfWork.GetAsyncQueryableRepository<IQueryableUnitOfWork, OrderData, int>();
    }
    
    public async Task<Order?> GetByIdAsync(int orderId, CancellationToken cancellationToken = default)
    {
        var item = await _repository.GetAsync(orderId, cancellationToken: cancellationToken);

        if (item == null)
        {
            var ex = new EntityNotFoundException<int>(orderId);
            _logger.LogError(ex, "{ServiceName} - GetById: Entity of {EntityName} not found", GetType().Name,
                nameof(OrderData));
            throw ex;
        }

        var mapper = _mapperFactory.GetMapper<OrderData, Order>()!;
        var result = mapper.Map(item);
        
        return result;
    }
}

The Program.cs

var builder = WebApplication.CreateBuilder(args);
var assembly = typeof(Program).Assembly;

builder.Services.AddDbContext<ExampleDbContext>(opt =>
    opt.UseInMemoryDatabase("ExampleDb"));
        
builder.Services.AddQueryableRepositories<ExampleUnitOfWork>(opt =>
{
    opt.FromAssembly(assembly)
        .AddLifetime(ServiceLifetime.Scoped);
});

builder.Services
    .AddMappers(opt => opt.FromAssembly(assembly))
    .AddTransient<IExampleService, ExampleService>()
    .AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
        options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
    })
    .AddFilterModelBinder()
    .AddSortModelBinder();

builder.Services
    .AddEndpointsApiExplorer()
    .AddApiDocumentation(opt => opt.WithTitle("Example API"));

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseApiDocumentation();
}

app.UseHttpsRedirection();
app.UseRouting();
app.MapControllers();
app.MapGet("orders/{id}", GetById);

app.Run();
return;

async Task<Results<Ok<Order>, NotFound>> GetById(
    [FromRoute] int id, 
    [FromServices] IOrderService service, 
    CancellationToken cancellationToken)
{
    var item = await service.GetByIdAsync(id, cancellationToken);
    if (item == null)
        return TypedResults.NotFound();

    return TypedResults.Ok(item);
}

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on eQuantic.Core.Api:

Package Downloads
eQuantic.Core.Api.Crud

eQuantic API CRUD Library

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.7.13 100 11/20/2024
1.7.12 100 11/20/2024
1.7.11 68 11/19/2024
1.7.10 176 11/9/2024
1.7.9 193 10/11/2024
1.7.8 155 10/4/2024
1.7.7 110 10/4/2024
1.7.6 114 10/3/2024
1.7.5 281 9/4/2024
1.7.4 159 9/1/2024
1.7.3 145 8/25/2024
1.7.2 200 7/29/2024
1.7.1 93 7/28/2024
1.7.0 88 7/28/2024
1.6.25 92 7/27/2024
1.6.24 171 7/22/2024
1.6.23 235 6/23/2024
1.6.22 97 6/23/2024
1.6.21 106 6/22/2024
1.6.20 98 6/21/2024
1.6.19 254 5/18/2024
1.6.18 241 5/4/2024
1.6.17 324 4/11/2024
1.6.16 140 4/11/2024
1.6.15 122 4/9/2024
1.6.14 140 4/4/2024
1.6.13 147 4/2/2024
1.6.12 170 3/21/2024
1.6.11 120 3/21/2024
1.6.10 150 3/18/2024
1.6.9 136 3/10/2024
1.6.8 140 2/18/2024
1.6.7 125 2/17/2024
1.6.6 132 2/14/2024
1.6.5 128 2/13/2024
1.6.4 127 2/12/2024
1.6.3 127 2/10/2024
1.6.2 116 2/10/2024
1.6.1 146 1/22/2024
1.6.0 207 12/21/2023
1.5.2 161 12/10/2023
1.5.1 162 12/5/2023
1.5.0 157 12/5/2023
1.4.0 141 12/3/2023
1.3.3 191 11/18/2023
1.3.2 160 11/18/2023
1.3.1 165 11/15/2023
1.3.0 115 11/15/2023
1.2.3 155 11/2/2023
1.2.2 119 11/2/2023
1.2.1 209 10/21/2023
1.2.0 119 10/21/2023
1.1.6 160 10/9/2023
1.1.5 158 10/7/2023
1.1.4 169 10/2/2023
1.1.3 137 10/1/2023
1.1.2 171 9/25/2023
1.1.1 133 9/24/2023
1.1.0 206 9/4/2023
1.0.14 267 8/13/2023
1.0.13 182 8/13/2023
1.0.12 170 8/13/2023
1.0.11 171 8/13/2023
1.0.10 165 8/8/2023
1.0.9 209 8/3/2023
1.0.8 180 7/30/2023
1.0.7 184 7/22/2023
1.0.6 178 7/21/2023
1.0.5 181 7/21/2023
1.0.4 177 7/20/2023
1.0.3 164 7/20/2023
1.0.2 188 7/19/2023
1.0.0.1 177 7/5/2023
1.0.0 154 7/5/2023

Common API implementations