import mongooseUniqueValidator from "mongoose-unique-validator"; import {AppMaster} from "@onebro/appmaster"; import { DeepPartial, IModelCreator, IStatus, IQuery, mapSelectedData, getSchemaRefs, ObjectId} from "@onebro/oba-common"; import { FinavigatorVenueConfig, FinavigatorVenueModel, FinavigatorVenue, FinavigatorVenueJson, FinavigatorVenueStatuses as statuses, FinavigatorVenueStatus,} from "../types"; import {finavigatorVenueSchema as venue} from "../schemas"; const refs = getSchemaRefs(venue); export const finavigatorVenueModels:IModelCreator = async m => { venue.plugin(mongooseUniqueValidator); venue.virtual("lastStatus").get(function(){return this.status?(this.status[this.status.length - 1] as any).json(statuses):null;}); venue.virtual("lastStatus").set(function(o:IStatus){this.status = [...this.status,o];}); venue.virtual("statusStr").get(function(){return this.lastStatus?this.lastStatus.name + " @ " + this.lastStatus.time:"";}); venue.statics._populate = async function(o?:FinavigatorVenue){ await o.populate(refs).execPopulate(); return o;}; venue.statics._find = async function(o:Partial|string){ if(!o) return m.e.badinfo(); const p = typeof o == "string"? await FinavigatorVenue.findById(o): await FinavigatorVenue.findOne(FinavigatorVenue.translateAliases(o)); if(!p) throw m.e.doesNotExist("venue"); return p;}; venue.statics._create = async function(o:FinavigatorVenueConfig){return new FinavigatorVenue(o);}; venue.statics._update = async function(o:FinavigatorVenue,p:DeepPartial){ await o.set(p).save(); return await FinavigatorVenue._populate(o);}; venue.statics._remove = async function(o:FinavigatorVenue){return await o.remove().then(() => ({removed:o._id}));}; venue.statics._query = async function(o:IQuery){ const {query,populate,limit,skip,sort,select} = o; const results:FinavigatorVenue[] = await this.find(this.translateAliases(query)) .populate(populate) //.where(where) .limit(limit) .skip(skip) .sort(sort) .exec(); const venues = mapSelectedData(select,results); return {venues};}; venue.methods.json = function(){ const {id,created,updated,lastStatus:status,statusStr,name,featured,loc,created:added} = this as FinavigatorVenue; return {id,created,updated,status,statusStr,name,featured,loc,added} as FinavigatorVenueJson;}; const FinavigatorVenue = m.db.model("onebrother","FinavigatorVenue",venue); await FinavigatorVenue.init(); return {FinavigatorVenue}; };