lad
Version:
Lad is the best Node.js framework. Made by a former Express TC and Koa team member.
110 lines (89 loc) • 2.84 kB
JavaScript
const paginate = require('koa-ctx-paginate');
const { boolean } = require('boolean');
const { Users } = require('../../../models');
const config = require('../../../../config');
async function list(ctx) {
const [users, itemCount] = await Promise.all([
Users.find({})
.limit(ctx.query.limit)
.skip(ctx.paginate.skip)
.lean()
.sort('-created_at')
.exec(),
Users.countDocuments({})
]);
const pageCount = Math.ceil(itemCount / ctx.query.limit);
return ctx.render('admin/users', {
users,
pageCount,
itemCount,
pages: paginate.getArrayPages(ctx)(3, pageCount, ctx.query.page)
});
}
async function retrieve(ctx) {
ctx.state.result = await Users.findById(ctx.params.id);
if (!ctx.state.result) throw ctx.translateError('INVALID_USER');
return ctx.render('admin/users/retrieve');
}
async function update(ctx) {
const user = await Users.findById(ctx.params.id);
if (!user) throw ctx.translateError('INVALID_USER');
const { body } = ctx.request;
user[config.passport.fields.givenName] =
body[config.passport.fields.givenName];
user[config.passport.fields.familyName] =
body[config.passport.fields.familyName];
user[config.passport.fields.otpEnabled] =
body[config.passport.fields.otpEnabled];
user.email = body.email;
user.group = body.group;
if (boolean(!body[config.passport.fields.otpEnabled]))
user[config.userFields.pendingRecovery] = false;
await user.save();
if (user.id === ctx.state.user.id) await ctx.login(user);
ctx.flash('custom', {
title: ctx.request.t('Success'),
text: ctx.translate('REQUEST_OK'),
type: 'success',
toast: true,
showConfirmButton: false,
timer: 3000,
position: 'top'
});
if (ctx.accepts('html')) ctx.redirect('back');
else ctx.body = { reloadPage: true };
}
async function remove(ctx) {
const user = await Users.findById(ctx.params.id);
if (!user) throw ctx.translateError('INVALID_USER');
await user.remove();
ctx.flash('custom', {
title: ctx.request.t('Success'),
text: ctx.translate('REQUEST_OK'),
type: 'success',
toast: true,
showConfirmButton: false,
timer: 3000,
position: 'top'
});
if (ctx.accepts('html')) ctx.redirect('back');
else ctx.body = { reloadPage: true };
}
async function login(ctx) {
const user = await Users.findById(ctx.params.id);
if (!user) throw ctx.translateError('INVALID_USER');
ctx.logout();
await ctx.login(user);
ctx.flash('custom', {
title: ctx.request.t('Success'),
text: ctx.translate('REQUEST_OK'),
type: 'success',
toast: true,
showConfirmButton: false,
timer: 3000,
position: 'top'
});
if (ctx.accepts('html')) ctx.redirect('/');
else ctx.body = { redirectTo: '/' };
}
module.exports = { list, retrieve, update, remove, login };