const validator = require('../lib/validator'), { ValidationError, TrainingNotFoundError } = require('../error'), db = require('../service/db.js'), coll = db.collection('traning'), coll_status = db.collection('training.status'); module.exports = { SETTING_DIFFICULTY_ALGORITHM: 0, SETTING_DIFFICULTY_ADMIN: 1, SETTING_DIFFICULTY_AVERAGE: 2, async add(title, content, owner_uid, dag = [], desc = '') { validator.check_title(title); validator.check_intro(content); validator.check_description(desc); for (let node of dag) for (let nid of node['require_nids']) if (nid >= node._id) throw new ValidationError('dag'); return await coll.insertOne({ content, owner_uid, dag, title, desc, enroll: 0 }); }, count: (query) => coll.find(query).count(), async edit(tid, $set) { if ($set.title) validator.check_title($set.title); if ($set.content) validator.check_intro($set.content); if ($set.desc) validator.check_description($set.desc); if ($set.dag) for (let node of $set.dag) for (let nid of node.require_nids) if (nid >= node._id) throw new ValidationError('dag'); await coll.findOneAndUpdate({ tid }, { $set }); let tdoc = await coll.findOne({ tid }); if (!tdoc) throw new TrainingNotFoundError(tid); return tdoc; }, async get(tid) { let tdoc = await coll.findOne({ tid }); if (!tdoc) throw new TrainingNotFoundError(tid); return tdoc; }, get_multi: (query) => coll.find( query), get_multi_status: (query) => coll_status.find(query), get_status: (tid, uid) => coll_status.findOne({ tid, uid }), set_status: (tid, uid, $set) => coll_status.findOneAndUpdate({ tid, uid }, { $set }) }; /* async def get_dict_status(domainId, uid, tids, *, fields=None): result = dict() async for tsdoc in get_multi_status(domainId=domainId, uid=uid, doc_id={'$in': list(set(tids))}, fields=fields): result[tsdoc['doc_id']] = tsdoc return result async def get_dict(domainId, tids, *, fields=None): result = dict() async for tdoc in get_multi(domainId=domainId, doc_id={'$in': list(set(tids))}, fields=fields): result[tdoc['doc_id']] = tdoc return result */