import mongooseUniqueValidator from "mongoose-unique-validator"; import {AppMaster} from "@onebro/appmaster"; import { DeepPartial, IModelCreator, IStatus, IQuery, mapSelectedData, getSchemaRefs, ObjectId} from "@onebro/oba-common"; import { OneToOneMantaTestSuiteConfig, OneToOneMantaTestSuiteModel, OneToOneMantaTestSuite, OneToOneMantaTestSuiteJson, OneToOneMantaTestSuiteStatuses as statuses, OneToOneMantaTestSuiteStatus} from "../types"; import {oneToOneMantaTestSuiteSchema as mantaTest} from "../schemas"; const refs = getSchemaRefs(mantaTest); export const oneToOneMantaTestSuiteModels:IModelCreator = async m => { mantaTest.plugin(mongooseUniqueValidator); mantaTest.virtual("lastStatus").get(function(){return this.status?(this.status[this.status.length - 1] as any).json(statuses):null;}); mantaTest.virtual("lastStatus").set(function(o:IStatus){this.status = [...this.status,o];}); mantaTest.virtual("statusStr").get(function(){return this.lastStatus?this.lastStatus.name + " @ " + this.lastStatus.time:"";}); mantaTest.statics._populate = async function(o?:OneToOneMantaTestSuite){ await o.populate(refs).execPopulate(); return o;}; mantaTest.statics._find = async function(o:Partial|string){ if(!o) return m.e.badinfo(); const p = typeof o == "string"? await OneToOneMantaTestSuite.findById(o): await OneToOneMantaTestSuite.findOne(OneToOneMantaTestSuite.translateAliases(o)); if(!p) throw m.e.doesNotExist("Manta test suite"); return p;}; mantaTest.statics._create = async function(o:OneToOneMantaTestSuiteConfig){return new OneToOneMantaTestSuite({ ...o, author:new ObjectId(o.author), });}; mantaTest.statics._update = async function(o:OneToOneMantaTestSuite,p:DeepPartial){ await o.set(p).save(); return await OneToOneMantaTestSuite._populate(o);}; mantaTest.statics._remove = async function(o:OneToOneMantaTestSuite){return await o.remove().then(() => ({removed:o._id}));}; mantaTest.statics._query = async function(o:IQuery){ const {query,populate,limit,skip,sort,select} = o; const results:OneToOneMantaTestSuite[] = await this.find(this.translateAliases(query)) .populate(populate) //.where(where) .limit(limit) .skip(skip) .sort(sort) .exec(); const mantaTests = mapSelectedData(select,results); return {mantaTests};}; mantaTest.statics._lookup = async function({path,query}:{path:string;query:any}){ const pipeline:any[] = []; return OneToOneMantaTestSuite.aggregate(pipeline) .exec() .then((R:Partial<{[k in keyof (OneToOneMantaTestSuite & OneToOneMantaTestSuiteJson)]:any}>[]) => { return {mantaTests:R.map(o => { if(o.status) o.status = { name:statuses[o.status.a0 as OneToOneMantaTestSuiteStatus], time:o.status.a1, until:o.status.a2, info:o.status.a3}; delete o._id; return o;})}; });}; mantaTest.methods.json = function(){ const { id,created,updated,lastStatus:status,statusStr, type,author,body,img,link,symbol,sendAt,subscribers} = this as OneToOneMantaTestSuite; const json:OneToOneMantaTestSuiteJson = { id,created,updated,status,statusStr, type,author:author.preview(), body,img,link,symbol,sendAt, published:new Date(created), subscribers}; return json;}; const OneToOneMantaTestSuite = m.db.model("onebrother","OneToOneMantaTestSuite",mantaTest); await OneToOneMantaTestSuite.init(); return {OneToOneMantaTestSuite}; };