You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.1 KiB
JavaScript
99 lines
2.1 KiB
JavaScript
const builtin = require('./builtin');
|
|
const document = require('./document');
|
|
const db = require('../service/db');
|
|
const validator = require('../lib/validator');
|
|
|
|
const coll = db.collection('domain');
|
|
|
|
/**
|
|
* @typedef {import('../interface').Pdoc} Pdoc
|
|
* @typedef {import('bson').ObjectID} ObjectID
|
|
* @typedef {import('mongodb').Cursor} Cursor
|
|
*/
|
|
|
|
/**
|
|
* @param {string} domainId
|
|
* @param {number} owner
|
|
*/
|
|
function add(domainId, owner, name) {
|
|
const tasks = [
|
|
coll.insertOne({
|
|
_id: domainId, owner, name, bulletin: '',
|
|
}),
|
|
];
|
|
for (const id in builtin.BUILTIN_ROLES) {
|
|
tasks.push(
|
|
document.add(
|
|
domainId, builtin.BUILTIN_ROLES[id].perm, owner,
|
|
document.TYPE_DOMAIN_USER, id,
|
|
),
|
|
);
|
|
}
|
|
return Promise.all(tasks);
|
|
}
|
|
|
|
/**
|
|
* @param {string} domainId
|
|
* @returns {Ddoc}
|
|
*/
|
|
async function get(domainId) {
|
|
return coll.findOne({ _id: domainId });
|
|
}
|
|
|
|
/**
|
|
* @param {object} query
|
|
* @param {object} sort
|
|
* @param {number} page
|
|
* @param {number} limit
|
|
* @returns {Ddoc[]}
|
|
*/
|
|
function getMany(query, sort, page, limit) {
|
|
return coll.find(query).sort(sort).skip((page - 1) * limit).limit(limit)
|
|
.toArray();
|
|
}
|
|
|
|
/**
|
|
* @param {object} query
|
|
* @returns {Cursor}
|
|
*/
|
|
function getMulti(query) {
|
|
return coll.find(query);
|
|
}
|
|
|
|
/**
|
|
* @param {string} domainId
|
|
* @param {object} $set
|
|
* @returns {Ddoc}
|
|
*/
|
|
function edit(domainId, $set) {
|
|
if ($set.title) validator.checkTitle($set.title);
|
|
if ($set.content) validator.checkContent($set.content);
|
|
return coll.updateOne({ _id: domainId }, { $set });
|
|
}
|
|
|
|
async function inc(domainId, field, n) {
|
|
const res = await coll.findOneAndUpdate(
|
|
{ _id: domainId },
|
|
{ $inc: { [field]: n } },
|
|
{ returnOriginal: false },
|
|
);
|
|
return res.value;
|
|
}
|
|
|
|
async function getList(domainIds) {
|
|
const r = {};
|
|
// eslint-disable-next-line no-await-in-loop
|
|
for (const domainId of domainIds) r[domainId] = await get(domainId);
|
|
return r;
|
|
}
|
|
|
|
global.Hydro.model.domain = module.exports = {
|
|
add,
|
|
inc,
|
|
get,
|
|
getMany,
|
|
edit,
|
|
getMulti,
|
|
getList,
|
|
};
|