feat: enable user creation from admin panel

This commit is contained in:
Pitu 2021-01-05 17:03:25 +09:00
parent 4bda02813f
commit 153d764c8f
2 changed files with 99 additions and 3 deletions

View File

@ -2,6 +2,7 @@ const bcrypt = require('bcrypt');
const moment = require('moment');
const Route = require('../../structures/Route');
const log = require('../../utils/Log');
const Util = require('../../utils/Util');
class registerPOST extends Route {
constructor() {
@ -9,7 +10,10 @@ class registerPOST extends Route {
}
async run(req, res, db) {
if (process.env.USER_ACCOUNTS === 'false') return res.status(401).json({ message: 'Creation of new accounts is currently disabled' });
// Only allow admins to create new accounts if the sign up is deactivated
const user = await Util.isAuthorized(req);
if ((!user || !user.isAdmin) && process.env.USER_ACCOUNTS === 'false') return res.status(401).json({ message: 'Creation of new accounts is currently disabled' });
if (!req.body) return res.status(400).json({ message: 'No body provided' });
const { username, password } = req.body;
if (!username || !password) return res.status(401).json({ message: 'Invalid body provided' });
@ -24,8 +28,8 @@ class registerPOST extends Route {
/*
Make sure the username doesn't exist yet
*/
const user = await db.table('users').where('username', username).first();
if (user) return res.status(401).json({ message: 'Username already exists' });
const exists = await db.table('users').where('username', username).first();
if (exists) return res.status(401).json({ message: 'Username already exists' });
/*
Hash the supplied password

View File

@ -12,6 +12,56 @@
<hr>
<div class="view-container">
<button v-if="!isCreateUserOpen"
class="button is-chibisafe"
@click="isCreateUserOpen = true">
New user
</button>
<div v-if="isCreateUserOpen"
class="userCreate">
<div class="columns">
<div class="column is-4 is-offset-4">
<b-field>
<b-input
v-model="username"
class="chibisafe-input"
type="text"
placeholder="Username" />
</b-field>
<b-field>
<b-input
v-model="password"
class="chibisafe-input"
type="password"
placeholder="Password"
password-reveal
@keyup.enter.native="register" />
</b-field>
<div class="level">
<!-- Left side -->
<div class="level-left">
<div class="level-item">
<button class="button is-chibisafe"
@click="cleanUpRegister">
Cancel
</button>
</div>
</div>
<!-- Right side -->
<div class="level-right">
<p class="level-item">
<b-button
type="is-chibisafe"
:disabled="isLoading"
@click="register">
Register
</b-button>
</p>
</div>
</div>
</div>
</div>
</div>
<b-table
:data="users"
:mobile-cards="true">
@ -101,6 +151,14 @@ export default {
console.error(e);
}
}],
data() {
return {
isCreateUserOpen: false,
username: null,
password: null,
isLoading: null
};
},
computed: mapState({
users: state => state.admin.users,
config: state => state.config
@ -128,6 +186,34 @@ export default {
},
async purgeFiles(row) {
this.$handler.executeAction('admin/purgeUserFiles', row.id);
},
async register() {
if (this.isLoading) return;
if (!this.username || !this.password) {
this.$notifier.error('Please fill all fields before attempting to register.');
return;
}
this.isLoading = true;
try {
const response = await this.$store.dispatch('auth/register', {
username: this.username,
password: this.password
});
this.$store.dispatch('admin/fetchUsers');
this.$notifier.success(response.message);
return this.cleanUpRegister();
} catch (error) {
this.$notifier.error(error.message);
} finally {
this.isLoading = false;
}
},
cleanUpRegister() {
this.isCreateUserOpen = false;
this.username = null;
this.password = null;
}
},
head() {
@ -142,6 +228,12 @@ export default {
@import '~/assets/styles/_colors.scss';
div.view-container {
padding: 2rem;
> .button {
margin-bottom: 1rem;
}
.userCreate {
margin-bottom: 2rem;
}
}
div.album {
display: flex;