diff --git a/finnow-api/source/api_mapping.d b/finnow-api/source/api_mapping.d index 4512919..ef3b4b6 100644 --- a/finnow-api/source/api_mapping.d +++ b/finnow-api/source/api_mapping.d @@ -64,6 +64,10 @@ HttpRequestHandler mapApiHandlers(string webOrigin) { a.map(HttpMethod.DELETE, PROFILE_PATH ~ "/vendors/:vendorId:ulong", &handleDeleteVendor); a.map(HttpMethod.GET, PROFILE_PATH ~ "/transactions", &handleGetTransactions); + a.map(HttpMethod.GET, PROFILE_PATH ~ "/transactions/:transactionId:ulong", &handleGetTransaction); + a.map(HttpMethod.POST, PROFILE_PATH ~ "/transactions", &handleAddTransaction); + a.map(HttpMethod.PUT, PROFILE_PATH ~ "/transactions/:transactionId:ulong", &handleUpdateTransaction); + a.map(HttpMethod.DELETE, PROFILE_PATH ~ "/transactions/:transactionId:ulong", &handleDeleteTransaction); import data_api; // Various other data endpoints: diff --git a/finnow-api/source/transaction/api.d b/finnow-api/source/transaction/api.d index fad121c..bd82195 100644 --- a/finnow-api/source/transaction/api.d +++ b/finnow-api/source/transaction/api.d @@ -4,6 +4,7 @@ import handy_http_primitives; import handy_http_data.json; import handy_http_handlers.path_handler; import slf4d; +import std.typecons; import transaction.model; import transaction.data; @@ -15,6 +16,8 @@ import util.money; import util.pagination; import util.data; +// Transactions API + immutable DEFAULT_TRANSACTION_PAGE = PageRequest(1, 10, [Sort("timestamp", SortDir.DESC)]); struct TransactionsListItemAccount { @@ -65,6 +68,49 @@ void handleGetTransactions(ref ServerHttpRequest request, ref ServerHttpResponse writeJsonBody(response, responsePage); } +void handleGetTransaction(ref ServerHttpRequest request, ref ServerHttpResponse response) { + // TODO +} + +struct AddTransactionPayloadLineItem { + long valuePerItem; + ulong quantity; + string description; + Nullable!ulong categoryId; +} + +struct AddTransactionPayload { + string timestamp; + ulong amount; + string currencyCode; + string description; + Nullable!ulong vendorId; + Nullable!ulong categoryId; + Nullable!ulong creditedAccountId; + Nullable!ulong debitedAccountId; + string[] tags; + AddTransactionPayloadLineItem[] lineItems; +} + +void handleAddTransaction(ref ServerHttpRequest request, ref ServerHttpResponse response) { + ProfileDataSource ds = getProfileDataSource(request); + auto payload = readJsonBodyAs!AddTransactionPayload(request); + addTransaction2(ds, payload); +} + +void handleUpdateTransaction(ref ServerHttpRequest request, ref ServerHttpResponse response) { + // TODO +} + +void handleDeleteTransaction(ref ServerHttpRequest request, ref ServerHttpResponse response) { + ProfileDataSource ds = getProfileDataSource(request); + // TODO +} + +private ulong getTransactionIdOrThrow(in ServerHttpRequest request) { + return getPathParamOrThrow(request, "transactionId"); +} + // Vendors API void handleGetVendors(ref ServerHttpRequest request, ref ServerHttpResponse response) { diff --git a/finnow-api/source/transaction/service.d b/finnow-api/source/transaction/service.d index a18d8f6..56b0fb1 100644 --- a/finnow-api/source/transaction/service.d +++ b/finnow-api/source/transaction/service.d @@ -19,6 +19,10 @@ Page!TransactionsListItem getTransactions(ProfileDataSource ds, in PageRequest p return page; // Return an empty page for now! } +void addTransaction2(ProfileDataSource ds, in AddTransactionPayload payload) { + // TODO +} + void addTransaction( ProfileDataSource ds, SysTime timestamp,