Browse Source

Added ability to delete an OAuth2Client (Service Node)

develop
Rob Colbert 2 years ago
parent
commit
637d0fb03b
  1. 19
      app/controllers/admin/service-node.js
  2. 9
      app/services/oauth2.js
  3. 19
      app/views/admin/service-node/editor.pug
  4. 20
      client/js/site-admin-app.js

19
app/controllers/admin/service-node.js

@ -32,6 +32,8 @@ class ServiceNodeController extends SiteController {
router.get('/:clientId', this.getClientView.bind(this));
router.get('/', this.getIndex.bind(this));
router.delete('/:clientId', this.deleteClient.bind(this));
return router;
}
@ -106,6 +108,23 @@ class ServiceNodeController extends SiteController {
return next(error);
}
}
async deleteClient (req, res) {
const { oauth2: oauth2Service } = this.dtp.services;
try {
await oauth2Service.removeClient(res.locals.serviceNode);
const displayList = this.createDisplayList('delete-newsletter');
displayList.navigateTo('/admin/service-node');
res.status(200).json({ success: true, displayList });
} catch (error) {
this.log.error('failed to delete client', { clientId: res.locals.serviceNode._id, error });
return res.status(error.statusCode || 500).json({
success: false,
message: error.message,
});
}
}
}
module.exports = {

9
app/services/oauth2.js

@ -458,6 +458,15 @@ class OAuth2Service extends SiteService {
*/
return done(null, client);
}
/**
* Removes and fully de-authorizes an OAuth2Client from the system.
* @param {OAuth2Client} client the client to be removed
*/
async removeClient (client) {
this.log.info('removing client', { clientId: client._id, });
await OAuth2Client.deleteOne({ _id: client._id });
}
}
module.exports = {

19
app/views/admin/service-node/editor.pug

@ -18,15 +18,30 @@ block content
.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
textarea(id="notes", name="notes", rows="4", placeholder="Enter client notes").uk-textarea= (serviceNode.admin && serviceNode.admin.notes) ? serviceNode.admin.notes : undefined
.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="button",
data-service-node-id= serviceNode._id,
onclick="return dtp.adminApp.deleteServiceNode(event);"
).uk-button.uk-button-danger.uk-border-rounded
span
i.fas.fa-trash
span.uk-margin-small-left Delete
.uk-width-auto
button(type="submit").uk-button.uk-button-primary Save
button(type="submit").uk-button.uk-button-primary.uk-border-rounded
span
i.fas.fa-save
span.uk-margin-small-left Save

20
client/js/site-admin-app.js

@ -324,6 +324,26 @@ export default class DtpSiteAdminHostStatsApp extends DtpApp {
UIkit.modal.alert(`Failed to send Core Connect response: ${error.message}`);
}
}
async deleteServiceNode (event) {
const target = event.currentTarget || event.target;
const serviceNodeId = target.getAttribute('data-service-node-id');
try {
await UIkit.modal.confirm('Are you sure you want to delete the Service Node?');
} catch (error) {
return; // user cancel
}
try {
const actionUrl = `/admin/service-node/${serviceNodeId}`;
const response = await fetch(actionUrl, { method: 'DELETE' });
if (!response.ok) {
throw new Error('Server error');
}
await this.processResponse(response);
} catch (error) {
UIkit.modal.alert(`Failed to delete Service Node: ${error.message}`);
}
}
}
dtp.DtpSiteAdminHostStatsApp = DtpSiteAdminHostStatsApp;
Loading…
Cancel
Save