diff options
Diffstat (limited to 'routes/requests.ts')
| -rw-r--r-- | routes/requests.ts | 85 |
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(); + }, +}; |
