135 lines
4.7 KiB
Zig
135 lines
4.7 KiB
Zig
const endpoints = @import("endpoints.zig");
|
|
|
|
const EndpointsManager = endpoints.EndpointsManager;
|
|
const Request = endpoints.Request;
|
|
const Response = endpoints.Response;
|
|
|
|
const data = @import("data");
|
|
const Payment = data.payments.Payment;
|
|
const PaymentsRepository = data.payments.PaymentsRepository;
|
|
|
|
const std = @import("std");
|
|
const ctx = @import("context");
|
|
const parses = @import("parses");
|
|
const PropertySpec = @import("parses").PropertySpec;
|
|
const DateTime = @import("things").DateTime;
|
|
|
|
pub fn registerEndpoints(get_endpoints: *EndpointsManager, post_endpoints: *EndpointsManager) !void {
|
|
// GET
|
|
try get_endpoints.add("/payments-summary", getSummary);
|
|
try get_endpoints.add("/payments/*", getPaymentsById);
|
|
|
|
// POST
|
|
try post_endpoints.add("/payments", postPayments);
|
|
}
|
|
|
|
fn postPayments(req: *Request, res: *Response) void {
|
|
if (ctx.server_settings.failure)
|
|
return res.withStatus(.service_unavailable).end();
|
|
|
|
if (ctx.server_settings.delay > 0) {
|
|
std.time.sleep(ctx.server_settings.delay * std.time.ns_per_ms);
|
|
}
|
|
|
|
res.withStatus(.unprocessable_entity).withContentType(.json).end();
|
|
|
|
var prop_correlationId = parses.PropertySpec{ .name = "correlationId" };
|
|
var prop_amount = parses.PropertySpec{ .name = "amount" };
|
|
|
|
parses.json(req.body, .{ .properties = &.{ &prop_correlationId, &prop_amount } }) catch {
|
|
return;
|
|
};
|
|
|
|
const payment = Payment{ .id = prop_correlationId.asUuid() catch {
|
|
return res.withContent("{ \"correlationId\" : \"invalid\" }").end();
|
|
}, .amount = prop_amount.asFloat(f64) catch {
|
|
return res.withContent("{ \"amount\" : \"invalid\" }").end();
|
|
}, .requested_at = DateTime.now() };
|
|
|
|
ctx.payments_repository.insert(payment) catch {
|
|
return res.withStatus(.internal_server_error).end();
|
|
};
|
|
|
|
res.withStatus(.created).withContent("confia que vai ser integrado.").withContentType(.html).end();
|
|
}
|
|
|
|
fn getPaymentsById(req: *Request, res: *Response) void {
|
|
if (ctx.server_settings.failure)
|
|
return res.withStatus(.service_unavailable).end();
|
|
|
|
if (ctx.server_settings.delay > 0) {
|
|
std.time.sleep(ctx.server_settings.delay * std.time.ns_per_ms);
|
|
}
|
|
|
|
const template_json_res: []const u8 =
|
|
\\{{
|
|
\\ "correlationId": "{s}",
|
|
\\ "amount": {d:.2},
|
|
\\ "requestedAt" : "{s}",
|
|
\\ "integration_status" : "{s}"
|
|
\\}}
|
|
;
|
|
|
|
res.withStatus(.not_found).end();
|
|
|
|
if (req.path.len < 36) {
|
|
return;
|
|
}
|
|
|
|
const id = req.path[req.path.len - 36 ..];
|
|
|
|
const payment = ctx.payments_repository.findById(id);
|
|
|
|
if (payment == null) return;
|
|
|
|
const dateIso = payment.?.requested_at.toIso();
|
|
|
|
res.withContentFormat(template_json_res, .{ payment.?.id, payment.?.amount, dateIso, payment.?.getIntegrationStatus() }) catch {
|
|
return res.withStatus(.internal_server_error).end();
|
|
};
|
|
|
|
res.withStatus(.ok).withContentType(.json).end();
|
|
}
|
|
|
|
const template_json_summary: []const u8 =
|
|
\\{{
|
|
\\ "default": {{ "totalRequests": "{d}", "totalAmount": {d:.2} }},
|
|
\\ "fallback": {{ "totalRequests": "{d}", "totalAmount": {d:.2} }}
|
|
\\}}
|
|
;
|
|
|
|
fn getSummary(req: *Request, res: *Response) void {
|
|
var from: ?DateTime = null;
|
|
var to: ?DateTime = null;
|
|
|
|
var prop_from = PropertySpec{ .name = "from" };
|
|
var prop_to = PropertySpec{ .name = "to" };
|
|
parses.url_params(req.query, .{ .properties = &.{ &prop_from, &prop_to } });
|
|
|
|
if (prop_from.value_dirty != null)
|
|
from = prop_from.asDateTime() catch {
|
|
return res.withStatus(.bad_request).withContent("query param 'from' is invalid").withContentType(.html).end();
|
|
};
|
|
|
|
if (prop_to.value_dirty != null)
|
|
to = prop_to.asDateTime() catch {
|
|
return res.withStatus(.bad_request).withContent("query param 'to' is invalid").withContentType(.html).end();
|
|
};
|
|
|
|
var summary = ctx.payments_repository.integrationSummary(from, to);
|
|
|
|
const cousin_summary = ctx.summary_exchange.receive(from, to);
|
|
summary.default_total_payments_processed += cousin_summary.default_total_payments_processed;
|
|
summary.default_total_value += cousin_summary.default_total_value;
|
|
summary.fallback_total_payments_processed += cousin_summary.fallback_total_payments_processed;
|
|
summary.fallback_total_value += cousin_summary.fallback_total_value;
|
|
|
|
res.withStatus(.ok).withContentType(.json).withContentFormat(template_json_summary, .{
|
|
summary.default_total_payments_processed,
|
|
summary.default_total_value,
|
|
summary.fallback_total_payments_processed,
|
|
summary.fallback_total_value,
|
|
}) catch {
|
|
return res.withStatus(.internal_server_error).withContentType(.none).end();
|
|
};
|
|
}
|