Compare commits

...
37 Commits
Author SHA1 Message Date
Chris Troutner 4ed9994414 Merge pull request #52 from Permissionless-Software-Foundation/ct-unstable
several little tweeks
2022-10-01 22:44:58 -07:00
Chris Troutner c289e82b0e fix(scripts): Coverting scripts to ES6 2022-10-01 15:58:36 -07:00
Chris Troutner 84210d07c4 Merge branch 'ct-unstable' of https://github.com/Permissionless-Software-Foundation/bch-dex into ct-unstable 2022-10-01 15:44:51 -07:00
Chris Troutner 6d285c77cd fix(RPi): Updating docker images 2022-10-01 15:43:49 -07:00
Chris Troutner 7cefbd71ef fix(ipfs): Adding gateway setting to config 2022-10-01 14:20:37 -07:00
Chris Troutner 85d6aa7d46 Updating package.json to reflect major release 2022-10-01 13:17:30 -07:00
Chris Troutner aaee25389f Merge pull request #51 from Permissionless-Software-Foundation/ct-unstable
fix(docker): Updating docker image. Bumping to v2
2022-10-01 13:12:48 -07:00
Chris Troutner ce83ddcadf fix(docker): Updating docker image. Bumping to v2 2022-10-01 13:10:21 -07:00
Chris Troutner 1b961905e0 Merge pull request #50 from Permissionless-Software-Foundation/ct-unstable
Syncing with upstream. Converting from CommonJS to ES6
2022-10-01 13:02:35 -07:00
Chris Troutner e757bd0fe0 Updating p2wdb image 2022-10-01 13:00:22 -07:00
Chris Troutner 3da78ce46b fix(ES6): Synced with upstream, converted from CommonJS to ES6 2022-10-01 12:16:14 -07:00
Chris Troutner c9d1d79e11 linting 2022-10-01 11:40:41 -07:00
Chris Troutner ce118069eb Syncing with upstream. Fixing merge conflicts, converting to ES6 2022-10-01 11:40:26 -07:00
Chris Troutner f8dce21d95 fix(dex-ui): Updating docker image for rpi 2022-09-27 17:56:12 -07:00
Chris Troutner e8104a8a12 Merge pull request #49 from Permissionless-Software-Foundation/ct-unstable
fix(production): Updating docker container
2022-09-19 19:34:35 -07:00
Chris Troutner 2c43793bf2 fix(production): Updating docker container 2022-09-19 19:28:21 -07:00
Chris Troutner c13a5d1593 Merge pull request #101 from Permissionless-Software-Foundation/ct-unstable
Increased test coverage to 100%
2022-09-17 15:24:26 -07:00
Chris Troutner 6d7b3db370 Using latest version of ipfs-coord-esm 2022-09-17 15:19:37 -07:00
Chris Troutner 33d06e99e8 fix(tests): got ipfs-coord lib to 100% test coverage 2022-09-17 14:51:57 -07:00
Chris Troutner 3203e56a4d fix(tests): Added user e2e tests back in 2022-09-17 14:47:17 -07:00
Chris Troutner ff47f1b356 fix(test): Got use cases to 100% test coverage 2022-09-17 14:23:46 -07:00
Chris Troutner d9377ea78b fix(tests): Increased coverage of REST API validators 2022-09-17 14:18:16 -07:00
Chris Troutner d266bcc54b fix(deps): Updating dependencies 2022-09-17 10:10:39 -07:00
Chris Troutner a033fb1042 fix(tests): Replacing nyc with c8, for test coverage of ESM 2022-09-16 08:38:53 -07:00
Chris Troutner b0eda392a6 Merge pull request #48 from Permissionless-Software-Foundation/ct-unstable
Better error handling for tokens without mutable data
2022-09-14 06:29:01 -07:00
Chris Troutner f81d6853fc Merge branch 'ct-unstable' of https://github.com/Permissionless-Software-Foundation/bch-dex into ct-unstable 2022-09-14 06:26:20 -07:00
Chris Troutner 02a889385d fix(offer): Better error handling for tokens without mutable data 2022-09-14 06:26:12 -07:00
Chris Troutner f17b21bee8 fixing typo 2022-09-13 15:37:57 -07:00
Chris Troutner 78b9e4fcb1 fix(rpi-docker): Updating docker images 2022-09-13 15:34:50 -07:00
Chris Troutner eb1bee1b61 fix(docker): Updating docker images 2022-09-13 15:10:03 -07:00
Chris Troutner 611c2d1631 Merge pull request #47 from Permissionless-Software-Foundation/ct-unstable
feat(nsfw): Detecting tokens marked NSFW in the mutable data
2022-09-13 14:17:12 -07:00
Chris Troutner cb9f5af62e feat(nsfw): Detecting tokens marked NSFW in the mutable data 2022-09-13 13:40:01 -07:00
Chris Troutner 569dcbd576 Merge pull request #100 from Permissionless-Software-Foundation/ct-unstable
fix(ipfs-coord): Updating to new version to fix bugs
2022-09-08 09:32:01 -07:00
Chris Troutner b0a2d73540 fix(ipfs-coord): Updating to new version to fix bugs 2022-09-08 09:30:21 -07:00
Chris Troutner 0d4c8cd56e Merge pull request #99 from Permissionless-Software-Foundation/ct-unstable
Breaking change: Converted from CommonJS to ESM
2022-09-08 09:00:19 -07:00
Chris Troutner b37dae60d1 fix(ESM): Converted from CommonJS to ESM 2022-09-08 08:59:03 -07:00
Chris Troutner 448b028bb4 fixed linting issue 2022-09-08 08:58:39 -07:00
155 changed files with 3019 additions and 8939 deletions
+20 -24
View File
@@ -8,31 +8,26 @@
*/
// npm libraries
const Koa = require('koa')
const bodyParser = require('koa-bodyparser')
const convert = require('koa-convert')
const logger = require('koa-logger')
const mongoose = require('mongoose')
const session = require('koa-generic-session')
const passport = require('koa-passport')
const mount = require('koa-mount')
const serve = require('koa-static')
const cors = require('kcors')
import Koa from 'koa'
import bodyParser from 'koa-bodyparser'
import convert from 'koa-convert'
import logger from 'koa-logger'
import mongoose from 'mongoose'
import session from 'koa-generic-session'
import passport from 'koa-passport'
import mount from 'koa-mount'
import serve from 'koa-static'
import cors from 'kcors'
// Local libraries
const config = require('../config') // this first.
const AdminLib = require('../src/adapters/admin')
// const adminLib = new AdminLib()
import config from '../config/index.js' // this first.
// const WebHookLib = require('../src/adapters/webhook')
// const webhookLib = new WebHookLib()
// const JSONRPC = require('../src/rpc')
// const rpc = new JSONRPC()
const errorMiddleware = require('../src/controllers/rest-api/middleware/error')
// const { wlogger } = require('../src/adapters/wlogger')
const Controllers = require('../src/controllers')
import AdminLib from '../src/adapters/admin.js'
import errorMiddleware from '../src/controllers/rest-api/middleware/error.js'
// import wlogger from '../src/adapters/wlogger.js'
import Controllers from '../src/controllers/index.js'
import { applyPassportMods } from '../config/passport.js'
class Server {
constructor () {
@@ -81,7 +76,8 @@ class Server {
app.use(mount('/logs', serve(`${process.cwd()}/config/logs`)))
// User Authentication
require('../config/passport')
// require('../config/passport')
applyPassportMods(passport)
app.use(passport.initialize())
app.use(passport.session())
@@ -161,4 +157,4 @@ class Server {
}
}
module.exports = Server
export default Server
+13 -3
View File
@@ -5,15 +5,22 @@
/* eslint no-unneeded-ternary:0 */
// Hack to get __dirname back.
// https://blog.logrocket.com/alternatives-dirname-node-js-es-modules/
import * as url from 'url'
// Get the version from the package.json file.
const pkgInfo = require('../../package.json')
import { readFileSync } from 'fs'
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
const pkgInfo = JSON.parse(readFileSync(`${__dirname.toString()}/../../package.json`))
const version = pkgInfo.version
const ipfsCoordName = process.env.COORD_NAME
? process.env.COORD_NAME
: 'ipfs-torlist-service-generic'
module.exports = {
export default {
// Configure TCP port.
port: process.env.PORT || 5700,
@@ -106,5 +113,8 @@ module.exports = {
? parseInt(process.env.IPFS_API_PORT)
: 5001,
chatPubSubChan: 'psf-ipfs-chat-001'
chatPubSubChan: 'psf-ipfs-chat-001',
// IPFS gateway
ipfsGateway: process.env.IPFS_GATEWAY ? process.env.IPFS_GATEWAY : 'https://p2wdb-gateway.fullstack.cash/ipfs/'
}
+1 -1
View File
@@ -4,7 +4,7 @@
specified.
*/
module.exports = {
export default {
session: 'secret-boilerplate-token',
token: 'secret-jwt-token',
database: 'mongodb://localhost:27017/bch-swap-service-dev',
+1 -1
View File
@@ -7,7 +7,7 @@
so as not to conflict with the default host port of 27017 for MongoDB.
*/
module.exports = {
export default {
session: 'secret-boilerplate-token',
token: 'secret-jwt-token',
// database: 'mongodb://172.17.0.1:5555/ipfs-service-prod',
+1 -1
View File
@@ -4,7 +4,7 @@
This is the environment run by the test suite.
*/
module.exports = {
export default {
session: 'secret-boilerplate-token',
token: 'secret-jwt-token',
database: 'mongodb://localhost:27017/bch-swap-service-test',
+18 -3
View File
@@ -1,6 +1,21 @@
const common = require('./env/common')
import common from './env/common.js'
import development from './env/development.js'
import production from './env/production.js'
import test from './env/test.js'
const env = process.env.BCH_DEX || 'development'
const config = require(`./env/${env}`)
console.log(`Loading config for this environment: ${env}`)
module.exports = Object.assign({}, common, config)
let config = development
if (env === 'test') {
config = test
} else if (env === 'prod') {
config = production
}
// const importStr = `./env/${env}.js`
// console.log('importStr: ', importStr)
// import config from importStr
export default Object.assign({}, common, config)
+34 -28
View File
@@ -1,30 +1,6 @@
const passport = require('koa-passport')
const User = require('../src/adapters/localdb/models/users')
const Strategy = require('passport-local')
passport.serializeUser((user, done) => {
done(null, user.id)
})
passport.deserializeUser(async (id, done) => {
try {
const user = await User.findById(id, '-password')
done(null, user)
} catch (err) {
done(err)
}
})
passport.use(
'local',
new Strategy(
{
usernameField: 'email',
passwordField: 'password'
},
passportCallback
)
)
// import passport from 'koa-passport';
import User from '../src/adapters/localdb/models/users.js'
import Strategy from 'passport-local'
async function passportCallback (email, password, done) {
try {
@@ -49,5 +25,35 @@ async function passportCallback (email, password, done) {
}
}
function applyPassportMods (passport) {
passport.serializeUser((user, done) => {
done(null, user.id)
})
passport.deserializeUser(async (id, done) => {
try {
const user = await User.findById(id, '-password')
done(null, user)
} catch (err) {
done(err)
}
})
passport.use(
'local',
new Strategy(
{
usernameField: 'email',
passwordField: 'password'
},
passportCallback
)
)
return true
}
// For testing
module.exports = { passport, passportCallback }
// export default { passport, passportCallback };
// export default applyPassportMods
export { applyPassportMods, passportCallback }
+1 -1
View File
@@ -1,4 +1,4 @@
const Server = require('./bin/server.js')
import Server from './bin/server.js'
const server = new Server()
server.startServer()
+1584 -8133
View File
File diff suppressed because it is too large Load Diff
+9 -10
View File
@@ -1,20 +1,21 @@
{
"name": "bch-dex",
"version": "1.0.0",
"version": "2.0.2",
"description": "A DEX on BCH for trading SLP tokens.",
"main": "index.js",
"type": "module",
"scripts": {
"start": "node index.js",
"test": "npm run test:all",
"test:all": "export BCH_DEX=test && nyc --reporter=text mocha --exit --timeout 30000 --recursive test/unit test/e2e/automated/",
"test:all": "export BCH_DEX=test && c8 --reporter=text mocha --exit --timeout 15000 --recursive test/unit test/e2e/automated/",
"test:unit": "export BCH_DEX=test && mocha --exit --timeout 15000 --recursive test/unit/",
"test:e2e:auto": "export BCH_DEX=test && mocha --exit --timeout 30000 test/e2e/automated/",
"test:integration": "export BCH_DEX=test && mocha --exit --timeout 45000 --recursive test/integration",
"test:temp": "export BCH_DEX=test && mocha --exit --timeout 15000 -g '#rate-limit' test/unit/json-rpc/",
"lint": "standard --env mocha --fix",
"docs": "./node_modules/.bin/apidoc -i src/ -o docs",
"coverage": "nyc report --reporter=text-lcov | coveralls",
"coverage:report": "export BCH_DEX=test && nyc --reporter=html mocha --exit --timeout 15000 --recursive test/unit/ test/e2e/automated/"
"coverage": "c8 report --reporter=text-lcov | coveralls",
"coverage:report": "export BCH_DEX=test && c8 --reporter=html mocha --exit --timeout 15000 --recursive test/unit/ test/e2e/automated/"
},
"author": "Chris Troutner <chris.troutner@gmail.com>",
"contributors": [
@@ -27,15 +28,13 @@
},
"repository": "Permissionless-Software-Foundation/bch-dex",
"dependencies": {
"@psf/bch-js": "6.4.5",
"axios": "0.27.2",
"bch-message-lib": "2.2.1",
"bcryptjs": "2.4.3",
"bitcoincashjs-lib": "3.3.3",
"glob": "7.1.6",
"ipfs": "0.62.3",
"ipfs-coord": "8.0.5",
"ipfs-http-client": "55.0.0",
"ipfs-coord-esm": "9.1.3",
"ipfs-http-client": "58.0.0",
"jsonrpc-lite": "2.2.0",
"jsonwebtoken": "8.5.1",
"jwt-bch-lib": "1.3.0",
@@ -53,7 +52,7 @@
"libp2p": "^0.36.2",
"line-reader": "0.4.0",
"minimal-slp-wallet": "5.1.0",
"mongoose": "5.13.13",
"mongoose": "5.13.14",
"node-fetch": "npm:@achingbrain/node-fetch@2.6.7",
"nodemailer": "6.7.5",
"p2wdb": "2.2.3",
@@ -65,11 +64,11 @@
"devDependencies": {
"apidoc": "0.51.1",
"bch-token-sweep": "2.1.2",
"c8": "7.12.0",
"chai": "4.3.0",
"coveralls": "2.11.4",
"husky": "4.3.8",
"mocha": "10.0.0",
"nyc": "15.1.0",
"semantic-release": "19.0.3",
"sinon": "9.2.4",
"standard": "17.0.0",
+9 -9
View File
@@ -46,7 +46,7 @@ services:
#build:
# context: ./p2wdb/
# dockerfile: Dockerfile
image: christroutner/p2wdb:v3.0.9
image: christroutner/p2wdb:v3.1.8
container_name: p2wdb
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
@@ -70,10 +70,10 @@ services:
restart: always
bch-dex:
build:
context: ./bch-dex/
dockerfile: Dockerfile
#image: christroutner/bch-dex:v1.9.6
#build:
# context: ./bch-dex/
# dockerfile: Dockerfile
image: christroutner/bch-dex:v2.0.0
container_name: bch-dex
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
@@ -94,10 +94,10 @@ services:
restart: always
dex-ui:
build:
context: ./bch-dex-ui/
dockerfile: Dockerfile
#image: christroutner/bch-dex-ui:v1.6.6
#build:
# context: ./bch-dex-ui/
# dockerfile: Dockerfile
image: christroutner/bch-dex-ui:v1.12.0
container_name: dex-ui
environment:
SERVER: 'http://192.168.2.3'
@@ -24,7 +24,7 @@ export DBURL=mongodb://172.17.0.1:5666/bch-swap-service-prod
export PORT=5700
# bch-dex specific env vars
export BCH_DEX=production
export BCH_DEX=prod
export WEBHOOKSERVICE=http://172.17.0.1:5667/webhook
export WEBHOOKTARGET=http://172.17.0.1:5700/p2wdb
export APP_ID=bch-dex-001
+9 -8
View File
@@ -43,10 +43,10 @@ services:
#build:
# context: ./p2wdb/
# dockerfile: Dockerfile
image: christroutner/p2wdb-rpi:v3.0.10
image: christroutner/p2wdb-rpi:v3.1.8
container_name: p2wdb
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
CONSUMER_URL: 'https://wa-usa-bch-consumer.fullstackcash.nl'
DEBUG_LEVEL: 1
logging:
driver: 'json-file'
@@ -67,13 +67,14 @@ services:
restart: always
bch-dex:
build:
context: ./bch-dex/
dockerfile: Dockerfile
#image: christroutner/bch-dex-rpi:v1.9.8
#build:
# context: ./bch-dex/
# dockerfile: Dockerfile
image: christroutner/bch-dex-rpi:v2.0.0
container_name: bch-dex
environment:
CONSUMER_URL: 'https://free-bch.fullstack.cash'
#CONSUMER_URL: 'https://free-bch.fullstack.cash'
CONSUMER_URL: 'https://wa-usa-bch-consumer.fullstackcash.nl'
logging:
driver: 'json-file'
options:
@@ -94,7 +95,7 @@ services:
#build:
# context: ./bch-dex-ui/
# dockerfile: Dockerfile
image: christroutner/bch-dex-ui-rpi:v1.7.5
image: christroutner/bch-dex-ui-rpi:v1.2.2
container_name: dex-ui
logging:
driver: 'json-file'
+1 -1
View File
@@ -6,7 +6,7 @@
the DEX app wallet in order to be acceped.
*/
const axios = require('axios')
import axios from 'axios'
const LOCALHOST = 'http://localhost:5700'
// const LOCALHOST = 'http://172.17.0.1:5700'
+3 -2
View File
@@ -3,8 +3,9 @@
*/
// Public NPM libraries
const BchWallet = require('minimal-slp-wallet/index')
const fs = require('fs').promises
import BchWallet from 'minimal-slp-wallet/index'
import { promises as fs } from 'fs'
async function createWallet () {
try {
+2 -2
View File
@@ -5,10 +5,10 @@
*/
// Global npm libraries
const BchWallet = require('minimal-slp-wallet/index')
import BchWallet from 'minimal-slp-wallet/index.js'
// Local libraries
const WalletAdapter = require('../../src/adapters/wallet')
import WalletAdapter from '../../src/adapters/wallet.js'
// Constants
const EMTPY_ADDR_CUTOFF = 10
+2 -2
View File
@@ -8,10 +8,10 @@
// Public npm libraries
// const BCHJS = require('@psf/bch-js')
const BchTokenSweep = require('bch-token-sweep/index')
import BchTokenSweep from 'bch-token-sweep/index.js'
// Local libraries
const WalletAdapter = require('../../src/adapters/wallet')
import WalletAdapter from '../../src/adapters/wallet.js'
// Constants
const EMTPY_ADDR_CUTOFF = 10
+18 -8
View File
@@ -13,16 +13,24 @@
in the Adapter directory.
*/
'use strict'
const axios = require('axios').default
const mongoose = require('mongoose')
const User = require('../adapters/localdb/models/users')
const config = require('../../config')
const JsonFiles = require('../adapters/json-files')
// Global npm libraries
import axios from 'axios'
import mongoose from 'mongoose'
// Local libraries
import User from '../adapters/localdb/models/users.js'
import config from '../../config/index.js'
import JsonFiles from '../adapters/json-files.js'
// Hack to get __dirname back.
// https://blog.logrocket.com/alternatives-dirname-node-js-es-modules/
import * as url from 'url'
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
const jsonFiles = new JsonFiles()
const JSON_FILE = `system-user-${config.env}.json`
const JSON_PATH = `${__dirname.toString()}/../../config/${JSON_FILE}`
const JSON_PATH = `${__dirname.toString()}../../config/${JSON_FILE}`
const LOCALHOST = `http://localhost:${config.port}`
const context = {}
@@ -82,6 +90,8 @@ class Admin {
// applications like the Task Manager and the test scripts can access.
await jsonFiles.writeJSON(context, JSON_PATH)
// console.log('context: ', context)
// console.log('JSON_PATH: ', JSON_PATH)
return context
} catch (err) {
@@ -169,4 +179,4 @@ class Admin {
}
}
module.exports = Admin
export default Admin
+5 -4
View File
@@ -3,9 +3,10 @@
*/
// Public npm libraries
const BCHJS = require('@psf/bch-js')
const MsgLib = require('bch-message-lib')
const BchWallet = require('minimal-slp-wallet/index')
import BCHJS from '@psf/bch-js'
import MsgLib from 'bch-message-lib'
import BchWallet from 'minimal-slp-wallet/index.js'
class Bch {
constructor () {
@@ -79,4 +80,4 @@ class Bch {
}
}
module.exports = Bch
export default Bch
+5 -6
View File
@@ -3,13 +3,12 @@
*/
/* eslint-disable no-useless-escape */
import config from '../../config/index.js'
import NodeMailer from '../adapters/nodemailer.js'
import wlogger from '../adapters/wlogger.js'
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
const config = require('../../config')
const NodeMailer = require('../adapters/nodemailer')
const nodemailer = new NodeMailer()
const { wlogger } = require('../adapters/wlogger')
let _this
@@ -60,4 +59,4 @@ class ContactLib {
}
}
}
module.exports = ContactLib
export default ContactLib
+4 -3
View File
@@ -5,8 +5,9 @@
for this file.
*/
const JwtLib = require('jwt-bch-lib')
const BCHJS = require('@psf/bch-js')
import JwtLib from 'jwt-bch-lib'
import BCHJS from '@psf/bch-js'
class FullStackJWT {
constructor (localConfig = {}) {
@@ -98,4 +99,4 @@ class FullStackJWT {
}
}
module.exports = FullStackJWT
export default FullStackJWT
+18 -15
View File
@@ -5,23 +5,26 @@
*/
// Public NPM libraries
const BCHJS = require('@psf/bch-js')
import BCHJS from '@psf/bch-js'
// Load individual adapter libraries.
const IPFSAdapter = require('./ipfs')
const LocalDB = require('./localdb')
const LogsAPI = require('./logapi')
const Passport = require('./passport')
const Nodemailer = require('./nodemailer')
// const { wlogger } = require('./wlogger')
const JSONFiles = require('./json-files')
const FullStackJWT = require('./fullstack-jwt')
const BCHAdapter = require('./bch')
const WalletAdapter = require('./wallet')
const P2wdbAdapter = require('./p2wdb-adapter')
const Webhook = require('./webhook')
import IPFSAdapter from './ipfs/index.js'
const config = require('../../config')
import LocalDB from './localdb/index.js'
import LogsAPI from './logapi.js'
import Passport from './passport.js'
import Nodemailer from './nodemailer.js'
// const { wlogger } = require('./wlogger')
import JSONFiles from './json-files.js'
import FullStackJWT from './fullstack-jwt.js'
import config from '../../config/index.js'
import BCHAdapter from './bch.js'
import WalletAdapter from './wallet.js'
import P2wdbAdapter from './p2wdb-adapter.js'
import Webhook from './webhook.js'
class Adapters {
constructor (localConfig = {}) {
@@ -87,4 +90,4 @@ class Adapters {
}
}
module.exports = Adapters
export default Adapters
+5 -4
View File
@@ -3,9 +3,10 @@
*/
// Local libraries
const IpfsAdapter = require('./ipfs')
const IpfsCoordAdapter = require('./ipfs-coord')
const config = require('../../../config')
import IpfsAdapter from './ipfs.js'
import IpfsCoordAdapter from './ipfs-coord.js'
import config from '../../../config/index.js'
class IPFS {
constructor (localConfig = {}) {
@@ -59,4 +60,4 @@ class IPFS {
}
}
module.exports = IPFS
export default IPFS
+14 -7
View File
@@ -5,12 +5,15 @@
*/
// Global npm libraries
const IpfsCoord = require('ipfs-coord')
const BCHJS = require('@psf/bch-js')
const publicIp = require('public-ip')
import IpfsCoord from 'ipfs-coord-esm'
// import BCHJS from '@psf/bch-js';
import SlpWallet from 'minimal-slp-wallet/index.js'
import publicIp from 'public-ip'
// Local libraries
const config = require('../../../config')
import config from '../../../config/index.js'
// const JSONRPC = require('../../controllers/json-rpc/')
let _this
@@ -28,7 +31,8 @@ class IpfsCoordAdapter {
// Encapsulate dependencies
this.IpfsCoord = IpfsCoord
this.ipfsCoord = {}
this.bchjs = new BCHJS()
// this.bchjs = new BCHJS()
this.wallet = new SlpWallet()
this.config = config
this.publicIp = publicIp
@@ -41,6 +45,9 @@ class IpfsCoordAdapter {
async start () {
const circuitRelayInfo = {}
// Wait for the BCH wallet to create the wallet.
await this.wallet.walletInfoPromise
// If configured as a Circuit Relay, get the public IP addresses for this node.
if (this.config.isCircuitRelay) {
try {
@@ -61,7 +68,7 @@ class IpfsCoordAdapter {
ipfs: this.ipfs,
type: 'node.js',
// type: 'browser',
bchjs: this.bchjs,
wallet: this.wallet,
privateLog: console.log, // Default to console.log
isCircuitRelay: this.config.isCircuitRelay,
circuitRelayInfo,
@@ -108,4 +115,4 @@ class IpfsCoordAdapter {
}
}
module.exports = IpfsCoordAdapter
export default IpfsCoordAdapter
+14 -13
View File
@@ -11,13 +11,14 @@
// Global npm libraries
// const IPFS = require('ipfs')
// const IPFS = require('@chris.troutner/ipfs')
const IPFSembedded = require('ipfs')
const IPFSexternal = require('ipfs-http-client')
const fs = require('fs')
const http = require('http')
// import IPFSembedded from 'ipfs';
import { create } from 'ipfs-http-client'
import fs from 'fs'
import http from 'http'
// Local libraries
const config = require('../../../config')
import config from '../../../config/index.js'
const IPFS_DIR = './.ipfsdata/ipfs'
@@ -25,17 +26,17 @@ class IpfsAdapter {
constructor (localConfig) {
// Encapsulate dependencies
this.config = config
this.fs = fs
this.create = create
// Choose the IPFS constructor based on the config settings.
this.IPFS = IPFSembedded // default
if (this.config.isProduction) {
this.IPFS = IPFSexternal
}
// this.IPFS = IPFSembedded // default
// if (this.config.isProduction) {
// this.IPFS = IPFSexternal
// }
// Properties of this class instance.
this.isReady = false
this.fs = fs
}
// Start an IPFS node.
@@ -85,7 +86,7 @@ class IpfsAdapter {
}
// Create a new IPFS node.
this.ipfs = await this.IPFS.create(ipfsOptions)
this.ipfs = await this.create(ipfsOptions)
// Set the 'server' profile so the node does not scan private networks.
await this.ipfs.config.profiles.apply('server')
@@ -137,4 +138,4 @@ class IpfsAdapter {
// }
}
module.exports = IpfsAdapter
export default IpfsAdapter
+3 -3
View File
@@ -1,8 +1,8 @@
/*
A utility file for reading and writing JSON files.
*/
'use strict'
const fs = require('fs')
import fs from 'fs'
let _this
@@ -75,4 +75,4 @@ class JsonFiles {
}
}
module.exports = JsonFiles
export default JsonFiles
+5 -5
View File
@@ -3,10 +3,10 @@
*/
// Load Mongoose models.
const Users = require('./models/users')
const Entries = require('./models/entry')
const Order = require('./models/order')
const Offer = require('./models/offer')
import Users from './models/users.js'
import Entries from './models/entry.js'
import Order from './models/order.js'
import Offer from './models/offer.js'
class LocalDB {
constructor () {
@@ -18,4 +18,4 @@ class LocalDB {
}
}
module.exports = LocalDB
export default LocalDB
+2 -2
View File
@@ -1,4 +1,4 @@
const mongoose = require('mongoose')
import mongoose from 'mongoose'
const Entry = new mongoose.Schema({
entry: { type: String },
@@ -10,4 +10,4 @@ const Entry = new mongoose.Schema({
merit: { type: Number }
})
module.exports = mongoose.model('entry', Entry)
export default mongoose.model('entry', Entry)
+2 -2
View File
@@ -1,4 +1,4 @@
const mongoose = require('mongoose')
import mongoose from 'mongoose'
const Offer = new mongoose.Schema({
@@ -38,4 +38,4 @@ const Offer = new mongoose.Schema({
})
module.exports = mongoose.model('offer', Offer)
export default mongoose.model('offer', Offer)
+2 -2
View File
@@ -6,7 +6,7 @@
See the dev-docs/specification.md for details on each property.
*/
const mongoose = require('mongoose')
import mongoose from 'mongoose'
const Order = new mongoose.Schema({
// Token data
@@ -40,4 +40,4 @@ const Order = new mongoose.Schema({
messageClass: { type: Number }
})
module.exports = mongoose.model('order', Order)
export default mongoose.model('order', Order)
+8 -5
View File
@@ -1,7 +1,10 @@
const mongoose = require('mongoose')
const bcrypt = require('bcryptjs')
const config = require('../../../../config')
const jwt = require('jsonwebtoken')
// Global npm libraries
import mongoose from 'mongoose'
import bcrypt from 'bcryptjs'
import jwt from 'jsonwebtoken'
// Local libraries
import config from '../../../../config/index.js'
const User = new mongoose.Schema({
type: { type: String, default: 'user' },
@@ -51,4 +54,4 @@ User.methods.generateToken = function generateToken () {
}
// export default mongoose.model('user', User)
module.exports = mongoose.model('user', User)
export default mongoose.model('user', User)
+2 -2
View File
@@ -3,7 +3,7 @@
orders from the datatabase.
*/
const Order = require('./models/order')
import Order from './models/order.js'
// let _this
@@ -39,4 +39,4 @@ class OrderPagination {
}
}
module.exports = OrderPagination
export default OrderPagination
+9 -4
View File
@@ -1,9 +1,14 @@
const lineReader = require('line-reader')
const fs = require('fs')
import lineReader from 'line-reader'
import fs from 'fs'
const config = require('../../config')
import config from '../../config/index.js'
// Hack to get __dirname back.
// https://blog.logrocket.com/alternatives-dirname-node-js-es-modules/
import * as url from 'url'
let _this
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
class LogsApi {
constructor () {
@@ -169,4 +174,4 @@ class LogsApi {
}
}
module.exports = LogsApi
export default LogsApi
+4 -5
View File
@@ -3,11 +3,10 @@
*/
'use strict'
const nodemailer = require('nodemailer')
import nodemailer from 'nodemailer'
const config = require('../../config')
const { wlogger } = require('./wlogger')
import config from '../../config/index.js'
import wlogger from './wlogger.js'
let _this
@@ -150,4 +149,4 @@ class NodeMailer {
}
}
module.exports = NodeMailer
export default NodeMailer
+5 -4
View File
@@ -3,11 +3,12 @@
*/
// Public npm libraries.
const axios = require('axios')
const { Write, Read } = require('p2wdb/index')
import axios from 'axios'
import { Write, Read } from 'p2wdb/index.js'
// Local libraries
const config = require('../../config')
import config from '../../config/index.js'
class P2wdbAdapter {
constructor (localConfig = {}) {
@@ -111,4 +112,4 @@ class P2wdbAdapter {
}
}
module.exports = P2wdbAdapter
export default P2wdbAdapter
+2 -2
View File
@@ -2,7 +2,7 @@
koa-passport is an authorization library used for different authentication schemes.
*/
const passport = require('koa-passport')
import passport from 'koa-passport'
let _this
class Passport {
@@ -32,4 +32,4 @@ class Passport {
}
}
module.exports = Passport
export default Passport
+12 -5
View File
@@ -3,12 +3,19 @@
*/
// Public npm libraries
const BchWallet = require('minimal-slp-wallet/index')
const bitcoinJs = require('bitcoincashjs-lib')
import BchWallet from 'minimal-slp-wallet/index.js'
import bitcoinJs from 'bitcoincashjs-lib'
// Local libraries
const JsonFiles = require('./json-files')
const config = require('../../config')
import JsonFiles from './json-files.js'
import config from '../../config/index.js'
// Hack to get __dirname back.
// https://blog.logrocket.com/alternatives-dirname-node-js-es-modules/
import * as url from 'url'
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
const WALLET_FILE = `${__dirname.toString()}/../../wallet.json`
// const PROOF_OF_BURN_QTY = 0.01
@@ -503,4 +510,4 @@ class WalletAdapter {
}
}
module.exports = WalletAdapter
export default WalletAdapter
+4 -3
View File
@@ -2,8 +2,9 @@
The (Clean Architecture) Adapter for manageing a webhook connection to P2WDB.
*/
const config = require('../../config')
const axios = require('axios')
import config from '../../config/index.js'
import axios from 'axios'
let _this
@@ -101,4 +102,4 @@ function sleep (ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
module.exports = WebHook
export default WebHook
+12 -4
View File
@@ -6,10 +6,17 @@
'use strict'
const winston = require('winston')
require('winston-daily-rotate-file')
// Global npm libraries
import winston from 'winston'
import 'winston-daily-rotate-file'
const config = require('../../config')
// Local libraries
import config from '../../config/index.js'
// Hack to get __dirname back.
// https://blog.logrocket.com/alternatives-dirname-node-js-es-modules/
import * as url from 'url'
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
class Wlogger {
constructor (localConfig = {}) {
@@ -70,4 +77,5 @@ logger.outputToConsole()
const wlogger = logger.wlogger
module.exports = { wlogger, Wlogger }
export { wlogger as default, Wlogger }
// export default wlogger
+16 -7
View File
@@ -6,12 +6,21 @@
// Public npm libraries.
// Local libraries
const Adapters = require('../adapters')
const JSONRPC = require('./json-rpc')
const UseCases = require('../use-cases')
const RESTControllers = require('./rest-api')
const TimerControllers = require('./timer-controllers')
// Load the Clean Architecture Adapters library
import Adapters from '../adapters/index.js'
// Load the JSON RPC Controller.
import JSONRPC from './json-rpc/index.js'
// Load the Clean Architecture Use Case libraries.
import UseCases from '../use-cases/index.js'
// const useCases = new UseCases({ adapters })
// Load the REST API Controllers.
import RESTControllers from './rest-api/index.js'
import TimerControllers from './timer-controllers.js'
class Controllers {
constructor (localConfig = {}) {
@@ -63,4 +72,4 @@ class Controllers {
}
}
module.exports = Controllers
export default Controllers
+3 -3
View File
@@ -6,10 +6,10 @@
*/
// Public npm libraries
const jsonrpc = require('jsonrpc-lite')
import jsonrpc from 'jsonrpc-lite'
// Local libraries
const config = require('../../../../config')
import config from '../../../../config/index.js'
class AboutRPC {
constructor (localConfig) {
@@ -48,4 +48,4 @@ class AboutRPC {
}
}
module.exports = AboutRPC
export default AboutRPC
+5 -4
View File
@@ -3,13 +3,14 @@
*/
// Public npm libraries
const jsonrpc = require('jsonrpc-lite')
import jsonrpc from 'jsonrpc-lite'
// Local libraries
// const AuthLib = require('../../lib/auth')
// const UserLib = require('../../../use-cases/user')
const { wlogger } = require('../../../adapters/wlogger')
const RateLimit = require('../rate-limit')
import wlogger from '../../../adapters/wlogger.js'
import RateLimit from '../rate-limit.js'
class AuthRPC {
constructor (localConfig = {}) {
@@ -173,4 +174,4 @@ class AuthRPC {
}
}
module.exports = AuthRPC
export default AuthRPC
+7 -6
View File
@@ -3,13 +3,14 @@
*/
// Public npm libraries
const jsonrpc = require('jsonrpc-lite')
import jsonrpc from 'jsonrpc-lite'
// Local support libraries
const { wlogger } = require('../../adapters/wlogger')
const UserController = require('./users')
const AuthController = require('./auth')
const AboutController = require('./about')
import wlogger from '../../adapters/wlogger.js'
import UserController from './users/index.js'
import AuthController from './auth/index.js'
import AboutController from './about/index.js'
let _this
@@ -190,4 +191,4 @@ class JSONRPC {
}
}
module.exports = JSONRPC
export default JSONRPC
+2 -2
View File
@@ -4,7 +4,7 @@
/* eslint no-useless-catch: 0 */
// Local libraries
const RateLimitLib = require('koa2-ratelimit').RateLimit
import { RateLimit as RateLimitLib } from 'koa2-ratelimit'
class RateLimit {
constructor (options) {
@@ -80,4 +80,4 @@ class RateLimit {
}
}
module.exports = RateLimit
export default RateLimit
+5 -4
View File
@@ -3,12 +3,13 @@
*/
// Public npm libraries
const jsonrpc = require('jsonrpc-lite')
import jsonrpc from 'jsonrpc-lite'
// Local libraries
// const UserLib = require('../../../use-cases/user')
const Validators = require('../validators')
const RateLimit = require('../rate-limit')
import Validators from '../validators.js'
import RateLimit from '../rate-limit.js'
class UserRPC {
constructor (localConfig = {}) {
@@ -533,4 +534,4 @@ class UserRPC {
// TODO create deleteUser()
}
module.exports = UserRPC
export default UserRPC
+4 -3
View File
@@ -4,10 +4,11 @@
/* eslint no-useless-catch: 0 */
// Public npm libraries
const jwt = require('jsonwebtoken')
import jwt from 'jsonwebtoken'
// Local libraries
const config = require('../../../config')
import config from '../../../config/index.js'
// const UserModel = require('../../adapters/localdb/models/users')
class Validators {
@@ -93,4 +94,4 @@ class Validators {
}
}
module.exports = Validators
export default Validators
+2 -2
View File
@@ -1,4 +1,4 @@
const Passport = require('../../../adapters/passport')
import Passport from '../../../adapters/passport.js'
const passport = new Passport()
let _this
@@ -96,4 +96,4 @@ class AuthRESTController {
}
}
module.exports = AuthRESTController
export default AuthRESTController
+3 -3
View File
@@ -3,10 +3,10 @@
*/
// Public npm libraries.
const Router = require('koa-router')
import Router from 'koa-router'
// Local libraries.
const AuthRESTController = require('./controller')
import AuthRESTController from './controller.js'
class AuthRouter {
constructor (localConfig = {}) {
@@ -48,4 +48,4 @@ class AuthRouter {
}
}
module.exports = AuthRouter
export default AuthRouter
@@ -3,9 +3,9 @@
*/
/* eslint-disable no-useless-escape */
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
import ContactLib from '../../../adapters/contact.js'
const ContactLib = require('../../../adapters/contact')
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
const contactLib = new ContactLib()
let _this
@@ -74,4 +74,4 @@ class ContactController {
}
}
}
module.exports = ContactController
export default ContactController
+3 -3
View File
@@ -3,10 +3,10 @@
*/
// Public npm libraries.
const Router = require('koa-router')
import Router from 'koa-router'
// Local libraries.
const ContactRESTControllerLib = require('./controller')
import ContactRESTControllerLib from './controller.js'
class ContactRouter {
constructor (localConfig = {}) {
@@ -53,4 +53,4 @@ class ContactRouter {
}
}
module.exports = ContactRouter
export default ContactRouter
+1 -1
View File
@@ -64,4 +64,4 @@ class EntryRESTControllerLib {
}
}
module.exports = EntryRESTControllerLib
export default EntryRESTControllerLib
+3 -3
View File
@@ -3,10 +3,10 @@
*/
// Public npm libraries.
const Router = require('koa-router')
import Router from 'koa-router'
// Local libraries.
const EntryRESTControllerLib = require('./controller')
import EntryRESTControllerLib from './controller.js'
let _this
@@ -57,4 +57,4 @@ class UserRouter {
}
}
module.exports = UserRouter
export default UserRouter
+10 -10
View File
@@ -6,15 +6,15 @@
// Public npm libraries.
// Load the REST API Controllers.
const AuthRESTController = require('./auth')
const UserRouter = require('./users')
const ContactRESTController = require('./contact')
const LogsRESTController = require('./logs')
const EntryRouter = require('./entry')
const OfferRouter = require('./offer')
const OrderRouter = require('./order')
const P2WDBRouter = require('./p2wdb')
// Local libraries
import AuthRESTController from './auth/index.js'
import UserRouter from './users/index.js'
import ContactRESTController from './contact/index.js'
import LogsRESTController from './logs/index.js'
import EntryRouter from './entry/index.js'
import OfferRouter from './offer/index.js'
import OrderRouter from './order/index.js'
import P2WDBRouter from './p2wdb/index.js'
class RESTControllers {
constructor (localConfig = {}) {
@@ -72,4 +72,4 @@ class RESTControllers {
}
}
module.exports = RESTControllers
export default RESTControllers
+2 -2
View File
@@ -1,4 +1,4 @@
const LogsApiLib = require('../../../adapters/logapi')
import LogsApiLib from '../../../adapters/logapi.js'
const logsApiLib = new LogsApiLib()
let _this
@@ -62,4 +62,4 @@ class LogsApi {
}
}
module.exports = LogsApi
export default LogsApi
+3 -3
View File
@@ -3,10 +3,10 @@
*/
// Public npm libraries.
const Router = require('koa-router')
import Router from 'koa-router'
// Local libraries.
const LogsRESTControllerLib = require('./controller')
import LogsRESTControllerLib from './controller.js'
class LogsRouter {
constructor (localConfig = {}) {
@@ -52,4 +52,4 @@ class LogsRouter {
}
}
module.exports = LogsRouter
export default LogsRouter
+2 -2
View File
@@ -1,4 +1,4 @@
module.exports = function errorMiddleware () {
export default function errorMiddleware () {
return async (ctx, next) => {
try {
await next()
@@ -8,4 +8,4 @@ module.exports = function errorMiddleware () {
ctx.app.emit('error', err, ctx)
}
}
}
};
@@ -1,11 +1,24 @@
/*
REST API validator middleware.
These are a series of functions that ensure the user making a REST API
matches a user in the database (or not). In can do fine-grain user control
such as telling the difference between an admin, a normal user, and an
anonymous user.
This middleware is used to gatekeep access to different REST API resources.
CT 9/17/22:
This library was lightly refactored to make it work with the new unit tests.
This not and the commented code below can be deleted once it is verified that
this refactor did not result in any breaking changes.
*/
const User = require('../../../adapters/localdb/models/users')
const config = require('../../../../config')
const jwt = require('jsonwebtoken')
const { wlogger } = require('../../../adapters/wlogger')
import User from '../../../adapters/localdb/models/users.js'
import config from '../../../../config/index.js'
import jwt from 'jsonwebtoken'
import wlogger from '../../../adapters/wlogger.js'
let _this
@@ -20,12 +33,10 @@ class Validators {
async ensureUser (ctx, next) {
try {
// console.log(`getToken: ${typeof (getToken)}`)
const token = _this.getToken(ctx)
if (!token) {
// console.log(`Err: Token not provided.`)
ctx.throw(401)
throw new Error('Token could not be retrieved from header')
}
let decoded = null
@@ -34,20 +45,23 @@ class Validators {
// console.log(`config: ${JSON.stringify(config, null, 2)}`)
decoded = _this.jwt.verify(token, config.token)
} catch (err) {
// console.log(`Err: Token could not be decoded: ${err}`)
ctx.throw(401)
throw new Error('Could not verify JWT')
}
ctx.state.user = await _this.User.findById(decoded.id, '-password')
if (!ctx.state.user) {
// console.log(`Err: Could not find user.`)
ctx.throw(401)
// console.log('Err: Could not find user.')
throw new Error('Could not find user')
}
// return next()
return true
} catch (error) {
ctx.throw(401)
// console.log('Ensure user error: ', error)
// console.log('ctx: ', ctx)
ctx.status = 401
ctx.throw(401, error.message)
}
}
@@ -60,7 +74,8 @@ class Validators {
if (!token) {
// console.log(`Err: Token not provided.`)
ctx.throw(401)
// ctx.throw(401)
throw new Error('Token could not be retrieved from header')
}
let decoded = null
@@ -70,22 +85,26 @@ class Validators {
decoded = _this.jwt.verify(token, config.token)
} catch (err) {
// console.log(`Err: Token could not be decoded: ${err}`)
ctx.throw(401)
// ctx.throw(401)
throw new Error('Could not verify JWT')
}
ctx.state.user = await _this.User.findById(decoded.id, '-password')
if (!ctx.state.user) {
// console.log(`Err: Could not find user.`)
ctx.throw(401)
// ctx.throw(401)
throw new Error('Could not find user')
}
if (ctx.state.user.type !== 'admin') {
ctx.throw(401, 'not admin')
// ctx.throw(401, 'not admin')
throw new Error('User is not an admin')
}
// return next()
return true
} catch (error) {
ctx.status = 401
ctx.throw(401, error.message)
}
}
@@ -101,7 +120,8 @@ class Validators {
if (!token) {
// console.log(`Err: Token not provided.`)
ctx.throw(401)
// ctx.throw(401)
throw new Error('Token could not be retrieved from header')
}
// The user ID targeted in this API call.
@@ -114,14 +134,16 @@ class Validators {
// console.log(`config: ${JSON.stringify(config, null, 2)}`)
decoded = _this.jwt.verify(token, config.token)
} catch (err) {
// console.log(`Err: Token could not be decoded: ${err}`)
ctx.throw(401)
console.log(`Err: Token could not be decoded: ${err}`)
// ctx.throw(401)
throw new Error('Could not verify JWT')
}
ctx.state.user = await _this.User.findById(decoded.id, '-password')
if (!ctx.state.user) {
// console.log(`Err: Could not find user.`)
ctx.throw(401)
// ctx.throw(401)
throw new Error('Could not find user')
}
// console.log('ctx.state.user: ', ctx.state.user)
@@ -135,7 +157,8 @@ class Validators {
// If they don't match, then the calling user better be an admin.
if (ctx.state.user.type !== 'admin') {
ctx.throw(401, 'not admin')
// ctx.throw(401, 'not admin')
throw new Error('User is not an admin')
} else {
wlogger.verbose("It's ok. The user is an admin.")
}
@@ -144,6 +167,8 @@ class Validators {
// return next()
return true
} catch (error) {
// console.log('Error in ensureTargetUserOrAdmin(): ', error)
ctx.status = 401
ctx.throw(401, error.message)
}
}
@@ -166,4 +191,4 @@ class Validators {
}
}
module.exports = Validators
export default Validators
+2 -2
View File
@@ -2,7 +2,7 @@
REST API Controller library for the /offer route
*/
const { wlogger } = require('../../../adapters/wlogger')
import wlogger from '../../../adapters/wlogger.js'
let _this
@@ -128,4 +128,4 @@ class OfferRESTControllerLib {
}
}
module.exports = OfferRESTControllerLib
export default OfferRESTControllerLib
+3 -3
View File
@@ -3,10 +3,10 @@
*/
// Public npm libraries.
const Router = require('koa-router')
import Router from 'koa-router'
// Local libraries.
const OfferRESTControllerLib = require('./controller')
import OfferRESTControllerLib from './controller.js'
let _this
@@ -61,4 +61,4 @@ class OfferRouter {
}
}
module.exports = OfferRouter
export default OfferRouter
+1 -1
View File
@@ -65,4 +65,4 @@ class OrderRESTControllerLib {
}
}
module.exports = OrderRESTControllerLib
export default OrderRESTControllerLib
+3 -3
View File
@@ -3,10 +3,10 @@
*/
// Public npm libraries.
const Router = require('koa-router')
import Router from 'koa-router'
// Local libraries.
const OrderRESTControllerLib = require('./controller')
import OrderRESTControllerLib from './controller.js'
let _this
@@ -57,4 +57,4 @@ class OrderRouter {
}
}
module.exports = OrderRouter
export default OrderRouter
+1 -1
View File
@@ -101,4 +101,4 @@ class P2WDBRESTControllerLib {
}
}
module.exports = P2WDBRESTControllerLib
export default P2WDBRESTControllerLib
+3 -3
View File
@@ -5,10 +5,10 @@
*/
// Public npm libraries.
const Router = require('koa-router')
import Router from 'koa-router'
// Local libraries.
const P2WDBRESTControllerLib = require('./controller')
import P2WDBRESTControllerLib from './controller.js'
let _this
@@ -59,4 +59,4 @@ class P2WDBRouter {
}
}
module.exports = P2WDBRouter
export default P2WDBRouter
+4 -4
View File
@@ -2,7 +2,7 @@
REST API Controller library for the /user route
*/
const { wlogger } = require('../../../adapters/wlogger')
import wlogger from '../../../adapters/wlogger.js'
let _this
@@ -36,7 +36,7 @@ class UserRESTControllerLib {
* @apiGroup REST Users
*
* @apiExample Example usage:
* curl -H "Content-Type: application/json" -X POST -d '{ "user": { "email": "email@format.com", "name": "my name", "password": "secretpasas" } }' localhost:5001/users
* curl -H "Content-Type: application/json" -X POST -d '{ "user": { "email": "email@format.com", "name": "my name", "password": "secretpasas" } }' localhost:5010/users
*
* @apiParam {Object} user User object (required)
* @apiParam {String} user.email Email
@@ -136,7 +136,7 @@ class UserRESTControllerLib {
* @apiGroup REST Users
*
* @apiExample Example usage:
* curl -H "Content-Type: application/json" -X GET localhost:5000/users/56bd1da600a526986cf65c80
* curl -H "Content-Type: application/json" -X GET localhost:5010/users/56bd1da600a526986cf65c80
*
* @apiSuccess {Object} users User object
* @apiSuccess {ObjectId} users._id User id
@@ -281,4 +281,4 @@ class UserRESTControllerLib {
}
}
module.exports = UserRESTControllerLib
export default UserRESTControllerLib
+5 -4
View File
@@ -3,11 +3,12 @@
*/
// Public npm libraries.
const Router = require('koa-router')
import Router from 'koa-router'
// Local libraries.
const UserRESTControllerLib = require('./controller')
const Validators = require('../middleware/validators')
import UserRESTControllerLib from './controller.js'
import Validators from '../middleware/validators.js'
let _this
@@ -85,4 +86,4 @@ class UserRouter {
}
}
module.exports = UserRouter
export default UserRouter
+1 -1
View File
@@ -56,4 +56,4 @@ class TimerControllers {
}
}
module.exports = TimerControllers
export default TimerControllers
+1 -1
View File
@@ -38,4 +38,4 @@ class Entry {
}
}
module.exports = Entry
export default Entry
+1 -1
View File
@@ -103,4 +103,4 @@ class OfferEntity {
}
}
module.exports = OfferEntity
export default OfferEntity
+1 -1
View File
@@ -65,4 +65,4 @@ class Order {
}
}
module.exports = Order
export default Order
+1 -1
View File
@@ -21,4 +21,4 @@ class User {
}
}
module.exports = User
export default User
+5 -3
View File
@@ -1,6 +1,8 @@
const { wlogger } = require('../adapters/wlogger')
const EntryEntiy = require('../entities/entry')
// local libraries
import wlogger from '../adapters/wlogger.js'
import EntryEntiy from '../entities/entry.js'
class EntryLib {
constructor (localConfig = {}) {
// console.log('User localConfig: ', localConfig)
@@ -63,4 +65,4 @@ class EntryLib {
}
}
module.exports = EntryLib
export default EntryLib
+5 -5
View File
@@ -4,10 +4,10 @@
https://troutsblog.com/blog/clean-architecture
*/
const UserUseCases = require('./user')
const EntryUseCases = require('./entry')
const OfferUseCases = require('./offer')
const OrderUseCases = require('./order')
import UserUseCases from './user.js'
import EntryUseCases from './entry.js'
import OfferUseCases from './offer/index.js'
import OrderUseCases from './order.js'
class UseCases {
constructor (localConfig = {}) {
@@ -40,4 +40,4 @@ class UseCases {
}
}
module.exports = UseCases
export default UseCases
+64 -10
View File
@@ -13,9 +13,12 @@
a partially signed transaction.
*/
// Global npm libraries
import axios from 'axios'
// Local libraries
const OfferEntity = require('../../entities/offer')
const config = require('../../../config')
import OfferEntity from '../../entities/offer.js'
import config from '../../../config/index.js'
const DEFAULT_ENTRIES_PER_PAGE = 20
const NFT_ENTRIES_PER_PAGE = 6
@@ -39,6 +42,7 @@ class OfferUseCases {
// Encapsulate dependencies
this.config = config
this.axios = axios
this.offerEntity = new OfferEntity()
this.OfferModel = this.adapters.localdb.Offer
@@ -84,12 +88,22 @@ class OfferUseCases {
const offerEntity = this.offerEntity.validate(offerObj)
console.log('offerEntity: ', offerEntity)
// Get data about the token.
const tokenId = offerEntity.tokenId
const tokenData = await this.adapters.wallet.bchWallet.getTokenData(tokenId)
console.log(`tokenData: ${JSON.stringify(tokenData, null, 2)}`)
// Generate a 'display category' for the token. This will allow the
// front end UI to figure out how to display the token.
const displayCategory = await this.categorizeToken(offerEntity)
const displayCategory = await this.categorizeToken(offerEntity, tokenData)
console.log('displayCategory: ', displayCategory)
offerEntity.displayCategory = displayCategory
// Detect if user set the NSFW flag.
let nsfw = false
nsfw = await this.detectNsfw(tokenData)
offerEntity.nsfw = nsfw
// Add offer to the local database.
const offerModel = new this.OfferModel(offerEntity)
await offerModel.save()
@@ -101,6 +115,46 @@ class OfferUseCases {
}
}
// By default this function returns false, to indicate the NFT is safe for work.
// If the user who created the token sets the nsfw property in the mutable data,
// this function will return true.
async detectNsfw (tokenData) {
try {
let nsfw = false
const mutableCid = tokenData.mutableData
// If there is no mutable IPFS CID, then skip this token.
if (!mutableCid.includes('ipfs://')) return nsfw
// Revove the ipfs:// prefix.
const cid = mutableCid.substring(7)
// Retrieve the mutable data from Filecoin/IPFS.
// const url = `https://${cid}.ipfs.w3s.link/data.json`
const url = `${this.config.ipfsGateway}${cid}/data.json`
const result = await axios.get(url)
const mutableData = result.data
console.log(`mutableData: ${JSON.stringify(mutableData, null, 2)}`)
// Logical tests
const hasNsfw = !!mutableData.nsfw
const nsfwSetTrue = mutableData.nsfw === true
const nsfwStringTrue = mutableData.nsfw === 'true'
const nsfwDetected = hasNsfw && (nsfwSetTrue || nsfwStringTrue)
if (nsfwDetected) {
console.log('NSFW flag set as true')
nsfw = true
}
return nsfw
} catch (err) {
console.error('Error in detectNsfw(): ', err)
return false
}
}
// Categorize the token for display purposes. This will categorize a token
// into one of these categories:
// - nft
@@ -111,14 +165,14 @@ class OfferUseCases {
// The first three are easy to categorize. The simple-nft is a fungible token
// with a quantity of 1, decimals of 0, and no minting baton. Categorizing this
// type of token is the main reason why this function exists.
async categorizeToken (offerData) {
async categorizeToken (offerData, tokenData) {
try {
console.log(`categorizeToken(): ${JSON.stringify(offerData, null, 2)}`)
// console.log(`categorizeToken(): ${JSON.stringify(offerData, null, 2)}`)
const tokenId = offerData.tokenId
const tokenData = await this.adapters.wallet.bchWallet.getTokenData(tokenId)
console.log(`tokenData: ${JSON.stringify(tokenData, null, 2)}`)
// const tokenId = offerData.tokenId
//
// const tokenData = await this.adapters.wallet.bchWallet.getTokenData(tokenId)
// console.log(`tokenData: ${JSON.stringify(tokenData, null, 2)}`)
if (tokenData.genesisData.type === 65) {
return 'nft'
@@ -540,4 +594,4 @@ class OfferUseCases {
}
}
module.exports = OfferUseCases
export default OfferUseCases
+4 -3
View File
@@ -9,8 +9,9 @@
pay-to-write-access-controller.js depends on this library.
*/
const PQueue = require('p-queue').default
const pRetry = require('p-retry')
// Global npm libraries
import PQueue from 'p-queue'
import pRetry from 'p-retry'
let _this
@@ -103,4 +104,4 @@ class RetryQueue {
}
}
module.exports = RetryQueue
export default RetryQueue
+5 -4
View File
@@ -3,9 +3,10 @@
*/
// Local libraries
const { wlogger } = require('../adapters/wlogger')
const OrderEntity = require('../entities/order')
const config = require('../../config')
import wlogger from '../adapters/wlogger.js'
import OrderEntity from '../entities/order.js'
import config from '../../config/index.js'
class OrderLib {
constructor (localConfig = {}) {
@@ -237,4 +238,4 @@ class OrderLib {
}
}
module.exports = OrderLib
export default OrderLib
+4 -3
View File
@@ -3,8 +3,9 @@
functions are called by the /user REST API endpoints.
*/
const UserEntity = require('../entities/user')
const { wlogger } = require('../adapters/wlogger')
import UserEntity from '../entities/user.js'
import wlogger from '../adapters/wlogger.js'
class UserLib {
constructor (localConfig = {}) {
@@ -181,4 +182,4 @@ class UserLib {
}
}
module.exports = UserLib
export default UserLib
+9 -6
View File
@@ -5,15 +5,18 @@
*/
// Public npm libraries
const assert = require('chai').assert
const axios = require('axios').default
import { assert } from 'chai'
import axios from 'axios'
// const sinon = require('sinon')
// Local support libraries
const config = require('../../../config')
const Server = require('../../../bin/server')
const testUtils = require('../../utils/test-utils')
const AdminLib = require('../../../src/adapters/admin')
import config from '../../../config/index.js'
import Server from '../../../bin/server.js'
import testUtils from '../../utils/test-utils.js'
import AdminLib from '../../../src/adapters/admin.js'
const adminLib = new AdminLib()
// const request = supertest.agent(app.listen())
+10 -14
View File
@@ -1,20 +1,19 @@
const testUtils = require('../../utils/test-utils')
const assert = require('chai').assert
const config = require('../../../config')
const axios = require('axios').default
const sinon = require('sinon')
import testUtils from '../../utils/test-utils.js'
import { assert } from 'chai'
import config from '../../../config/index.js'
import axios from 'axios'
import sinon from 'sinon'
import util from 'util'
const util = require('util')
import UserController from '../../../src/controllers/rest-api/users/controller.js'
import Adapters from '../../../src/adapters/index.js'
import UseCases from '../../../src/use-cases/index.js'
util.inspect.defaultOptions = { depth: 1 }
const LOCALHOST = `http://localhost:${config.port}`
const context = {}
const UserController = require('../../../src/controllers/rest-api/users/controller')
const Adapters = require('../../../src/adapters')
const adapters = new Adapters()
const UseCases = require('../../../src/use-cases/')
let uut
let sandbox
@@ -39,7 +38,7 @@ describe('Users', () => {
// Get the JWT used to log in as the admin 'system' user.
const adminJWT = await testUtils.getAdminJWT()
// console.log(`adminJWT: ${admi nJWT}`)
console.log(`adminJWT: ${adminJWT}`)
context.adminJWT = adminJWT
// const admin = await testUtils.loginAdminUser()
@@ -71,9 +70,6 @@ describe('Users', () => {
await axios(options)
/* console.log(
`result stringified: ${JSON.stringify(result.data, null, 2)}`
) */
assert(false, 'Unexpected result')
} catch (err) {
assert(err.response.status === 422, 'Error code 422 expected.')
+7 -7
View File
@@ -1,15 +1,15 @@
const config = require('../../../config')
const axios = require('axios').default
const assert = require('chai').assert
const sinon = require('sinon')
import config from '../../../config/index.js'
import axios from 'axios'
import { assert } from 'chai'
import sinon from 'sinon'
import { context as mockContext } from '../../unit/mocks/ctx-mock.js'
import ContactController from '../../../src/controllers/rest-api/contact/controller.js'
// Mock data
// const mockData = require('./mocks/contact-mocks')
const LOCALHOST = `http://localhost:${config.port}`
const mockContext = require('../../unit/mocks/ctx-mock').context
const ContactController = require('../../../src/controllers/rest-api/contact/controller')
let uut
let sandbox
+7 -9
View File
@@ -1,17 +1,15 @@
const config = require('../../../config')
const assert = require('chai').assert
import config from '../../../config/index.js'
import { assert } from 'chai'
import axios from 'axios'
import sinon from 'sinon'
import util from 'util'
const axios = require('axios').default
const sinon = require('sinon')
const util = require('util')
import LogsController from '../../../src/controllers/rest-api/logs/controller.js'
import { context as mockContext } from '../../unit/mocks/ctx-mock.js'
util.inspect.defaultOptions = { depth: 1 }
const LOCALHOST = `http://localhost:${config.port}`
const LogsController = require('../../../src/controllers/rest-api/logs/controller')
const mockContext = require('../../unit/mocks/ctx-mock').context
let sandbox
let uut
describe('LogsApi', () => {
@@ -1,12 +1,10 @@
const assert = require('chai').assert
const testUtils = require('../../utils/test-utils')
const Validators = require('../../../src/controllers/rest-api/middleware/validators')
const sinon = require('sinon')
const mockContext = require('../../unit/mocks/ctx-mock').context
const util = require('util')
/*
import { assert } from 'chai';
import testUtils from '../../utils/test-utils.js';
import Validators from '../../../src/controllers/rest-api/middleware/validators.js';
import sinon from 'sinon';
import { context as mockContext } from '../../unit/mocks/ctx-mock.js';
import util from 'util';
util.inspect.defaultOptions = { depth: 1 }
const context = {}
@@ -303,3 +301,4 @@ describe('Validators', () => {
})
})
})
*/
+4 -7
View File
@@ -1,10 +1,7 @@
const assert = require('chai').assert
const Admin = require('../../../src/adapters/admin')
const sinon = require('sinon')
const util = require('util')
import { assert } from 'chai'
import Admin from '../../../src/adapters/admin.js'
import sinon from 'sinon'
import util from 'util'
util.inspect.defaultOptions = { depth: 1 }
let sandbox
+1 -1
View File
@@ -6,7 +6,7 @@
// const assert = require('chai').assert
// const axios = require('axios').default
const sinon = require('sinon')
import sinon from 'sinon'
// const LOCALHOST = `http://localhost:${config.port}`
+1 -1
View File
@@ -5,7 +5,7 @@
Ensure the REST API is up an running before running this test.
*/
const axios = require('axios')
import axios from 'axios'
const LOCALHOST = 'http://localhost:5700'
+1 -1
View File
@@ -2,7 +2,7 @@
Part 2 of 3: Take an offer by submiting a counter-offer.
*/
const axios = require('axios')
import axios from 'axios'
const LOCALHOST = 'http://localhost:5700'
@@ -10,10 +10,10 @@
*/
// Public npm libraries
const BCHJS = require('@psf/bch-js')
import BCHJS from '@psf/bch-js'
// Local libraries
const P2wdbAdapter = require('../../../src/adapters/p2wdb-adapter')
import P2wdbAdapter from '../../../src/adapters/p2wdb-adapter'
const wif = process.env.WIF
if (!wif) {
@@ -6,7 +6,7 @@
// const assert = require('chai').assert
// Local libraries.
const WalletAdapter = require('../../../src/adapters/wallet')
import WalletAdapter from '../../../src/adapters/wallet'
describe('#wallet', () => {
let uut
@@ -6,11 +6,12 @@
*/
// Public npm libraries
const assert = require('chai').assert
import { assert } from 'chai'
// Local npm libraries
const Adapters = require('../../../src/adapters')
const Offer = require('../../../src/use-cases/offer')
import Adapters from '../../../src/adapters'
import Offer from '../../../src/use-cases/offer'
describe('#offer-use-case.js', () => {
let uut
+4 -3
View File
@@ -3,11 +3,12 @@
*/
// Global npm libraries
const assert = require('chai').assert
const sinon = require('sinon')
import { assert } from 'chai'
import sinon from 'sinon'
// Local libraries
const Adapters = require('../../../src/adapters')
import Adapters from '../../../src/adapters/index.js'
describe('#adapters', () => {
let uut, sandbox
+4 -7
View File
@@ -1,10 +1,7 @@
const assert = require('chai').assert
const BCHJS = require('../../../src/adapters/bch')
const sinon = require('sinon')
const util = require('util')
import { assert } from 'chai'
import BCHJS from '../../../src/adapters/bch.js'
import sinon from 'sinon'
import util from 'util'
util.inspect.defaultOptions = { depth: 1 }
// const mockData = require('../mocks/bchjs-mock')
+3 -4
View File
@@ -1,7 +1,6 @@
const assert = require('chai').assert
const sinon = require('sinon')
const ContactLib = require('../../../src/adapters/contact')
import { assert } from 'chai'
import sinon from 'sinon'
import ContactLib from '../../../src/adapters/contact.js'
let uut
let sandbox
@@ -3,10 +3,10 @@
*/
const assert = require('chai').assert
const sinon = require('sinon')
import { assert } from 'chai'
const FullStackJWT = require('../../../src/adapters/fullstack-jwt')
import sinon from 'sinon'
import FullStackJWT from '../../../src/adapters/fullstack-jwt.js'
describe('#FullStackJWT', () => {
let sandbox
+23 -8
View File
@@ -2,20 +2,20 @@
Unit tests for the IPFS Adapter.
*/
const assert = require('chai').assert
const sinon = require('sinon')
import { assert } from 'chai'
const IPFSCoordAdapter = require('../../../src/adapters/ipfs/ipfs-coord')
const IPFSMock = require('../mocks/ipfs-mock')
const IPFSCoordMock = require('../mocks/ipfs-coord-mock')
const config = require('../../../config')
import sinon from 'sinon'
import IPFSCoordAdapter from '../../../src/adapters/ipfs/ipfs-coord.js'
import create from '../mocks/ipfs-mock.js'
import IPFSCoordMock from '../mocks/ipfs-coord-mock.js'
import config from '../../../config/index.js'
describe('#IPFS', () => {
let uut
let sandbox
beforeEach(() => {
const ipfs = IPFSMock.create()
const ipfs = create()
uut = new IPFSCoordAdapter({ ipfs })
sandbox = sinon.createSandbox()
@@ -52,7 +52,7 @@ describe('#IPFS', () => {
it('should get the public IP address if this node is a Circuit Relay', async () => {
// Mock dependencies.
uut.IpfsCoord = IPFSCoordMock
sandbox.stub(uut.publicIp, 'v4').returns('123')
sandbox.stub(uut.publicIp, 'v4').resolves('123')
// Force Circuit Relay
uut.config.isCircuitRelay = true
@@ -62,6 +62,21 @@ describe('#IPFS', () => {
assert.equal(result, true)
})
it('should exit quietly if this node is a Circuit Relay and there is an issue getting the IP address', async () => {
// Mock dependencies.
uut.IpfsCoord = IPFSCoordMock
sandbox.stub(uut.publicIp, 'v4').rejects(new Error('test error'))
// Force Circuit Relay
uut.config.isCircuitRelay = true
const result = await uut.start()
// console.log('result: ', result)
assert.equal(result, true)
})
it('should return a promise that resolves into an instance of IPFS in production mode', async () => {
uut.config.isProduction = true
// Mock dependencies.
@@ -2,12 +2,12 @@
Unit tests for the index.js file for the IPFS and ipfs-coord libraries.
*/
const assert = require('chai').assert
const sinon = require('sinon')
import { assert } from 'chai'
const IPFSLib = require('../../../src/adapters/ipfs')
const IPFSMock = require('../mocks/ipfs-mock')
const IPFSCoordMock = require('../mocks/ipfs-coord-mock')
import sinon from 'sinon'
import IPFSLib from '../../../src/adapters/ipfs/index.js'
// import create from '../mocks/ipfs-mock.js'
import IPFSCoordMock from '../mocks/ipfs-coord-mock.js'
describe('#IPFS-adapter-index', () => {
let uut
@@ -24,7 +24,9 @@ describe('#IPFS-adapter-index', () => {
describe('#start', () => {
it('should return a promise that resolves into an instance of IPFS.', async () => {
// Mock dependencies.
uut.ipfsAdapter = new IPFSMock()
uut.ipfsAdapter = {
start: async () => {}
}
uut.IpfsCoordAdapter = IPFSCoordMock
const result = await uut.start()
+9 -8
View File
@@ -2,11 +2,12 @@
Unit tests for the IPFS Adapter.
*/
const assert = require('chai').assert
const sinon = require('sinon')
const IPFSLib = require('../../../src/adapters/ipfs/ipfs')
const IPFSMock = require('../mocks/ipfs-mock')
const config = require('../../../config')
import { assert } from 'chai'
import sinon from 'sinon'
import IPFSLib from '../../../src/adapters/ipfs/ipfs.js'
import create from '../mocks/ipfs-mock.js'
import config from '../../../config/index.js'
// config.isProduction = true;
describe('#IPFS-adapter', () => {
@@ -44,7 +45,7 @@ describe('#IPFS-adapter', () => {
describe('#start', () => {
it('should return a promise that resolves into an instance of IPFS.', async () => {
// Mock dependencies.
uut.IPFS = IPFSMock
uut.create = create
const result = await uut.start()
// console.log('result: ', result)
@@ -56,7 +57,7 @@ describe('#IPFS-adapter', () => {
it('should return a promise that resolves into an instance of IPFS in production mode.', async () => {
// Mock dependencies.
uut.IPFS = IPFSMock
uut.create = create
uut.config.isProduction = true
const result = await uut.start()
// console.log('result: ', result)
@@ -69,7 +70,7 @@ describe('#IPFS-adapter', () => {
it('should catch and throw an error', async () => {
try {
// Force an error
sandbox.stub(uut.IPFS, 'create').rejects(new Error('test error'))
sandbox.stub(uut, 'create').rejects(new Error('test error'))
await uut.start()
+10 -6
View File
@@ -2,14 +2,18 @@
Unit tests for the JSON File adapter.
*/
const assert = require('chai').assert
const fs = require('fs')
const sinon = require('sinon')
import { assert } from 'chai'
import fs from 'fs'
import sinon from 'sinon'
import util from 'util'
const util = require('util')
import JsonFiles from '../../../src/adapters/json-files.js'
// Hack to get __dirname back.
// https://blog.logrocket.com/alternatives-dirname-node-js-es-modules/
import * as url from 'url'
util.inspect.defaultOptions = { depth: 1 }
const JsonFiles = require('../../../src/adapters/json-files')
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
const JSON_FILE = 'test-json-file.json'
const JSON_PATH = `${__dirname.toString()}/${JSON_FILE}`
+9 -6
View File
@@ -1,12 +1,15 @@
const assert = require('chai').assert
import { assert } from 'chai'
import sinon from 'sinon'
import util from 'util'
const sinon = require('sinon')
import LogsApiLib from '../../../src/adapters/logapi.js'
import mockData from '../mocks/log-api-mock.js'
const util = require('util')
// Hack to get __dirname back.
// https://blog.logrocket.com/alternatives-dirname-node-js-es-modules/
import * as url from 'url'
util.inspect.defaultOptions = { depth: 1 }
const LogsApiLib = require('../../../src/adapters/logapi')
const mockData = require('../mocks/log-api-mock')
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
const context = {}
let sandbox
@@ -3,10 +3,10 @@
*/
// Public npm libraries
const assert = require('chai').assert
const sinon = require('sinon')
import { assert } from 'chai'
const NodeMailer = require('../../../src/adapters/nodemailer')
import sinon from 'sinon'
import NodeMailer from '../../../src/adapters/nodemailer.js'
let sandbox
let uut
+8 -6
View File
@@ -6,14 +6,16 @@
*/
// Public npm libraries.
const assert = require('chai').assert
const sinon = require('sinon')
const mongoose = require('mongoose')
import { assert } from 'chai'
import sinon from 'sinon'
import mongoose from 'mongoose'
// Local libraries.
const OrderPagination = require('../../../src/adapters/localdb/order-pagination')
const Order = require('../../../src/adapters/localdb/models/order')
const config = require('../../../config')
import OrderPagination from '../../../src/adapters/localdb/order-pagination.js'
import Order from '../../../src/adapters/localdb/models/order.js'
import config from '../../../config/index.js'
describe('#OrderPagination', () => {
let uut, sandbox
+6 -4
View File
@@ -3,13 +3,15 @@
*/
// Public npm libraries.
const assert = require('chai').assert
const sinon = require('sinon')
import { assert } from 'chai'
import sinon from 'sinon'
// const BCHJS = require('@psf/bch-js')
const BchWallet = require('minimal-slp-wallet/index.js')
import BchWallet from 'minimal-slp-wallet/index.js'
// Local libraries.
const P2wdbAdapter = require('../../../src/adapters/p2wdb-adapter')
import P2wdbAdapter from '../../../src/adapters/p2wdb-adapter.js'
describe('#P2wdbAdapter', () => {
let uut, sandbox, bchWallet

Some files were not shown because too many files have changed in this diff Show More