Browse Source

more user and link management/moderation

pull/1/head
Rob Colbert 3 years ago
parent
commit
6bcb8f5840
  1. 26
      app/controllers/admin/link.js
  2. 10
      app/controllers/admin/user.js
  3. 7
      app/controllers/link.js
  4. 11
      app/views/admin/link/editor.pug
  5. 26
      app/views/admin/user/form.pug
  6. 11
      client/less/site/button.less
  7. 5
      config/limiter.js

26
app/controllers/admin/link.js

@ -7,6 +7,8 @@
const DTP_COMPONENT_NAME = 'admin:link';
const express = require('express');
const multer = require('multer');
const { SiteController, SiteError } = require('../../../lib/site-lib');
class LinkController extends SiteController {
@ -17,6 +19,8 @@ class LinkController extends SiteController {
async start ( ) {
const router = express.Router();
const upload = multer({ dest: `/tmp/${this.dtp.config.domainKey}/uploads`});
router.use(async (req, res, next) => {
res.locals.currentView = 'admin';
res.locals.adminView = 'link';
@ -25,7 +29,7 @@ class LinkController extends SiteController {
router.param('linkId', this.populateLinkId.bind(this));
router.post('/:linkId', this.postUpdateLink.bind(this));
router.post('/:linkId', upload.none(), this.postUpdateLink.bind(this));
router.get('/:linkId', this.getLinkView.bind(this));
router.get('/', this.getIndex.bind(this));
@ -49,19 +53,29 @@ class LinkController extends SiteController {
}
}
async postUpdateLink (req, res, next) {
const { link: linkService } = this.dtp.services;
async postUpdateLink (req, res) {
const { link: linkService, displayEngine: displayEngineService } = this.dtp.services;
try {
const displayList = displayEngineService.createDisplayList('update-link');
await linkService.update(res.locals.link, req.body);
res.redirect('/admin/link');
displayList.showNotification(
`Link ${res.locals.link.label} updated successfully`,
'success', 'bottom-center', 2000,
);
res.status(200).json({ success: true, displayList });
} catch (error) {
this.log.error('failed to update link', { linkId: res.locals.link._id, error });
return next(error);
return res.status(error.statusCode || 500).json({
success: false,
message: error.message,
});
}
}
async getLinkView (req, res) {
res.render('admin/link/view');
res.render('admin/link/editor');
}
async getIndex (req, res, next) {

10
app/controllers/admin/user.js

@ -27,6 +27,7 @@ class UserController extends SiteController {
router.param('userId', this.populateUserId.bind(this));
router.post('/:userId', this.postUpdateUser.bind(this));
router.get('/:userId', this.getUserView.bind(this));
router.get('/', this.getHomeView.bind(this));
@ -53,8 +54,15 @@ class UserController extends SiteController {
}
}
async getUserView (req, res) {
async getUserView (req, res, next) {
const { link: linkService } = this.dtp.services;
try {
res.locals.userLinks = await linkService.getForUser(res.locals.userAccount);
res.render('admin/user/form');
} catch (error) {
this.log.error('failed to display user view', { error });
return next(error);
}
}
async getHomeView (req, res, next) {

7
app/controllers/link.js

@ -52,7 +52,12 @@ class LinkController extends SiteController {
this.postUpdateLink.bind(this),
);
router.post('/', authRequired, upload.none(), this.postCreateLink.bind(this));
router.post('/',
limiterService.create(limiterService.config.link.postCreateLink),
authRequired,
upload.none(),
this.postCreateLink.bind(this),
);
router.delete('/:linkId', authRequired, this.deleteLink.bind(this));
}

11
app/views/admin/link/editor.pug

@ -0,0 +1,11 @@
extends ../layouts/main
block content
form(method="POST", action=`/admin/link/${link._id}`, onsubmit="return dtp.app.submitForm(event, 'update link');").uk-form
.uk-margin
label(for="label").uk-form-label Label
input(id="label", name="label", type="text", placeholder="Enter link label", value= link.label).uk-input
.uk-margin
label(for="href").uk-form-label URL
input(id="href", name="href", type="url", placeholder="Enter link URL", value= link.href).uk-input
button(type="submit").uk-button.uk-button-primary Update Link

26
app/views/admin/user/form.pug

@ -1,15 +1,19 @@
extends ../layouts/main
block content
.uk-margin
div(uk-grid).uk-grid-small
div(class="uk-width-1-1 uk-width-2-3@l")
.uk-card.uk-card-secondary.uk-card-small
.uk-card-header
.uk-text-large= userAccount.displayName || userAccount.email
div= userAccount.username
.uk-card-body
form(method="POST", action=`/admin/user/${userAccount._id}`).uk-form
input(type="hidden", name="username", value= userAccount.username)
input(type="hidden", name="displayName", value= userAccount.displayName)
.uk-margin
label(for="bio").uk-form-label Bio
label(for="bio").uk-form-label.sr-only Bio
textarea(id="bio", name="bio", rows="4", placeholder= "Enter profile bio").uk-textarea.uk-resize-vertical= userAccount.bio
.uk-margin
@ -40,5 +44,21 @@ block content
label
input(id="can-create-links", name="canCreateLinks", type="checkbox", checked= userAccount.permissions.canCreateLinks)
| Can Create Links
.uk-card-footer
button(type="submit").uk-button.uk-button-primary Update User
div(class="uk-width-1-1 uk-width-1-3@l")
.uk-card.uk-card-secondary.uk-card-small
.uk-card-header
h4.uk-card-title #{userAccount.displayName || userAccount.username}'s Links
.uk-card-body
ul.uk-list
each link in userLinks
li
div(uk-grid).uk-grid-small
.uk-width-expand
a(href= link.href)= link.label
.uk-width-auto
a(href=`/admin/link/${link._id}`).uk-button.uk-button-default.uk-button-small
+renderButtonIcon('fa-pen', 'Edit')

11
client/less/site/button.less

@ -6,17 +6,20 @@ a.dtp-link-button {
font-size: 14px;
text-transform: uppercase;
text-decoration: none;
text-align: center;
background: none;
outline: none;
border: solid 2px #1e87f0;
color: #c8c8c8;
border: solid 2px @global-primary-background;
color: @global-color;
transition: background-color 0.2s;
transition: background-color 0.2s, color 0.2s;
&:hover {
background-color: #1e87f0;
background-color: @global-primary-background;
color: @global-inverse-color;
text-decoration: none;
}
}

5
config/limiter.js

@ -113,6 +113,11 @@ module.exports = {
expire: ONE_MINUTE,
message: 'You are sorting links too quickly',
},
postCreateLink: {
total: 10,
expire: ONE_MINUTE,
message: 'You are creating links too quickly',
},
},
/*

Loading…
Cancel
Save