11 changed files with 401 additions and 50 deletions
@ -0,0 +1,96 @@ |
|||||
|
// admin/core-user.js
|
||||
|
// Copyright (C) 2022 DTP Technologies, LLC
|
||||
|
// License: Apache-2.0
|
||||
|
|
||||
|
'use strict'; |
||||
|
|
||||
|
const express = require('express'); |
||||
|
// const multer = require('multer');
|
||||
|
|
||||
|
const { SiteController, SiteError } = require('../../../lib/site-lib'); |
||||
|
|
||||
|
class CoreUserController extends SiteController { |
||||
|
|
||||
|
constructor (dtp) { |
||||
|
super(dtp, module.exports); |
||||
|
} |
||||
|
|
||||
|
async start ( ) { |
||||
|
// const upload = multer({ dest: `/tmp/${this.dtp.config.site.domainKey}/upload` });
|
||||
|
|
||||
|
const router = express.Router(); |
||||
|
router.use(async (req, res, next) => { |
||||
|
res.locals.currentView = 'admin'; |
||||
|
res.locals.adminView = 'core-user'; |
||||
|
return next(); |
||||
|
}); |
||||
|
|
||||
|
router.param('coreUserId', this.populateCoreUserId.bind(this)); |
||||
|
|
||||
|
router.post('/:coreUserId', this.postUpdateCoreUser.bind(this)); |
||||
|
|
||||
|
router.get('/:coreUserId', this.getCoreUserView.bind(this)); |
||||
|
router.get('/', this.getIndex.bind(this)); |
||||
|
|
||||
|
return router; |
||||
|
} |
||||
|
|
||||
|
async populateCoreUserId (req, res, next, coreUserId) { |
||||
|
const { coreNode: coreNodeService } = this.dtp.services; |
||||
|
try { |
||||
|
res.locals.userAccount = await coreNodeService.getUserByLocalId(coreUserId); |
||||
|
if (!res.locals.userAccount) { |
||||
|
throw new SiteError(404, 'Core Member not found'); |
||||
|
} |
||||
|
return next(); |
||||
|
} catch (error) { |
||||
|
this.log.error('failed to populate coreUserId', { coreUserId, error }); |
||||
|
return next(error); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
async postUpdateCoreUser (req, res, next) { |
||||
|
const { coreNode: coreNodeService } = this.dtp.services; |
||||
|
try { |
||||
|
await coreNodeService.updateUserForAdmin(res.locals.userAccount, req.body); |
||||
|
res.redirect('/admin/core-user'); |
||||
|
} catch (error) { |
||||
|
return next(error); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
async getCoreUserView (req, res, next) { |
||||
|
const { comment: commentService } = this.dtp.services; |
||||
|
try { |
||||
|
res.locals.pagination = this.getPaginationParameters(req, 20); |
||||
|
res.locals.recentComments = await commentService.getForAuthor(res.locals.userAccount, res.locals.pagination); |
||||
|
res.render('admin/core-user/form'); |
||||
|
} catch (error) { |
||||
|
this.log.error('failed to produce user view', { error }); |
||||
|
return next(error); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
async getIndex (req, res, next) { |
||||
|
const { coreNode: coreNodeService } = this.dtp.services; |
||||
|
const search = { }; |
||||
|
try { |
||||
|
res.locals.pagination = this.getPaginationParameters(req, 20); |
||||
|
res.locals.users = await coreNodeService.searchUsers(search, res.locals.pagination); |
||||
|
res.render('admin/core-user/index'); |
||||
|
} catch (error) { |
||||
|
this.log.error('failed to render Core User home', { |
||||
|
search, |
||||
|
pagination: res.locals.pagination, |
||||
|
error, |
||||
|
}); |
||||
|
return next(error); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = { |
||||
|
name: 'adminCoreUser', |
||||
|
slug: 'admin-core-user', |
||||
|
create: async (dtp) => { return new CoreUserController(dtp); }, |
||||
|
}; |
@ -0,0 +1,120 @@ |
|||||
|
extends ../layouts/main |
||||
|
block content |
||||
|
|
||||
|
include ../../comment/components/comment-review |
||||
|
|
||||
|
div(uk-grid).uk-grid-small |
||||
|
div(class="uk-width-1-1 uk-width-2-3@l") |
||||
|
form(method="POST", action=`/admin/core-user/${userAccount._id}`).uk-form |
||||
|
input(type="hidden", name="username", value= userAccount.username) |
||||
|
input(type="hidden", name="displayName", value= userAccount.displayName) |
||||
|
.uk-card.uk-card-default.uk-card-small |
||||
|
.uk-card-header |
||||
|
if userAccount.displayName |
||||
|
.uk-text-large= userAccount.displayName |
||||
|
div |
||||
|
a(href=`/user/${userAccount._id}`) @#{userAccount.username} |
||||
|
|
||||
|
.uk-card-body |
||||
|
.uk-margin |
||||
|
label(for="bio").uk-form-label Bio |
||||
|
textarea(id="bio", name="bio", rows="3", placeholder="Enter profile bio").uk-textarea= userAccount.bio |
||||
|
|
||||
|
.uk-margin |
||||
|
label.uk-form-label Flags |
||||
|
div(uk-grid).uk-grid-small |
||||
|
label |
||||
|
input(id="is-admin", name="isAdmin", type="checkbox", checked= userAccount.flags.isAdmin) |
||||
|
| Admin |
||||
|
label |
||||
|
input(id="is-moderator", name="isModerator", type="checkbox", checked= userAccount.flags.isModerator) |
||||
|
| Moderator |
||||
|
label |
||||
|
input(id="is-email-verified", name="isEmailVerified", type="checkbox", checked= userAccount.flags.isEmailVerified) |
||||
|
| Email Verified |
||||
|
|
||||
|
.uk-margin |
||||
|
label.uk-form-label Permissions |
||||
|
.uk-margin |
||||
|
div(uk-grid).uk-grid-small |
||||
|
label |
||||
|
input(id="can-login", name="canLogin", type="checkbox", checked= userAccount.permissions.canLogin) |
||||
|
| Can Login |
||||
|
label |
||||
|
input(id="can-chat", name="canChat", type="checkbox", checked= userAccount.permissions.canChat) |
||||
|
| Can Chat |
||||
|
label |
||||
|
input(id="can-comment", name="canComment", type="checkbox", checked= userAccount.permissions.canComment) |
||||
|
| Can Comment |
||||
|
label |
||||
|
input(id="can-report", name="canReport", type="checkbox", checked= userAccount.permissions.canReport) |
||||
|
| Can Report |
||||
|
|
||||
|
.uk-margin |
||||
|
label.uk-form-label Opt-Ins |
||||
|
div(uk-grid).uk-grid-small |
||||
|
label |
||||
|
input(id="optin-system", name="optInSystem", type="checkbox", checked= userAccount.optIn.system) |
||||
|
| System |
||||
|
label |
||||
|
input(id="optin-marketing", name="optInMarketing", type="checkbox", checked= userAccount.optIn.marketing) |
||||
|
| Marketing |
||||
|
|
||||
|
.uk-card-footer |
||||
|
div(uk-grid).uk-grid-small |
||||
|
.uk-width-expand |
||||
|
+renderBackButton() |
||||
|
.uk-width-auto |
||||
|
button(type="submit").uk-button.uk-button-primary Update User |
||||
|
|
||||
|
div(class="uk-width-1-1 uk-width-1-3@l") |
||||
|
|
||||
|
.uk-margin |
||||
|
.uk-card.uk-card-default.uk-card-small |
||||
|
.uk-card-header |
||||
|
h4.uk-card-title |
||||
|
div(uk-grid).uk-grid-small |
||||
|
.uk-width-expand |
||||
|
div= userAccount.core.meta.name |
||||
|
.uk-width-auto |
||||
|
img(src="/img/icon/dtp-core.svg", alt="DTP Core Icon", style="height: 1em; width: auto;") |
||||
|
|
||||
|
.uk-card-body |
||||
|
.uk-margin |
||||
|
label.uk-form-label Description |
||||
|
div= userAccount.core.meta.description |
||||
|
|
||||
|
.uk-margin |
||||
|
div(uk-grid) |
||||
|
.uk-width-auto |
||||
|
label.uk-form-label Name |
||||
|
div= userAccount.core.meta.name |
||||
|
.uk-width-auto |
||||
|
label.uk-form-label Created |
||||
|
div= moment(userAccount.core.created).fromNow() |
||||
|
.uk-width-auto |
||||
|
label.uk-form-label Updated |
||||
|
div= moment(userAccount.core.updated).fromNow() |
||||
|
|
||||
|
.uk-margin |
||||
|
div(uk-grid) |
||||
|
.uk-width-auto |
||||
|
label.uk-form-label Domain |
||||
|
div= userAccount.core.meta.domain |
||||
|
.uk-width-auto |
||||
|
label.uk-form-label Domain Key |
||||
|
div= userAccount.core.meta.domainKey |
||||
|
|
||||
|
.uk-margin |
||||
|
.uk-card.uk-card-default.uk-card-small |
||||
|
.uk-card-header |
||||
|
h4.uk-card-title Recent Comments |
||||
|
|
||||
|
.uk-card-body |
||||
|
if Array.isArray(recentComments) && (recentComments.length > 0) |
||||
|
ul.uk-list.uk-list-divider |
||||
|
each comment in recentComments |
||||
|
li |
||||
|
+renderCommentReview(comment) |
||||
|
else |
||||
|
div #{userAccount.displayName || userAccount.uslername} has no recent comments. |
@ -0,0 +1,33 @@ |
|||||
|
extends ../layouts/main |
||||
|
block content |
||||
|
h1 Core Users |
||||
|
|
||||
|
if Array.isArray(users) && (users.length > 0) |
||||
|
.uk-overflow-auto |
||||
|
table.uk-table.uk-table-divider.uk-table-small.uk-table-justify |
||||
|
thead |
||||
|
th Username |
||||
|
th Display Name |
||||
|
th Created |
||||
|
th Core |
||||
|
th Core Domain |
||||
|
th Core User ID |
||||
|
th User ID |
||||
|
tbody |
||||
|
each userAccount in users |
||||
|
tr |
||||
|
td |
||||
|
a(href=`/admin/core-user/${userAccount._id}`)= userAccount.username |
||||
|
td |
||||
|
if userAccount.displayName |
||||
|
a(href=`/admin/core-user/${userAccount._id}`)= userAccount.displayName |
||||
|
else |
||||
|
.uk-text-muted N/A |
||||
|
td= moment(userAccount.created).format('YYYY-MM-DD hh:mm a') |
||||
|
td= userAccount.core.meta.name |
||||
|
td= userAccount.core.meta.domainKey |
||||
|
td= userAccount.coreUserId |
||||
|
td= userAccount._id |
||||
|
|
||||
|
else |
||||
|
div There are no Core users. |
Loading…
Reference in new issue