diff --git a/hydro/handler/domain.js b/hydro/handler/domain.js index ade24319f..5721d0f48 100644 --- a/hydro/handler/domain.js +++ b/hydro/handler/domain.js @@ -1,8 +1,31 @@ const user = require('../model/user'); const domain = require('../model/domain'); +const system = require('../model/system'); const { Route, Handler } = require('../service/server'); const { PERM_MANAGE } = require('../permission'); -const { RoleAlreadyExistError, ValidationError } = require('../error'); +const { RoleAlreadyExistError, ValidationError, PermissionError } = require('../error'); + +class DomainCreateHandler extends Handler { + async prepare() { + if (this.user.priv !== 1) { + if (!await system.get('user.create_domain')) throw new PermissionError('domain_create'); + } + } + + async get() { + const path = [ + ['Hydro', '/'], + ['domain_create', null], + ]; + this.response.body = { path }; + this.response.template = 'domain_create.html'; + } + + async post({ id, name }) { + await domain.add(id, this.user._id, name); + this.response.body = { domainId: id }; + } +} class ManageHandler extends Handler { async prepare({ domainId }) { @@ -135,6 +158,7 @@ class DomainRoleHandler extends ManageHandler { } async function apply() { + Route('/domain/create', DomainCreateHandler); Route('/domain/dashboard', DomainDashboardHandler); Route('/domain/edit', DomainEditHandler); Route('/domain/user', DomainUserHandler); diff --git a/hydro/lib/nav.js b/hydro/lib/nav.js index 4efd49d65..56869bc56 100644 --- a/hydro/lib/nav.js +++ b/hydro/lib/nav.js @@ -2,9 +2,16 @@ const permission = require('../permission'); global.Hydro.ui.nav = []; -const Item = (path, name, prefix, perm) => { +const trueChecker = () => true; + +const Item = (path, name, prefix, perm, checker) => { + if (perm && checker) { + checker = ((_chk) => (handler) => _chk(handler) && handler.user.hasPerm(perm))(checker); + } else if (perm) { + checker = (handler) => handler.user.hasPerm(perm); + } else checker = trueChecker; global.Hydro.ui.nav.push({ - path, name, prefix, perm, + path, name, prefix, checker, }); }; @@ -14,6 +21,7 @@ Item('/t', 'training_main', 'training', permission.PERM_VIEW_TRAINING); Item('/homework', 'homework_main', 'homework', permission.PERM_VIEW_HOMEWORK); Item('/discuss', 'discussion_main', 'discussion', permission.PERM_VIEW_DISCUSSION); Item('/c', 'contest_main', 'contest', permission.PERM_VIEW_CONTEST); -Item('/domain', 'domain_dashboard', 'domain', permission.PERM_MANAGE); +Item('/domain/dashboard', 'domain_dashboard', 'domain', permission.PERM_MANAGE); +Item('/manage/dashboard', 'manage_dashboard', 'manage', null, (handler) => handler.user.priv === 1); global.Hydro.lib.nav = module.exports = Item; diff --git a/hydro/model/domain.js b/hydro/model/domain.js index a106c206b..0fe05d4bc 100644 --- a/hydro/model/domain.js +++ b/hydro/model/domain.js @@ -15,9 +15,11 @@ const coll = db.collection('domain'); * @param {string} domainId * @param {number} owner */ -function add(domainId, owner) { +function add(domainId, owner, name) { const tasks = [ - coll.insertOne({ _id: domainId, owner, bulletin: '' }), + coll.insertOne({ + _id: domainId, owner, name, bulletin: '', + }), ]; for (const id in builtin.BUILTIN_ROLES) { tasks.push( diff --git a/hydro/model/setting.js b/hydro/model/setting.js index 31d5de443..951a9bbd6 100644 --- a/hydro/model/setting.js +++ b/hydro/model/setting.js @@ -45,6 +45,7 @@ for (const setting in SETTINGS) SETTINGS_BY_KEY[setting.key] = setting; const SYSTEM_SETTINGS = [ Setting('setting_basic', 'user.register', null, false, 'checkbox', 'Allow register'), + Setting('setting_basic', 'user.create_domain', null, true, 'checkbox', 'Allow domain creation'), Setting('setting_smtp', 'smtp.user', null, null, 'text', 'SMTP Username'), Setting('setting_smtp', 'smtp.pass', null, null, 'password', 'SMTP Password'), Setting('setting_smtp', 'smtp.host', null, null, 'text', 'SMTP Server Host'), diff --git a/templates/domain_create.html b/templates/domain_create.html new file mode 100644 index 000000000..2f65bee08 --- /dev/null +++ b/templates/domain_create.html @@ -0,0 +1,47 @@ +{# No Compression #} +{% extends "layout/basic.html" %} +{% block content %} +
++ +{{ _('A domain ID cannot be changed after creation. It is supposed to be:') }}
++
+- {{ _('Unique') }}
+- {{ _('At least 4 characters') }}
+- {{ _('Not wrapped with space') }}
+- {{ _('Not started with a number') }}
+- {{ _('Only A-Z, a-z, 0-9 and _ are accepted') }}
+