diff --git a/src/adapters/localdb/models/smAccount.js b/src/adapters/localdb/models/smAccount.js index ff371f2..e9ef94e 100644 --- a/src/adapters/localdb/models/smAccount.js +++ b/src/adapters/localdb/models/smAccount.js @@ -10,7 +10,16 @@ import mongoose from 'mongoose' const SmAccount = new mongoose.Schema({ npub: { type: String, required: true }, bchAddr: { type: String, required: true, default: '' }, - pubkey: { type: String, required: true } + pubkey: { type: String, required: true }, + pfp: { type: String, default: '' }, + createdAt: { type: Date, default: Date.now }, + updatedAt: { type: Date, default: Date.now }, + followers: { type: Number, default: 0 }, + following: { type: Number, default: 0 }, + posts: { type: Number, default: 0 }, + likes: { type: Number, default: 0 }, + comments: { type: Number, default: 0 }, + reposts: { type: Number, default: 0 } }) export default mongoose.model('smAccount', SmAccount) diff --git a/src/controllers/rest-api/index.js b/src/controllers/rest-api/index.js index e23c7a2..7d90ab2 100644 --- a/src/controllers/rest-api/index.js +++ b/src/controllers/rest-api/index.js @@ -18,6 +18,7 @@ import OfferRouter from './offer/index.js' import OrderRouter from './order/index.js' import P2WDBRouter from './p2wdb/index.js' import UsageRESTController from './usage/index.js' +import SmAccountRouter from './smAccount/index.js' class RESTControllers { constructor (localConfig = {}) { @@ -86,6 +87,9 @@ class RESTControllers { // Attach the REST API Controllers associated with the /usage route const usageRESTController = new UsageRESTController(dependencies) usageRESTController.attach(app) + + const smAccountRouter = new SmAccountRouter(dependencies) + smAccountRouter.attach(app) } } diff --git a/src/controllers/rest-api/smAccount/controller.js b/src/controllers/rest-api/smAccount/controller.js new file mode 100644 index 0000000..7ba1e43 --- /dev/null +++ b/src/controllers/rest-api/smAccount/controller.js @@ -0,0 +1,65 @@ +/* + REST API Controller library for the /order route +*/ + +// const { wlogger } = require('../../../adapters/wlogger') + +let _this + +class SmAccountRESTControllerLib { + constructor (localConfig = {}) { + // Dependency Injection. + this.adapters = localConfig.adapters + if (!this.adapters) { + throw new Error( + 'Instance of Adapters library required when instantiating /order REST Controller.' + ) + } + this.useCases = localConfig.useCases + if (!this.useCases) { + throw new Error( + 'Instance of Use Cases library required when instantiating /order REST Controller.' + ) + } + + // Encapsulate dependencies + this.SmAccountModel = this.adapters.localdb.SmAccount + // this.userUseCases = this.useCases.user + + _this = this + } + + // curl -X GET http://localhost:5700/sm/list/all/0 + async listAccounts (ctx) { + try { + let page = ctx.params.page + if (!page) page = 0 + + const offers = await _this.useCases.smAccount.listAccounts(page) + + ctx.body = offers + } catch (err) { + console.log('Error in listAccounts REST API handler: ', err) + _this.handleError(ctx, err) + } + } + + // DRY error handler + handleError (ctx, err) { + console.log('err', err) + + // If an HTTP status is specified by the buisiness logic, use that. + if (err.status) { + if (err.message) { + ctx.throw(err.status, err.message) + } else { + ctx.throw(err.status) + } + } else { + // By default use a 422 error if the HTTP status is not specified. + ctx.throw(422, err.message) + } + } +} + +export default SmAccountRESTControllerLib diff --git a/src/controllers/rest-api/smAccount/index.js b/src/controllers/rest-api/smAccount/index.js new file mode 100644 index 0000000..349877e --- /dev/null +++ b/src/controllers/rest-api/smAccount/index.js @@ -0,0 +1,68 @@ +/* + REST API library for /order route. +*/ + +// Public npm libraries. +import Router from 'koa-router' + +// Local libraries. +import SmAccountRESTControllerLib from './controller.js' +import Validators from '../middleware/validators.js' + +let _this + +class SmAccountRouter { + constructor (localConfig = {}) { + // Dependency Injection. + this.adapters = localConfig.adapters + if (!this.adapters) { + throw new Error( + 'Instance of Adapters library required when instantiating /sm REST Controller.' + ) + } + this.useCases = localConfig.useCases + if (!this.useCases) { + throw new Error( + 'Instance of Use Cases library required when instantiating /sm REST Controller.' + ) + } + + const dependencies = { + adapters: this.adapters, + useCases: this.useCases + } + + // Encapsulate dependencies. + this.validators = new Validators() + this.smAccountRESTController = new SmAccountRESTControllerLib(dependencies) + + // Instantiate the router and set the base route. + const baseUrl = '/sm' + this.router = new Router({ prefix: baseUrl }) + + this.listAccounts = this.listAccounts.bind(this) + _this = this + } + + attach (app) { + if (!app) { + throw new Error( + 'Must pass app object when attached REST API controllers.' + ) + } + + // Define the routes and attach the controller. + this.router.get('/list/all/:page', _this.smAccountRESTController.listAccounts) + + // Attach the Controller routes to the Koa app. + app.use(_this.router.routes()) + app.use(_this.router.allowedMethods()) + } + + async listAccounts (ctx, next) { + // await _this.validators.ensureUser(ctx, next) + await _this.smAccountRESTController.listAccounts(ctx, next) + } +} + +export default SmAccountRouter diff --git a/src/controllers/timer-controllers.js b/src/controllers/timer-controllers.js index 9225acc..3dcc17b 100644 --- a/src/controllers/timer-controllers.js +++ b/src/controllers/timer-controllers.js @@ -26,7 +26,7 @@ class TimerControllers { // Constants this.cleanUsageInterval = 60000 * 60 // 1 hour this.backupUsageInterval = 60000 * 10 // 10 minutes - this.newSmAccountsInterval = 60000 * 1 // 1 minute + this.newSmAccountsInterval = 60000 * 60 // 60 minutes // Encapsulate dependencies this.config = config diff --git a/src/use-cases/smAccount-use-cases.js b/src/use-cases/smAccount-use-cases.js index fb79262..d340d36 100644 --- a/src/use-cases/smAccount-use-cases.js +++ b/src/use-cases/smAccount-use-cases.js @@ -16,6 +16,7 @@ class smAccountUseCases { // Bind 'this' object to all methods this.checkForNewSmAccounts = this.checkForNewSmAccounts.bind(this) + this.listAccounts = this.listAccounts.bind(this) } // Check for new Social Media Accounts. @@ -60,6 +61,18 @@ class smAccountUseCases { throw err } } + + // List all Social Media Accounts. + async listAccounts (page = 0) { + try { + const SmAccount = await this.adapters.localdb.SmAccount + const accounts = await SmAccount.find({}).skip(page * 10).limit(10) + return accounts + } catch (err) { + console.error('Error in smAccount-use-cases.js/listAccounts(): ', err) + throw err + } + } } export default smAccountUseCases