import mongooseUniqueValidator from "mongoose-unique-validator"; import {AppMaster} from "@onebro/appmaster"; import { DeepPartial, IModelCreator, IStatus, IQuery, mapSelectedData, getSchemaRefs, ObjectId, slugId} from "@onebro/oba-common"; import { FinavigatorTaskConfig, FinavigatorTaskModel, FinavigatorTask, FinavigatorTaskJson, FinavigatorTaskStatuses as statuses, FinavigatorTaskStatus,} from "../types"; import {finavigatorTaskSchema as task} from "../schemas"; const refs = getSchemaRefs(task); export const finavigatorTaskModels:IModelCreator = async m => { task.plugin(mongooseUniqueValidator); task.virtual("lastStatus").get(function(){return this.status?(this.status[this.status.length - 1] as any).json(statuses):null;}); task.virtual("lastStatus").set(function(o:IStatus){this.status = [...this.status,o];}); task.virtual("statusStr").get(function(){return this.lastStatus?this.lastStatus.name + " @ " + this.lastStatus.time:"";}); task.statics._populate = async function(o?:FinavigatorTask){ await o.populate(refs).execPopulate(); return o;}; task.statics._find = async function(o:Partial|string){ if(!o) return m.e.badinfo(); const p = typeof o == "string"? await FinavigatorTask.findById(o): await FinavigatorTask.findOne(FinavigatorTask.translateAliases(o)); if(!p) throw m.e.doesNotExist("task"); return p;}; task.statics._create = async function(o:FinavigatorTaskConfig){return new FinavigatorTask({ ...o, slug:slugId(o.title||"task-in-queue"), });}; task.statics._update = async function(o:FinavigatorTask,p:DeepPartial){ await o.set(p).save(); return await FinavigatorTask._populate(o);}; task.statics._remove = async function(o:FinavigatorTask){return await o.remove().then(() => ({removed:o._id}));}; task.statics._query = async function(o:IQuery){ const {query,populate,limit,skip,sort,select} = o; const results:FinavigatorTask[] = await this.find(this.translateAliases(query)) .populate(populate) //.where(where) .limit(limit) .skip(skip) .sort(sort) .exec(); const profiles = mapSelectedData(select,results); return {profiles};}; task.methods.json = function(){ const { id,created,updated,lastStatus:status,statusStr, type,author,slug,title,featured,body,tags,views} = this as FinavigatorTask; const json:FinavigatorTaskJson = { id,created,updated,status,statusStr, type,author:author.preview(), slug,title,featured, body,published:new Date(created), tags,views }; return json;}; const FinavigatorTask = m.db.model("onebrother","FinavigatorTask",task); await FinavigatorTask.init(); return {FinavigatorTask}; };