module transaction.api; import handy_httpd; import transaction.model; import transaction.data; import transaction.service; import profile.data; import profile.service; import util.json; import util.money; import util.pagination; immutable DEFAULT_TRANSACTION_PAGE = PageRequest(0, 10, [Sort("created_at", SortDir.DESC)]); void getTransactions(ref HttpRequestContext ctx) { ProfileDataSource ds = getProfileDataSource(ctx); PageRequest pr = PageRequest.parse(ctx, DEFAULT_TRANSACTION_PAGE); Page!Transaction page = searchTransactions(ds, pr); } void getVendors(ref HttpRequestContext ctx) { ProfileDataSource ds = getProfileDataSource(ctx); auto vendorRepo = ds.getTransactionVendorRepository(); TransactionVendor[] vendors = vendorRepo.findAll(); writeJsonBody(ctx, vendors); } void getVendor(ref HttpRequestContext ctx) { long vendorId = ctx.request.getPathParamAs!long("vendorId", -1); if (vendorId == -1) { ctx.response.status = HttpStatus.NOT_FOUND; ctx.response.writeBodyString("Missing vendorId path parameter."); return; } ProfileDataSource ds = getProfileDataSource(ctx); auto vendorRepo = ds.getTransactionVendorRepository(); TransactionVendor vendor = vendorRepo.findById(vendorId) .orElseThrow(() => new HttpStatusException(HttpStatus.NOT_FOUND)); writeJsonBody(ctx, vendor); } struct VendorPayload { string name; string description; } void createVendor(ref HttpRequestContext ctx) { VendorPayload payload = readJsonPayload!VendorPayload(ctx); ProfileDataSource ds = getProfileDataSource(ctx); auto vendorRepo = ds.getTransactionVendorRepository(); if (vendorRepo.existsByName(payload.name)) { ctx.response.status = HttpStatus.BAD_REQUEST; ctx.response.writeBodyString("Vendor name is already in use."); return; } TransactionVendor vendor = vendorRepo.insert(payload.name, payload.description); writeJsonBody(ctx, vendor); } void updateVendor(ref HttpRequestContext ctx) { VendorPayload payload = readJsonPayload!VendorPayload(ctx); long vendorId = ctx.request.getPathParamAs!long("vendorId", -1); if (vendorId == -1) { ctx.response.status = HttpStatus.NOT_FOUND; ctx.response.writeBodyString("Missing vendorId path parameter."); return; } ProfileDataSource ds = getProfileDataSource(ctx); auto vendorRepo = ds.getTransactionVendorRepository(); TransactionVendor existingVendor = vendorRepo.findById(vendorId) .orElseThrow(() => new HttpStatusException(HttpStatus.NOT_FOUND)); if (payload.name != existingVendor.name && vendorRepo.existsByName(payload.name)) { ctx.response.status = HttpStatus.BAD_REQUEST; ctx.response.writeBodyString("Vendor name is already in use."); } TransactionVendor updated = vendorRepo.updateById( vendorId, payload.name, payload.description ); writeJsonBody(ctx, updated); } void deleteVendor(ref HttpRequestContext ctx) { long vendorId = ctx.request.getPathParamAs!long("vendorId", -1); if (vendorId == -1) { ctx.response.status = HttpStatus.NOT_FOUND; ctx.response.writeBodyString("Missing vendorId path parameter."); return; } ProfileDataSource ds = getProfileDataSource(ctx); auto vendorRepo = ds.getTransactionVendorRepository(); vendorRepo.deleteById(vendorId); }