aboutsummaryrefslogtreecommitdiffstats
path: root/routes
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2023-01-17 23:19:56 -0800
committerAdam Soltys <[email protected]>2023-01-17 23:19:56 -0800
commitd62cc3b3db7d96ec48b71bb4adff99d134f934d7 (patch)
tree73a553e159ee7253c932373f519bb042b3e850bf /routes
parent33229e38a910e26083175a3e272278745378114c (diff)
downloadcoinos-server-d62cc3b3db7d96ec48b71bb4adff99d134f934d7.tar.gz
coinos-server-d62cc3b3db7d96ec48b71bb4adff99d134f934d7.zip
revert redlock
Diffstat (limited to 'routes')
-rw-r--r--routes/invoices.js2
-rw-r--r--routes/nostr.js4
-rw-r--r--routes/payments.js89
-rw-r--r--routes/requests.js4
-rw-r--r--routes/send.js15
-rw-r--r--routes/users.js1
6 files changed, 88 insertions, 27 deletions
diff --git a/routes/invoices.js b/routes/invoices.js
index 3e43c57c..acd9457e 100644
--- a/routes/invoices.js
+++ b/routes/invoices.js
@@ -58,7 +58,7 @@ export default {
);
await s(`invoice:${hash}`, invoice);
- await db.lpush(`${uid}:invoices`, hash);
+ await db.lPush(`${uid}:invoices`, hash);
if (request_id) {
let request = await g(`request:${request_id}`);
diff --git a/routes/nostr.js b/routes/nostr.js
index bac04810..2900e949 100644
--- a/routes/nostr.js
+++ b/routes/nostr.js
@@ -41,7 +41,7 @@ export default {
await s(`user:${pubkey}`, user);
- let ids = await db.smembers(pubkey);
+ let ids = await db.sMembers(pubkey);
let events = ids.length
? (await db.mget(ids.map(k => "ev:" + k))).map(JSON.parse)
@@ -101,7 +101,7 @@ export default {
async followers({ params: { pubkey } }, res) {
try {
let pubkeys = [
- ...new Set([...(await db.smembers(`${pubkey}:followers`))])
+ ...new Set([...(await db.sMembers(`${pubkey}:followers`))])
];
let followers = [];
diff --git a/routes/payments.js b/routes/payments.js
index 22de79c3..27c8c5de 100644
--- a/routes/payments.js
+++ b/routes/payments.js
@@ -1,16 +1,91 @@
+import config from "$config";
+import store from "$lib/store";
import { emit } from "$lib/sockets";
-import { db, g, s } from "$lib/db";
+import { v4 } from "uuid";
+import { notify } from "$lib/notifications";
+import { db, g, s, t } from "$lib/db";
import { l, err, warn } from "$lib/logging";
import { fail } from "$lib/utils";
import ln from "$lib/ln";
-import sendInternal from "$lib/sendInternal";
import { requirePin } from "$lib/auth";
+import { callWebhook } from "$lib/webhooks";
+
+const { HOSTNAME: hostname } = process.env;
export default {
- async send(req, res) {
- await requirePin(req);
- let payment = await sendInternal(req.body, req.user);
- res.send(payment);
+ async send({ body, user }, res) {
+ let { amount, hash, memo, tip } = body;
+ await requirePin({ body, user });
+ if (!hash) fail("invoice hash required");
+
+ let { id: uid } = user;
+ amount = parseInt(amount);
+
+ if (!amount || amount < 0) fail("Amount must be greater than zero");
+
+ await t(`balance:${uid}`, async (balance) => {
+ await new Promise(r => setTimeout(r, 100));
+ if (balance < amount) fail("Insufficient funds");
+ return balance - amount;
+ });
+
+ let fee = 0;
+ let invoice = await g(`invoice:${hash}`);
+ user = await g(`user:${uid}`);
+
+ await s(`user:${uid}`, user);
+
+ let p1 = {
+ hash,
+ amount: -amount,
+ memo,
+ uid,
+ rate: store.rates[user.currency],
+ currency: user.currency,
+ type: "internal",
+ created: Date.now()
+ };
+
+ await s(`payment:${hash}`, p1);
+ await db.lPush(`${uid}:payments`, hash);
+
+ l("sent internal", user.username, -p1.amount);
+ emit(user.id, "payment", p1);
+
+ ({ uid } = invoice);
+ if (uid !== user.id) {
+ let recipient = await g(`user:${uid}`);
+
+ let p2 = {
+ hash,
+ amount,
+ uid: recipient.id,
+ rate: store.rates[recipient.currency],
+ currency: recipient.currency,
+ memo,
+ type: "internal",
+ with_id: user.id,
+ created: Date.now()
+ };
+
+ let { tip } = invoice;
+ if (tip) {
+ p2.tip = tip;
+ p2.amount -= tip;
+ }
+
+ invoice.received += amount;
+ await s(`invoice:${hash}`, invoice);
+ await s(`payment:${hash}`, p2);
+ await db.lPush(`${recipient.id}:payments`, hash);
+
+ l("received internal", recipient.username, amount);
+ emit(recipient.username, "payment", p2);
+ notify(recipient, `Received ${amount} sats`);
+ callWebhook(invoice, p2);
+ }
+
+ res.send(p1);
},
async list({ user: { id }, query: { start, end, limit, offset } }, res) {
@@ -21,7 +96,7 @@ export default {
// if (start) where.createdAt[Op.gte] = new Date(parseInt(start));
// if (end) where.createdAt[Op.lte] = new Date(parseInt(end));
- let payments = (await db.lrange(`${id}:payments`, 0, -1)) || [];
+ let payments = (await db.lRange(`${id}:payments`, 0, -1)) || [];
payments = await Promise.all(payments.map(hash => g(`payment:${hash}`)));
payments = payments.filter(p => p);
res.send({ payments, total: payments.length });
diff --git a/routes/requests.js b/routes/requests.js
index 8db373dd..79af1fb6 100644
--- a/routes/requests.js
+++ b/routes/requests.js
@@ -15,8 +15,8 @@ export default {
try {
const day = new Date(new Date().setDate(new Date().getDate() - 1));
- let invoices = await db.lrange(`${id}:invoices`, 0, -1);
- let requests = await db.lrange(`${id}:requests`, 0, -1);
+ let invoices = await db.lRange(`${id}:invoices`, 0, -1);
+ let requests = await db.lRange(`${id}:requests`, 0, -1);
res.send({ invoices, requests });
} catch (e) {
diff --git a/routes/send.js b/routes/send.js
deleted file mode 100644
index 4b954616..00000000
--- a/routes/send.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import { err } from "$lib/logging";
-import sendInternal from "$lib/sendInternal";
-import { requirePin } from "$lib/auth";
-
-export default async (req, res, next) => {
- try {
- await requirePin(req);
- let payment = await sendInternal(req.body, req.user);
- res.send(payment);
- } catch (e) {
- console.log(e);
- err("problem sending internal payment", e.message);
- return res.code(500).send(e.message);
- }
-};
diff --git a/routes/users.js b/routes/users.js
index 49aeebd7..57a423b8 100644
--- a/routes/users.js
+++ b/routes/users.js
@@ -19,6 +19,7 @@ export default {
async me({ user }, res) {
try {
user.balance = await g(`balance:${user.id}`);
+ console.log("USER BAL", user.id, user.balance)
res.send(pick(user, whitelist));
} catch (e) {
console.log("problem fetching user", e);