From a4cccc51652405d6c3d2b6edd2dba5627c3535ba Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Thu, 13 Oct 2022 18:05:49 -0700 Subject: tickets --- lib/redis.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 lib/redis.js (limited to 'lib') diff --git a/lib/redis.js b/lib/redis.js new file mode 100644 index 00000000..98a71856 --- /dev/null +++ b/lib/redis.js @@ -0,0 +1,11 @@ +import { createClient } from "redis"; + +const redis = createClient({ + url: "redis://redis", +}); + +redis.on("error", (err) => console.log("redis error", err)); + +await redis.connect(); + +export default redis; -- cgit v1.2.3 From aec345fd11fd85ff74d435d338482d595f3de5be Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Mon, 17 Oct 2022 13:31:59 -0700 Subject: process uploads to webp --- Dockerfile | 4 +- lib/upload.js | 14 +++-- package.json | 1 + pnpm-lock.yaml | 182 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 194 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/Dockerfile b/Dockerfile index c8e21c70..f29b9a18 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,9 +3,7 @@ FROM node:alpine ARG NODE_ENV=production ENV NODE_ENV $NODE_ENV -RUN apk update -RUN apk add inotify-tools -RUN apk add --update npm +RUN apk add --update inotify-tools npm vips-dev RUN npm i -g pnpm COPY . /app diff --git a/lib/upload.js b/lib/upload.js index a91e4eba..8d1c85ef 100644 --- a/lib/upload.js +++ b/lib/upload.js @@ -7,6 +7,8 @@ import pump from "pump"; import Clone from "readable-stream-clone"; import fs from "fs"; import path from "path"; +import sharp from "sharp"; +import { pipeline } from "stream"; app.register(fastifyMultipart); @@ -30,12 +32,16 @@ app.post("/upload/:type", auth, async function(req, res) { if (format !== "image" && !["jpg", "jpeg", "png"].includes(ext)) throw new Error("unsupported file type"); - let name = `${req.user.username}-${type}.png`; + let name = `${req.user.username}-${type}.webp`; let path = `/app/uploads/${name}`; + let size = type === "banner" ? 1920 : 240; - await new Promise(resolve => - s2.pipe(fs.createWriteStream(path).on("finish", resolve)) - ); + let t = sharp() + .rotate() + .resize(size) + .webp(); + + await new Promise(r => pipeline(s2, t, fs.createWriteStream(path), r)); req.user[type] = true; await req.user.save(); diff --git a/package.json b/package.json index 93810935..e198de32 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "query-string": "^6.13.1", "readable-stream-clone": "^0.0.7", "redis": "^4.3.1", + "sharp": "^0.31.1", "sqlite3": "^5.0.11", "tiny-secp256k1": "^2.1.2", "uuid": "8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9af0ce31..e036a7c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,6 +54,7 @@ specifiers: query-string: ^6.13.1 readable-stream-clone: ^0.0.7 redis: ^4.3.1 + sharp: ^0.31.1 sqlite3: ^5.0.11 tiny-secp256k1: ^2.1.2 uuid: '8' @@ -115,6 +116,7 @@ dependencies: query-string: 6.14.1 readable-stream-clone: 0.0.7 redis: 4.3.1 + sharp: 0.31.1 sqlite3: 5.1.2 tiny-secp256k1: 2.2.1 uuid: 8.3.2 @@ -962,6 +964,14 @@ packages: wif: 2.0.6 dev: false + /bl/4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + /blech32/1.1.2: resolution: {integrity: sha512-C5qxzoF9KyX88X8Zz18cZ6BOeL0n5/Eg/cDot1frntkArRMwg1djNim5wA6QFWwu0lJ1LN8iiRMN4Lp2kZzdfA==} engines: {node: '>=10'} @@ -1118,6 +1128,13 @@ packages: resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} dev: false + /buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /buffer/6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: @@ -1210,6 +1227,10 @@ packages: fsevents: 2.3.2 dev: false + /chownr/1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + /chownr/2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -1280,11 +1301,26 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false + /color-string/1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + /color-support/1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true dev: false + /color/4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + /colorette/2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: false @@ -1495,6 +1531,18 @@ packages: engines: {node: '>=0.10'} dev: false + /decompress-response/6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-extend/0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: false @@ -1721,6 +1769,11 @@ packages: engines: {node: '>=0.8.x'} dev: false + /expand-template/2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + /express-async-handler/1.2.0: resolution: {integrity: sha512-rCSVtPXRmQSW8rmik/AIb2P0op6l7r1fMW538yyvTMltCO4xQEWMmobfrIxN2V1/mVrgxB8Az3reYF6yUZw37w==} dev: false @@ -2017,6 +2070,10 @@ packages: engines: {node: '>= 0.6'} dev: false + /fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + /fs-minipass/2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -2124,6 +2181,10 @@ packages: resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} dev: false + /github-from-package/0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2414,6 +2475,10 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + /interpret/2.2.0: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} engines: {node: '>= 0.10'} @@ -2448,6 +2513,10 @@ packages: engines: {node: '>= 0.10'} dev: false + /is-arrayish/0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + /is-binary-path/2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -2896,6 +2965,11 @@ packages: hasBin: true dev: false + /mimic-response/3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + /minimalistic-assert/1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: false @@ -2980,6 +3054,10 @@ packages: yallist: 4.0.0 dev: false + /mkdirp-classic/0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + /mkdirp/1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -3052,6 +3130,10 @@ packages: resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} dev: false + /napi-build-utils/1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -3066,6 +3148,13 @@ packages: engines: {node: '>= 0.4.0'} dev: false + /node-abi/3.26.0: + resolution: {integrity: sha512-jRVtMFTChbi2i/jqo/i2iP9634KMe+7K1v35mIdj3Mn59i5q27ZYhn+sW6npISM/PQg7HrP2kwtRBMmh5Uvzdg==} + engines: {node: '>=10'} + dependencies: + semver: 7.3.8 + dev: false + /node-addon-api/2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} dev: false @@ -3446,6 +3535,25 @@ packages: - debug dev: false + /prebuild-install/7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.7 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.26.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + /prelude-ls/1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -3658,6 +3766,16 @@ packages: unpipe: 1.0.0 dev: false + /rc/1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.7 + strip-json-comments: 2.0.1 + dev: false + /readable-stream-clone/0.0.7: resolution: {integrity: sha512-mdkQtdg5elliOR64xcHVMkghSHQGjpsdCFAs6fSe28wTaVypR0GywmK5ndKpOSQzzuNpSrzC12Rv9UEkDLX73A==} dev: false @@ -3973,6 +4091,21 @@ packages: safe-buffer: 5.2.1 dev: false + /sharp/0.31.1: + resolution: {integrity: sha512-GR8M1wBwOiFKLkm9JPun27OQnNRZdHfSf9VwcdZX6UrRmM1/XnOrLFTF0GAil+y/YK4E6qcM/ugxs80QirsHxg==} + engines: {node: '>=14.15.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.1 + node-addon-api: 5.0.0 + prebuild-install: 7.1.1 + semver: 7.3.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -3985,6 +4118,24 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: false + /simple-concat/1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get/4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-swizzle/0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + /simple-update-notifier/1.0.7: resolution: {integrity: sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==} engines: {node: '>=8.10.0'} @@ -4181,6 +4332,11 @@ packages: ansi-regex: 5.0.1 dev: false + /strip-json-comments/2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -4206,6 +4362,26 @@ packages: engines: {node: '>= 0.4'} dev: false + /tar-fs/2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream/2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + /tar/6.1.11: resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} engines: {node: '>= 10'} @@ -4320,6 +4496,12 @@ packages: engines: {node: '>=0.6.x'} dev: false + /tunnel-agent/0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /type-check/0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} -- cgit v1.2.3 From 14b363bcfcfdd03f2232c2d0779ee90fc5cc27e6 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Tue, 18 Oct 2022 21:00:50 -0700 Subject: improve asset issuance to internal user --- docker-compose.yml | 5 ++ lib/sockets.js | 1 + routes/assets.js | 116 ++++++++++++++++++++++++++++---------------- routes/lightning/receive.js | 1 - routes/liquid/receive.js | 19 +++----- routes/tickets.js | 7 ++- 6 files changed, 92 insertions(+), 57 deletions(-) (limited to 'lib') diff --git a/docker-compose.yml b/docker-compose.yml index 8261d746..4d1a89d9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -179,6 +179,11 @@ services: networks: default: ipv4_address: 172.18.0.32 + redis: + container_name: redis + image: redis + volumes: + - ./config/redis:/data networks: default: name: net diff --git a/lib/sockets.js b/lib/sockets.js index a8428d2f..22072dd0 100644 --- a/lib/sockets.js +++ b/lib/sockets.js @@ -115,6 +115,7 @@ app.register(async function(app) { names[id] = username; let user = await getUser(username); + if (user.locked) throw new Error("Account is locked"); let payments = await user.getPayments({ where: { diff --git a/routes/assets.js b/routes/assets.js index ecc44d84..de539946 100644 --- a/routes/assets.js +++ b/routes/assets.js @@ -120,7 +120,7 @@ app.post("/assets", auth, async (req, res) => { l( "attempting issuance", req.user.username, - contract, + JSON.stringify(contract), "address", address, "pubkey", @@ -177,6 +177,7 @@ app.post("/assets", auth, async (req, res) => { as: "user" }, order: [["balance", "DESC"]], + lock: transaction.LOCK.UPDATE, transaction }); @@ -199,23 +200,51 @@ app.post("/assets", auth, async (req, res) => { await account.reload({ transaction }); emit(user.username, "account", account); + let invoice; + let recipient = user; + if (address) { + invoice = await db.Invoice.findOne({ + where: { address }, + include: { + model: db.User, + as: "user" + } + }); + recipient = invoice.user; + } + + if (!invoice) { + invoice = await db.Invoice.create( + { + account_id: account.id, + user_id, + amount: Math.round(params.asset_amount * SATS), + address: asset_address, + currency: user.currency, + rate: store.rates[user.currency], + network: "liquid" + }, + { transaction } + ); + } + account = await db.Account.create( { asset, contract, domain, - user_id, + user_id: invoice.user_id, ticker, precision, name, balance: 0, network: "liquid", - pending: address ? 0 : Math.round(params.asset_amount * SATS) + pending: Math.round(params.asset_amount * SATS) }, { transaction } ); - emit(user.username, "account", account); + emit(recipient.username, "account", account); l( "issued asset", user.username, @@ -225,24 +254,11 @@ app.post("/assets", auth, async (req, res) => { account.id ); - const { id: invoice_id } = await db.Invoice.create( - { - account_id: account.id, - user_id, - amount: Math.round(params.asset_amount * SATS), - address: asset_address, - currency: user.currency, - rate: store.rates[user.currency], - network: "liquid" - }, - { transaction } - ); - const asset_payment = await db.Payment.create( { account_id: account.id, - user_id, - invoice_id, + user_id: invoice.user_id, + invoice_id: invoice.id, hash: txid, amount: Math.round(params.asset_amount * SATS), received: true, @@ -252,14 +268,14 @@ app.post("/assets", auth, async (req, res) => { }, { transaction } ); - emit(user.username, "payment", asset_payment); + emit(recipient.username, "payment", asset_payment); - if (address) { + if (invoice.user_id !== user.id) { const asset_send = await db.Payment.create( { account_id: account.id, user_id, - invoice_id, + invoice_id: invoice.id, hash: txid, amount: -Math.round(params.asset_amount * SATS), received: false, @@ -269,7 +285,7 @@ app.post("/assets", auth, async (req, res) => { }, { transaction } ); - emit(user.username, "payment", asset_send); + emit(recipient.username, "payment", asset_send); } store.issuances[txid] = { @@ -280,10 +296,39 @@ app.post("/assets", auth, async (req, res) => { }; if (token_amount) { + invoice = null; + recipient = user; + + if (address) { + invoice = await db.Invoice.findOne({ + where: { address }, + include: { + model: db.User, + as: "user" + } + }); + recipient = invoice.user; + } + + if (!invoice) { + invoice = await db.Invoice.create( + { + account_id: account.id, + user_id, + amount: Math.round(params.token_amount * SATS), + address: token_address, + currency: user.currency, + rate: store.rates[user.currency], + network: "liquid" + }, + { transaction } + ); + } + account = await db.Account.create( { asset: token, - user_id, + user_id: invoice.user_id, domain, ticker: `${ticker}REISSUANCETOKEN`, precision: 8, @@ -293,24 +338,12 @@ app.post("/assets", auth, async (req, res) => { }, { transaction } ); - emit(user.username, "account", account); - - const { id: invoice_id } = await db.Invoice.create( - { - account_id: account.id, - user_id, - amount: Math.round(params.asset_amount * SATS), - address: asset_address, - currency: user.currency, - rate: store.rates[user.currency], - network: "liquid" - }, - { transaction } - ); + emit(recipient.username, "account", account); const token_payment = await db.Payment.create( { account_id: account.id, + invoice_id: invoice.id, user_id, hash: txid, amount: Math.round(token_amount * SATS), @@ -321,12 +354,13 @@ app.post("/assets", auth, async (req, res) => { }, { transaction } ); - emit(user.username, "payment", token_payment); + emit(recipient.username, "payment", token_payment); - if (address) { + if (invoice.user_id !== user.id) { const token_send = await db.Payment.create( { account_id: account.id, + invoice_id: invoice.id, user_id, hash: txid, amount: -Math.round(token_amount * SATS), @@ -337,7 +371,7 @@ app.post("/assets", auth, async (req, res) => { }, { transaction } ); - emit(user.username, "payment", token_send); + emit(recipient.username, "payment", token_send); } store.issuances[txid].token = token; diff --git a/routes/lightning/receive.js b/routes/lightning/receive.js index 97c4b47f..f4a20a59 100644 --- a/routes/lightning/receive.js +++ b/routes/lightning/receive.js @@ -143,7 +143,6 @@ if (config.lna.clightning) { msatoshi_received, payment_preimage: secret } = await ln.waitanyinvoice(i); - console.log("um"); let settled = status === "paid"; let received = parseInt(msatoshi_received / 1000); diff --git a/routes/liquid/receive.js b/routes/liquid/receive.js index 2f90af5e..718feba5 100644 --- a/routes/liquid/receive.js +++ b/routes/liquid/receive.js @@ -58,10 +58,8 @@ const getAccount = async (params, transaction) => { params.seed = nc.seed; } - const assets = assets; - - if (assets[asset]) { - ({ domain, ticker, precision, name } = assets[asset]); + if (store.assets[asset]) { + ({ domain, ticker, precision, name } = store.assets[asset]); } else { const existing = await db.Account.findOne({ where: { @@ -149,13 +147,14 @@ zmqRawTx.on("message", async (topic, message, sequence) => { let account = await db.Account.findOne({ where: { - id: invoice.account_id + id: invoice.account_id, + asset }, lock: transaction.LOCK.UPDATE, transaction }); - if (!(account && account.asset === asset)) { + if (!account) { let pubkey = account ? account.pubkey : null; account = await getAccount( @@ -371,13 +370,7 @@ setInterval(async () => { emit(user.username, "account", account); emit(user.username, "payment", p); - l( - "liquid confirmed", - user.username, - account.asset, - p.amount, - p.tip - ); + l("liquid confirmed", user.username, account.asset, p.amount, p.tip); notify(user, `${total} SAT payment confirmed`); callWebhook(p.invoice, p); diff --git a/routes/tickets.js b/routes/tickets.js index 0334c2c6..7ca56740 100644 --- a/routes/tickets.js +++ b/routes/tickets.js @@ -6,13 +6,16 @@ app.get("/ticket", async (req, res) => { res.send({ ticket: await redis.lLen("tickets") }); }); +app.get("/tickets", async (req, res) => { + res.send(await redis.lRange("tickets", 0, -1)); +}); + app.post("/ticket", auth, async (req, res) => { try { let { asset } = req.body; if (!asset || asset.length !== 64) throw new Error("invalid asset"); - await redis.lPush("tickets", req.body.asset); - res.send(await redis.lPush("tickets", req.body.asset)); + res.send(await redis.rPush("tickets", req.body.asset)); } catch (e) { res.code(500).send(e.message); } -- cgit v1.2.3