aboutsummaryrefslogtreecommitdiffstats
path: root/routes/invoices.js
blob: a4fb7be1b28721eca5384abc80e8749ac5a59da4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
const { Op } = require("sequelize");
const axios = require("axios");

app.get(
  "/invoice",
  auth,
  ah(async (req, res, next) => {
    try {
      const invoice = await db.Invoice.findOne({
        where: {
          uuid: req.query.uuid
        }
      });

      res.send(invoice);
    } catch (e) {
      l.error("couldn't find invoice", e);
    }
  })
);

app.post(
  "/invoice",
  ah(async (req, res, next) => {
    try {
      let { invoice, user } = req.body;
      let { blindkey } = invoice;

      if (!user) ({ user } = req);
      else {
        user = await db.User.findOne({
          where: {
            username: user.username
          }
        });
      }
      if (!user) throw new Error("user not provided");
      invoice.user_id = user.id;
      invoice.account_id = user.account_id;

      l.info(
        "creating invoice",
        user.username,
        invoice.network,
        invoice.amount,
        invoice.tip,
        invoice.currency
      );

      if (invoice.network === "liquid" && !invoice.unconfidential) {
        try {
          const { username, password, port, wallet } = config.liquid;
        const { data: { result } }= await axios.post(
          `http://${username}:${password}@127.0.0.1:${port}/wallet/${wallet}`,
          {
            jsonrpc: "1.0",
            id: "curltext",
            method: "getaddressinfo",
            params: [invoice.address]
          }
        );

        invoice.unconfidential = result.unconfidential; 
        } catch(e) {
          l.error("problem getting confidential address info", e.message);
          return res.status(500).send("Problem getting confidential address");
        } 
      }

      if (!invoice.tip) invoice.tip = 0;

      const exists = await db.Invoice.findOne({
        where: {
          [Op.or]: {
            address: invoice.address || "",
            unconfidential: invoice.unconfidential || "",
            text: invoice.text
          }
        }
      });

      invoice = exists
        ? await exists.update(invoice)
        : await db.Invoice.create(invoice);
      addresses[invoice.address] = user.username;
      if (invoice.unconfidential) {
        addresses[invoice.unconfidential] = user.username;
        if (blindkey) await lq.importBlindingKey(invoice.address, blindkey);
      }
      res.send(invoice);
    } catch (e) {
      l.error(e.message, e.stack);
      res.status(500).send(`Problem during invoice creation: ${e.message}`);
    }
  })
);