|
|
|
const document = require('./document');
|
|
|
|
const { TrainingNotFoundError, TrainingAlreadyEnrollError } = require('../error');
|
|
|
|
|
|
|
|
function getStatus(domainId, tid, uid) {
|
|
|
|
return document.getStatus(domainId, document.TYPE_TRAINING, tid, uid);
|
|
|
|
}
|
|
|
|
|
|
|
|
function getMultiStatus(domainId, query) {
|
|
|
|
return document.getMultiStatus(domainId, document.TYPE_TRAINING, query);
|
|
|
|
}
|
|
|
|
|
|
|
|
async function getListStatus(domainId, uid, tids) {
|
|
|
|
const tsdocs = await getMultiStatus(
|
|
|
|
domainId, { uid, tid: { $in: Array.from(new Set(tids)) } },
|
|
|
|
).toArray();
|
|
|
|
const r = {};
|
|
|
|
for (const tsdoc of tsdocs) r[tsdoc.pid] = tsdoc;
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
async function enroll(domainId, tid, uid) {
|
|
|
|
try {
|
|
|
|
await document.setStatus(domainId, document.TYPE_TRAINING, tid, uid, { enroll: 1 });
|
|
|
|
} catch (e) {
|
|
|
|
throw new TrainingAlreadyEnrollError(tid, uid);
|
|
|
|
}
|
|
|
|
return await document.inc(domainId, document.TYPE_TRAINING, tid, 'enroll', 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
function setStatus(domainId, tid, uid, $set) {
|
|
|
|
return document.setStatus(domainId, document.TYPE_TRAINING, tid, uid, $set);
|
|
|
|
}
|
|
|
|
|
|
|
|
function add(domainId, title, content, owner, dag = [], description = '') {
|
|
|
|
return document.add(domainId, content, owner, document.TYPE_TRAINING, null, null, null, {
|
|
|
|
dag,
|
|
|
|
title,
|
|
|
|
description,
|
|
|
|
enroll: 0,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function edit(domainId, tid, $set) {
|
|
|
|
return document.set(domainId, document.TYPE_TRAINING, tid, $set);
|
|
|
|
}
|
|
|
|
|
|
|
|
global.Hydro.model.training = module.exports = {
|
|
|
|
getPids(tdoc) {
|
|
|
|
const pids = new Set();
|
|
|
|
for (const node of tdoc.dag) {
|
|
|
|
for (const pid of node.pids) pids.add(pid);
|
|
|
|
}
|
|
|
|
return Array.from(pids);
|
|
|
|
},
|
|
|
|
isDone(node, doneNids, donePids) {
|
|
|
|
return (Set.isSuperset(new Set(doneNids), new Set(node.requireNids))
|
|
|
|
&& Set.isSuperset(new Set(donePids), new Set(node.pids)));
|
|
|
|
},
|
|
|
|
isProgress(node, doneNids, donePids, progPids) {
|
|
|
|
return (Set.isSuperset(new Set(doneNids), new Set(node.requireNids))
|
|
|
|
&& !Set.isSuperset(new Set(donePids), new Set(node.pids))
|
|
|
|
&& Set.intersection(
|
|
|
|
Set.union(new Set(donePids), new Set(progPids)),
|
|
|
|
new Set(node.pids),
|
|
|
|
).size);
|
|
|
|
},
|
|
|
|
isOpen(node, doneNids, donePids, progPids) {
|
|
|
|
return (Set.isSuperset(new Set(doneNids), new Set(node.requireNids))
|
|
|
|
&& !Set.isSuperset(new Set(donePids), new Set(node.pids))
|
|
|
|
&& !Set.intersection(
|
|
|
|
Set.union(new Set(donePids), new Set(progPids)),
|
|
|
|
new Set(node.pids),
|
|
|
|
).size);
|
|
|
|
},
|
|
|
|
isInvalid(node, doneNids) {
|
|
|
|
return (!Set.isSuperset(new Set(doneNids), new Set(node.requireNids)));
|
|
|
|
},
|
|
|
|
add,
|
|
|
|
edit,
|
|
|
|
count: (domainId, query) => document.count(domainId, document.TYPE_TRAINING, query),
|
|
|
|
async get(domainId, tid) {
|
|
|
|
const tdoc = await document.get(domainId, document.TYPE_TRAINING, tid);
|
|
|
|
if (!tdoc) throw new TrainingNotFoundError(tid);
|
|
|
|
for (const i in tdoc.dag) {
|
|
|
|
for (const j in tdoc.dag[i].pids) {
|
|
|
|
if (Number.isSafeInteger(parseInt(tdoc.dag[i].pids[j]))) {
|
|
|
|
tdoc.dag[i].pids[j] = parseInt(tdoc.dag[i].pids[j]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return tdoc;
|
|
|
|
},
|
|
|
|
async getList(domainId, tids) {
|
|
|
|
const tdocs = await this.getMulti(
|
|
|
|
domainId, { _id: { $in: Array.from(new Set(tids)) } },
|
|
|
|
).toArray();
|
|
|
|
const r = {};
|
|
|
|
for (const tdoc of tdocs) r[tdoc.docId] = tdoc;
|
|
|
|
return r;
|
|
|
|
},
|
|
|
|
getMulti: (domainId, query) => document.getMulti(domainId, document.TYPE_TRAINING, query),
|
|
|
|
getMultiStatus,
|
|
|
|
getStatus,
|
|
|
|
enroll,
|
|
|
|
setStatus,
|
|
|
|
getListStatus,
|
|
|
|
};
|