ac3f34e4f3
Added .gitignore, solution, and project files for .NET 10. Introduced AGENTS.md and PLAN.md for guidelines and planning. Implemented appsettings.json, launchSettings.json, and MySQL config. Created AppDBContext and all domain models with composite keys. Added IUnitOfWork and EFUnitOfWork. Structured feature folders for Region, Route, Vehicle, Store, Warehouse, and Order with DTOs, repositories, services, and controllers. Added initial EF Core migrations and sample HTTP request. Registered dependencies and enabled OpenAPI in development.
113 lines
3.4 KiB
C#
113 lines
3.4 KiB
C#
using Distribution.Infra.UoW;
|
|
|
|
namespace Distribution.Features.Order;
|
|
|
|
public class OrderService(IOrderRepository repo, IUnitOfWork uow)
|
|
{
|
|
private static OrderResponse ToResponse(Models.Order o, List<Models.OrderItem> items) =>
|
|
new(o.Id, o.OrderDate, o.FK_StoreId, o.TotalAmount,
|
|
items.Select(i => new OrderItemResponse(i.FK_ItemId, i.Quantity)).ToList(),
|
|
o.IsActive, o.CreatedAt);
|
|
|
|
public async Task<List<OrderResponse>> GetAllAsync()
|
|
{
|
|
var orders = (await repo.GetAllAsync()).Where(o => o.IsActive).ToList();
|
|
var result = new List<OrderResponse>();
|
|
foreach (var order in orders)
|
|
{
|
|
var items = await repo.GetItemsByOrderIdAsync(order.Id);
|
|
result.Add(ToResponse(order, items));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public async Task<OrderResponse?> GetByIdAsync(Guid id)
|
|
{
|
|
var order = await repo.GetByIdAsync(id);
|
|
if (order is null || !order.IsActive) return null;
|
|
var items = await repo.GetItemsByOrderIdAsync(id);
|
|
return ToResponse(order, items);
|
|
}
|
|
|
|
public async Task<List<OrderResponse>> GetByStoreIdAsync(Guid storeId)
|
|
{
|
|
var orders = await repo.GetByStoreIdAsync(storeId);
|
|
var result = new List<OrderResponse>();
|
|
foreach (var order in orders)
|
|
{
|
|
var items = await repo.GetItemsByOrderIdAsync(order.Id);
|
|
result.Add(ToResponse(order, items));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public async Task<OrderResponse> CreateAsync(CreateOrderRequest request, CancellationToken ct = default)
|
|
{
|
|
var order = new Models.Order
|
|
{
|
|
FK_StoreId = request.StoreId,
|
|
OrderDate = request.OrderDate,
|
|
TotalAmount = request.TotalAmount
|
|
};
|
|
var orderItems = request.Items.Select(i => new Models.OrderItem
|
|
{
|
|
FK_OrderId = order.Id,
|
|
FK_ItemId = i.ItemId,
|
|
Quantity = i.Quantity
|
|
}).ToList();
|
|
|
|
await uow.BeginAsync(ct);
|
|
try
|
|
{
|
|
await repo.AddAsync(order);
|
|
await repo.AddItemsAsync(orderItems);
|
|
await uow.CommitAsync(ct);
|
|
}
|
|
catch
|
|
{
|
|
await uow.RollbackAsync(ct);
|
|
throw;
|
|
}
|
|
return ToResponse(order, orderItems);
|
|
}
|
|
|
|
public async Task<OrderResponse?> UpdateAsync(Guid id, UpdateOrderRequest request, CancellationToken ct = default)
|
|
{
|
|
var order = await repo.GetByIdAsync(id);
|
|
if (order is null || !order.IsActive) return null;
|
|
order.OrderDate = request.OrderDate;
|
|
order.TotalAmount = request.TotalAmount;
|
|
await uow.BeginAsync(ct);
|
|
try
|
|
{
|
|
repo.Update(order);
|
|
await uow.CommitAsync(ct);
|
|
}
|
|
catch
|
|
{
|
|
await uow.RollbackAsync(ct);
|
|
throw;
|
|
}
|
|
var items = await repo.GetItemsByOrderIdAsync(id);
|
|
return ToResponse(order, items);
|
|
}
|
|
|
|
public async Task<bool> DeleteAsync(Guid id, CancellationToken ct = default)
|
|
{
|
|
var order = await repo.GetByIdAsync(id);
|
|
if (order is null || !order.IsActive) return false;
|
|
await uow.BeginAsync(ct);
|
|
try
|
|
{
|
|
repo.Remove(order);
|
|
await uow.CommitAsync(ct);
|
|
}
|
|
catch
|
|
{
|
|
await uow.RollbackAsync(ct);
|
|
throw;
|
|
}
|
|
return true;
|
|
}
|
|
}
|