szurubooru/client/js/controllers/users_controller.js

245 lines
8.2 KiB
JavaScript
Raw Normal View History

'use strict';
const page = require('page');
const api = require('../api.js');
const config = require('../config.js');
2016-04-07 19:03:49 +02:00
const events = require('../events.js');
const misc = require('../util/misc.js');
const views = require('../util/views.js');
const topNavController = require('../controllers/top_nav_controller.js');
2016-04-10 22:13:01 +02:00
const pageController = require('../controllers/page_controller.js');
const RegistrationView = require('../views/registration_view.js');
const UserView = require('../views/user_view.js');
2016-04-10 22:13:01 +02:00
const UserListView = require('../views/user_list_view.js');
const EmptyView = require('../views/empty_view.js');
class UsersController {
constructor() {
this.registrationView = new RegistrationView();
this.userView = new UserView();
2016-04-10 22:13:01 +02:00
this.userListView = new UserListView();
this.emptyView = new EmptyView();
}
registerRoutes() {
page('/register', () => { this.createUserRoute(); });
2016-04-10 22:13:01 +02:00
page(
'/users/:query?',
(ctx, next) => { misc.parseSearchQueryRoute(ctx, next); },
(ctx, next) => { this.listUsersRoute(ctx, next); });
page(
'/user/:name',
2016-04-06 22:34:21 +02:00
(ctx, next) => { this.loadUserRoute(ctx, next); },
(ctx, next) => { this.showUserRoute(ctx, next); });
page(
'/user/:name/edit',
2016-04-06 22:34:21 +02:00
(ctx, next) => { this.loadUserRoute(ctx, next); },
(ctx, next) => { this.editUserRoute(ctx, next); });
2016-04-09 09:52:00 +02:00
page(
'/user/:name/delete',
(ctx, next) => { this.loadUserRoute(ctx, next); },
(ctx, next) => { this.deleteUserRoute(ctx, next); });
2016-04-12 23:49:46 +02:00
page.exit(/\/users\/.*/, (ctx, next) => {
pageController.stop();
next();
});
page.exit(/\/user\/.*/, (ctx, next) => {
this.user = null;
next();
});
}
2016-04-10 22:13:01 +02:00
listUsersRoute(ctx, next) {
topNavController.activate('users');
2016-04-10 22:13:01 +02:00
pageController.run({
requestPage: page => {
return api.get(
'/users/?query={text}&page={page}&pageSize=30'.format({
text: ctx.searchQuery.text,
page: page}));
},
clientUrl: '/users/' + misc.formatSearchQuery({
text: ctx.searchQuery.text, page: '{page}'}),
2016-04-10 22:13:01 +02:00
initialPage: ctx.searchQuery.page,
pageRenderer: this.userListView,
});
}
createUserRoute() {
topNavController.activate('register');
this.registrationView.render({
register: (...args) => {
return this._register(...args);
}});
}
loadUserRoute(ctx, next) {
if (ctx.state.user) {
next();
} else if (this.user && this.user.name == ctx.params.name) {
ctx.state.user = this.user;
next();
} else {
api.get('/user/' + ctx.params.name).then(response => {
ctx.state.user = response.user;
ctx.save();
this.user = response.user;
next();
2016-04-09 23:41:56 +02:00
}, response => {
this.emptyView.render();
events.notify(events.Error, response.description);
});
}
}
2016-04-09 09:52:00 +02:00
showUserRoute(ctx, next) {
this._show(ctx.state.user, 'summary');
}
editUserRoute(ctx, next) {
this._show(ctx.state.user, 'edit');
}
deleteUserRoute(ctx, next) {
this._show(ctx.state.user, 'delete');
}
_register(name, password, email) {
const data = {
name: name,
password: password,
email: email
};
return new Promise((resolve, reject) => {
api.post('/users/', data).then(() => {
api.forget();
2016-04-09 23:41:56 +02:00
return api.login(name, password, false);
}, response => {
return Promise.reject(response.description);
}).then(() => {
resolve();
page('/');
events.notify(events.Success, 'Welcome aboard!');
}, errorMessage => {
reject();
2016-04-09 23:41:56 +02:00
events.notify(events.Error, errorMessage);
});
});
}
2016-04-10 15:55:56 +02:00
_edit(user, data) {
let files = [];
if (!data.name) {
delete data.name;
}
if (!data.password) {
delete data.password;
}
if (!data.email) {
delete data.email;
}
if (!data.rank) {
delete data.rank;
}
if (!data.avatarStyle ||
(data.avatarStyle == user.avatarStyle && !data.avatarContent)) {
delete data.avatarStyle;
}
if (data.avatarContent) {
files.avatar = data.avatarContent;
}
const isLoggedIn = api.isLoggedIn() && api.user.id == user.id;
return new Promise((resolve, reject) => {
2016-04-10 15:55:56 +02:00
api.put('/user/' + user.name, data, files)
.then(response => {
2016-04-10 15:55:56 +02:00
this.user = response.user;
2016-04-09 23:41:56 +02:00
return isLoggedIn ?
api.login(
2016-04-10 15:55:56 +02:00
data.name || api.userName,
data.password || api.userPassword,
false) :
2016-04-09 23:41:56 +02:00
Promise.fulfill();
}, response => {
return Promise.reject(response.description);
}).then(() => {
resolve();
2016-04-10 15:55:56 +02:00
if (data.name && data.name !== user.name) {
page('/user/' + data.name + '/edit');
}
2016-04-09 23:41:56 +02:00
events.notify(events.Success, 'Settings updated.');
}, errorMessage => {
reject();
2016-04-09 23:41:56 +02:00
events.notify(events.Error, errorMessage);
});
});
2016-04-06 22:34:21 +02:00
}
2016-04-09 09:52:00 +02:00
_delete(user) {
const isLoggedIn = api.isLoggedIn() && api.user.id == user.id;
return new Promise((resolve, reject) => {
api.delete('/user/' + user.name)
.then(response => {
if (isLoggedIn) {
api.forget();
2016-04-09 09:52:00 +02:00
api.logout();
}
resolve();
if (api.hasPrivilege('users:list')) {
page('/users');
} else {
page('/');
}
events.notify(events.Success, 'Account deleted');
2016-04-09 23:41:56 +02:00
}, response => {
2016-04-09 09:52:00 +02:00
reject();
events.notify(events.Error, response.description);
});
});
}
2016-04-06 22:34:21 +02:00
_show(user, section) {
const isLoggedIn = api.isLoggedIn() && api.user.id == user.id;
const infix = isLoggedIn ? 'self' : 'any';
const myRankIdx = api.user ? config.ranks.indexOf(api.user.rank) : 0;
const rankNames = Object.values(config.rankNames);
let ranks = {};
for (let rankIdx of misc.range(config.ranks.length)) {
const rankIdentifier = config.ranks[rankIdx];
if (rankIdentifier === 'anonymous') {
continue;
}
if (rankIdx > myRankIdx) {
continue;
}
ranks[rankIdentifier] = rankNames[rankIdx];
}
if (isLoggedIn) {
topNavController.activate('account');
} else {
topNavController.activate('users');
}
2016-04-06 22:34:21 +02:00
this.userView.render({
user: user,
section: section,
isLoggedIn: isLoggedIn,
canEditName: api.hasPrivilege('users:edit:' + infix + ':name'),
canEditPassword: api.hasPrivilege('users:edit:' + infix + ':pass'),
canEditEmail: api.hasPrivilege('users:edit:' + infix + ':email'),
canEditRank: api.hasPrivilege('users:edit:' + infix + ':rank'),
canEditAvatar: api.hasPrivilege('users:edit:' + infix + ':avatar'),
canEditAnything: api.hasPrivilege('users:edit:' + infix),
2016-04-09 09:52:00 +02:00
canDelete: api.hasPrivilege('users:delete:' + infix),
ranks: ranks,
edit: (...args) => { return this._edit(user, ...args); },
2016-04-09 09:52:00 +02:00
delete: (...args) => { return this._delete(user, ...args); },
});
}
}
module.exports = new UsersController();