Scalable Enterprise Resource Planning API
This project implements a highly scalable Web API using CQRS pattern with MediatR. It isolates domain logic, uses EF Core for infrastructure, and maintains minimal controllers.
[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
private readonly IMediator _mediator;
public OrdersController(IMediator mediator)
{
_mediator = mediator;
}
[HttpGet("{id}")]
public async Task<ActionResult<Order>> GetOrder(Guid id)
{
var result = await _mediator.Send(new GetOrderQuery { OrderId = id });
return result == null ? NotFound() : Ok(result);
}
[HttpPost]
public async Task<ActionResult<Guid>> CreateOrder([FromBody] CreateOrderCommand command)
{
var orderId = await _mediator.Send(command);
return CreatedAtAction(nameof(GetOrder), new { id = orderId }, orderId);
}
}
public class CreateOrderCommand : IRequest<Guid>
{
public string CustomerName { get; set; } = string.Empty;
public decimal TotalAmount { get; set; }
public List<string> Items { get; set; } = new();
}
public class CreateOrderCommandHandler : IRequestHandler<CreateOrderCommand, Guid>
{
private readonly NexusDbContext _context;
public CreateOrderCommandHandler(NexusDbContext context)
{
_context = context;
}
public async Task<Guid> Handle(CreateOrderCommand request, CancellationToken token)
{
var order = new Order
{
Id = Guid.NewGuid(),
CustomerName = request.CustomerName,
TotalAmount = request.TotalAmount,
Status = "Pending",
CreatedAt = DateTime.UtcNow,
Items = request.Items
};
_context.Orders.Add(order);
await _context.SaveChangesAsync(token);
return order.Id;
}
}
public class Order
{
[Key]
public Guid Id { get; set; }
[Required]
[MaxLength(200)]
public string CustomerName { get; set; } = string.Empty;
[Required]
public decimal TotalAmount { get; set; }
public string Status { get; set; } = "Pending";
public DateTime CreatedAt { get; set; }
// Dodana lista przedmiotów, aby zgadzała się ze Swaggerem
public List<string> Items { get; set; } = new();
}
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// Configure CQRS (MediatR)
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()));
// Configure EF Core (SQL Server)
builder.Services.AddDbContext<NexusDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
app.Run();
Below is an interactive mockup of the Swagger UI generated for this API. You can test the endpoints to see how the CQRS commands and queries respond.
OpenAPI specification for the Nexus ERP System.
| Name | Description |
|---|---|
| id * string (uuid) |
The ID of the order to retrieve. |