finnow/finnow-api/source/transaction/api.d

98 lines
3.4 KiB
D

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);
}