feat(api,web): retrieve and display transactions
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
namespace FiscalOS.API.Transactions.Get;
|
||||
|
||||
internal static class Endpoint
|
||||
{
|
||||
private const string Route = "/";
|
||||
|
||||
public static RouteHandlerBuilder MapGetEndpoint(this RouteGroupBuilder groupBuilder)
|
||||
{
|
||||
return groupBuilder.MapGet(Route, HandleAsync);
|
||||
}
|
||||
|
||||
private static async Task<IResult> HandleAsync(
|
||||
HttpContext httpContext,
|
||||
PagedQuery pagedQuery,
|
||||
[FromServices] AppDbContext appDbContext,
|
||||
CancellationToken ct
|
||||
)
|
||||
{
|
||||
var pagedQueryValidationResults = pagedQuery.Validate();
|
||||
|
||||
if (pagedQueryValidationResults.Count is not 0)
|
||||
{
|
||||
return Results.ValidationProblem(pagedQueryValidationResults);
|
||||
}
|
||||
|
||||
var userId = httpContext.GetUserId();
|
||||
var query = appDbContext.Transactions
|
||||
.Where(t => t.UserId == userId);
|
||||
|
||||
var transactions = await query
|
||||
.Skip((pagedQuery.PageNumber - 1) * pagedQuery.PageSize)
|
||||
.Take(pagedQuery.PageSize)
|
||||
// TODO: Migrate Date to DateTime
|
||||
// to avoid in-memory sorting
|
||||
.AsAsyncEnumerable()
|
||||
.OrderByDescending(t => t.Date)
|
||||
.ToListAsync(ct);
|
||||
|
||||
var count = await query
|
||||
.Where(t => t.UserId == userId)
|
||||
.CountAsync(ct);
|
||||
|
||||
var transactionDtos = transactions.Select(TransactionDto.From).ToArray();
|
||||
var pagedResponse = PagedResponse<TransactionDto>.From(
|
||||
pagedQuery.PageNumber,
|
||||
pagedQuery.PageSize,
|
||||
count,
|
||||
transactionDtos
|
||||
);
|
||||
|
||||
return Results.Ok(pagedResponse);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using Transaction = FiscalOS.Core.Transactions.Transaction;
|
||||
|
||||
namespace FiscalOS.API.Transactions;
|
||||
|
||||
internal sealed record TransactionDto
|
||||
{
|
||||
public Guid Id { get; init; }
|
||||
public string MerchantName { get; init; } = string.Empty;
|
||||
public decimal Amount { get; init; }
|
||||
public DateTimeOffset Date { get; init; }
|
||||
public string Description { get; init; } = string.Empty;
|
||||
|
||||
[JsonConstructor]
|
||||
private TransactionDto()
|
||||
{
|
||||
}
|
||||
|
||||
public static TransactionDto From(Transaction transaction)
|
||||
{
|
||||
return new TransactionDto
|
||||
{
|
||||
Id = transaction.Id,
|
||||
MerchantName = transaction.MerchantName,
|
||||
Amount = transaction.Amount,
|
||||
Date = transaction.Date,
|
||||
Description = transaction.Description
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,7 @@
|
||||
using FiscalOS.API.Transactions.FireWebhook;
|
||||
using FiscalOS.API.Transactions.Get;
|
||||
using FiscalOS.API.Transactions.Webhook;
|
||||
|
||||
namespace FiscalOS.API.Transactions;
|
||||
|
||||
internal static class TransactionsExtensions
|
||||
@@ -9,13 +13,14 @@ internal static class TransactionsExtensions
|
||||
var transactionsGroup = app.MapGroup(RouteGroupPrefix)
|
||||
.RequireAuthorization();
|
||||
|
||||
transactionsGroup.MapGetEndpoint();
|
||||
transactionsGroup.MapWebhookEndpoint().AllowAnonymous();
|
||||
|
||||
if (app.Environment.IsProduction() is false)
|
||||
{
|
||||
transactionsGroup.MapFireWebhookEndpoint();
|
||||
}
|
||||
|
||||
transactionsGroup.MapWebhookEndpoint().AllowAnonymous();
|
||||
|
||||
return transactionsGroup;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user