aboutsummaryrefslogtreecommitdiffstats
path: root/routes/requests.ts
diff options
context:
space:
mode:
Diffstat (limited to 'routes/requests.ts')
-rw-r--r--routes/requests.ts85
1 files changed, 85 insertions, 0 deletions
diff --git a/routes/requests.ts b/routes/requests.ts
new file mode 100644
index 00000000..a0d55739
--- /dev/null
+++ b/routes/requests.ts
@@ -0,0 +1,85 @@
+import { fail } from "$lib/utils";
+import { emit } from "$lib/sockets";
+import { g, s, db } from "$lib/db";
+import { v4 } from "uuid";
+
+export default {
+ async get({ params: { id } }, res) {
+ let request = await g(`request:${id}`);
+ if (!request) fail("request not found");
+ request.recipient = await g(`user:${request.recipient_id}`);
+ request.requester = await g(`user:${request.requester_id}`);
+ request.invoice = await g(`invoice:${request.invoice_id}`);
+ res.send({ request });
+ },
+
+ async list({ user: { id } }, res) {
+ try {
+ const day = new Date(new Date().setDate(new Date().getDate() - 1));
+
+ let requests = await db.lRange(`${id}:requests`, 0, -1);
+
+ requests = await Promise.all(requests.map((id) => g(`request:${id}`)));
+
+ requests = await Promise.all(
+ requests.map(async (r) => {
+ r.requester = await g(`user:${r.requester_id}`);
+ r.recipient = await g(`user:${r.recipient_id}`);
+ return r;
+ }),
+ );
+
+ let sent = requests.filter((r) => r.requester_id === id);
+
+ let received = requests
+ .filter((r) => r.recipient_id === id)
+ .filter((r) => !r.invoice_id);
+
+ let invoices = [];
+ for (let r of sent) {
+ if (!r.invoice_id) continue;
+
+ let invoice = await g(`invoice:${r.invoice_id}`);
+ if (!invoice) continue;
+
+ invoice.request = r;
+ if (invoice.amount < invoice.received) invoices.push(invoice);
+ }
+
+ res.send({ invoices, sent, received });
+ } catch (e) {
+ console.log(e);
+ res.code(500).send(e.message);
+ }
+ },
+
+ async create(
+ {
+ body: { recipient, ...params },
+ user: { id: requester_id, username, profile },
+ },
+ res,
+ ) {
+ let recipient_id = await g(`user:${recipient}`);
+
+ let id = v4();
+ let request = {
+ id,
+ recipient_id,
+ requester_id,
+ ...params,
+ };
+
+ await s(`request:${id}`, request);
+ await db.lPush(`${requester_id}:requests`, id);
+ await db.lPush(`${recipient_id}:requests`, id);
+
+ emit(recipient, "request", request);
+ res.send(request);
+ },
+
+ async destroy({ body: { request_id }, user: { id } }, res) {
+ await db.lrem(`user:${id}:requests`, request_id);
+ res.send();
+ },
+};