From c5120d4c8a07dfa109605271f55134eb5aa49696 Mon Sep 17 00:00:00 2001 From: rob Date: Wed, 6 Jul 2022 12:59:24 -0400 Subject: [PATCH] Service Node management --- app/controllers/admin/service-node.js | 36 ++++++++++++++++++- app/models/oauth2-client.js | 3 ++ app/services/oauth2.js | 12 +++++++ .../service-node/components/list-item.pug | 14 ++++++++ app/views/admin/service-node/editor.pug | 32 +++++++++++++++++ app/views/admin/service-node/index.pug | 18 +++------- lib/site-platform.js | 3 ++ 7 files changed, 103 insertions(+), 15 deletions(-) create mode 100644 app/views/admin/service-node/components/list-item.pug create mode 100644 app/views/admin/service-node/editor.pug diff --git a/app/controllers/admin/service-node.js b/app/controllers/admin/service-node.js index d60dbdf..ed9bd22 100644 --- a/app/controllers/admin/service-node.js +++ b/app/controllers/admin/service-node.js @@ -6,7 +6,7 @@ const express = require('express'); -const { SiteController } = require('../../../lib/site-lib'); +const { SiteController, SiteError } = require('../../../lib/site-lib'); class ServiceNodeController extends SiteController { @@ -22,11 +22,45 @@ class ServiceNodeController extends SiteController { return next(); }); + router.param('clientId', this.populateClientId.bind(this)); + + router.post('/:clientId', this.postClientUpdate.bind(this)); + + router.get('/:clientId', this.getClientView.bind(this)); router.get('/', this.getIndex.bind(this)); return router; } + async populateClientId (req, res, next, clientId) { + const { oauth2: oauth2Service } = this.dtp.services; + try { + res.locals.serviceNode = await oauth2Service.getClientById(clientId); + if (!res.locals.serviceNode) { + throw new SiteError(404, 'Service node not found'); + } + return next(); + } catch (error) { + this.log.error('failed to populate OAuth2 client', { clientId, error }); + return next(error); + } + } + + async postClientUpdate (req, res, next) { + const { oauth2: oauth2Service } = this.dtp.services; + try { + await oauth2Service.updateClient(res.locals.serviceNode, req.body); + res.redirect('/admin/service-node'); + } catch (error) { + this.log.error('failed to update OAuth2 client', { error }); + return next(error); + } + } + + async getClientView (req, res) { + res.render('admin/service-node/editor'); + } + async getIndex (req, res, next) { const { oauth2: oauth2Service } = this.dtp.services; try { diff --git a/app/models/oauth2-client.js b/app/models/oauth2-client.js index 1ee82ed..087326f 100644 --- a/app/models/oauth2-client.js +++ b/app/models/oauth2-client.js @@ -24,6 +24,9 @@ const OAuth2ClientSchema = new Schema({ flags: { isActive: { type: Boolean, default: true, required: true, index: 1 }, }, + admin: { + notes: { type: String }, + }, }); OAuth2ClientSchema.index({ diff --git a/app/services/oauth2.js b/app/services/oauth2.js index 9b0f501..ff3a5dc 100644 --- a/app/services/oauth2.js +++ b/app/services/oauth2.js @@ -301,6 +301,18 @@ class OAuth2Service extends SiteService { return client.toObject(); } + async updateClient (client, clientDefinition) { + await OAuth2Client.updateOne( + { _id: client._id }, + { + $set: { + 'admin.notes': striptags(clientDefinition.notes.trim()), + 'flags.isActive': clientDefinition.isActive === 'on', + }, + }, + ); + } + async getClients (search, pagination) { search = search || { }; let query = OAuth2Client diff --git a/app/views/admin/service-node/components/list-item.pug b/app/views/admin/service-node/components/list-item.pug new file mode 100644 index 0000000..2db369d --- /dev/null +++ b/app/views/admin/service-node/components/list-item.pug @@ -0,0 +1,14 @@ +mixin renderServiceNodeListItem (node) + div(uk-grid) + .uk-width-auto + +renderCell('Name', node.site.name) + .uk-width-auto + +renderCell('Company', node.site.company) + .uk-width-auto + +renderCell('Domain', node.site.domain) + .uk-width-auto + +renderCell('Domain Key', node.site.domainKey) + .uk-width-auto + +renderCell('Connected', moment(node.created).format('MMM DD, YYYY')) + .uk-width-auto + +renderCell('Updated', moment(node.updated).format('MMM DD, YYYY')) \ No newline at end of file diff --git a/app/views/admin/service-node/editor.pug b/app/views/admin/service-node/editor.pug new file mode 100644 index 0000000..f309898 --- /dev/null +++ b/app/views/admin/service-node/editor.pug @@ -0,0 +1,32 @@ +extends ../layouts/main +block content + + include components/list-item + + form(method="post", action= `/admin/service-node/${serviceNode._id}`).uk-form + .uk-card.uk-card-default + .uk-card-header + div(uk-grid).uk-grid-collapse.uk-flex-middle + div(class="uk-width-1-1 uk-width-expand@l") + h1.uk-card-title.uk-margin-remove= serviceNode.site.name + div(class="uk-width-1-1 uk-width-auto@l") + .uk-text-small client id: #{serviceNode._id} + + .uk-card-body + .uk-margin + +renderServiceNodeListItem(serviceNode) + + .uk-margin + label(for="notes").uk-form-label Notes + textarea(id="notes", name="notes", rows="4", placeholder="Enter client notes").uk-textarea= serviceNode.admin.notes + + .uk-margin + label(for="is-active") + input(id="is-active", name="isActive", type="checkbox", checked= serviceNode.flags.isActive).uk-checkbox + span.uk-margin-small-left Is Active + .uk-card-footer + div(uk-grid).uk-grid-small + .uk-width-expand + +renderBackButton() + .uk-width-auto + button(type="submit").uk-button.uk-button-primary Save \ No newline at end of file diff --git a/app/views/admin/service-node/index.pug b/app/views/admin/service-node/index.pug index 47b77a2..1a61e45 100644 --- a/app/views/admin/service-node/index.pug +++ b/app/views/admin/service-node/index.pug @@ -1,25 +1,15 @@ extends ../layouts/main block content + include components/list-item + h1 Service Nodes if Array.isArray(serviceNodes) && (serviceNodes.length > 0) ul.uk-list.uk-list-divider each node in serviceNodes li - div(uk-grid) - .uk-width-auto - +renderCell('Name', node.site.name) - .uk-width-auto - +renderCell('Company', node.site.company) - .uk-width-auto - +renderCell('Domain', node.site.domain) - .uk-width-auto - +renderCell('Domain Key', node.site.domainKey) - .uk-width-auto - +renderCell('Connected', moment(node.created).format('MMM DD, YYYY')) - .uk-width-auto - +renderCell('Updated', moment(node.updated).format('MMM DD, YYYY')) - + a(href=`/admin/service-node/${node._id}`).uk-link-reset + +renderServiceNodeListItem(node) else p There are no registered service nodes. \ No newline at end of file diff --git a/lib/site-platform.js b/lib/site-platform.js index 22a8a41..0a5f2a8 100644 --- a/lib/site-platform.js +++ b/lib/site-platform.js @@ -257,7 +257,10 @@ module.exports.startWebServer = async (dtp) => { /* * Static file services (vendor) */ + + module.app.use('/uikit/images', cacheOneDay, express.static(path.join(dtp.config.root, 'node_modules', 'uikit', 'src', 'images'))); module.app.use('/uikit', cacheOneDay, express.static(path.join(dtp.config.root, 'node_modules', 'uikit', 'dist'))); + module.app.use('/chart.js', cacheOneDay, express.static(path.join(dtp.config.root, 'node_modules', 'chart.js', 'dist'))); module.app.use('/chartjs-adapter-moment', cacheOneDay, express.static(path.join(dtp.config.root, 'node_modules', 'chartjs-adapter-moment', 'dist'))); module.app.use('/cropperjs', cacheOneDay, express.static(path.join(dtp.config.root, 'node_modules', 'cropperjs', 'dist')));