import OB, {AnyBoolean} from "@onebro/oba-common"; import OBACore from "@onebro/oba-core"; import {Schema} from "mongoose"; import {ModelFactoryConfig,ModelFactory,getMiscReferenceSchemaDef, getStatusSchemaDef, getStatus} from "@onebro/oba-mongoose"; import {DocStatuses,ServiceRequest,ServiceRequestSignature} from "../00-model-types"; import { userAcctAsPropSchema, userAcctRefs } from "./01-user-acct"; //import { MessageRefs, getMessageAsPropSchema } from "./05-message"; export type ServiceRequestFactoryConfig = ModelFactoryConfig; export const serviceRequestAsPropSchema = (arr?:AnyBoolean) => { switch(true){ case !!arr:{ return { type:[Schema.Types.ObjectId], ref:"ServiceRequest", default:[] as ServiceRequest["instance"][], get:(p:ServiceRequest["instance"][]) => p.map(o => o.preview), }; } default:{ return { type:Schema.Types.ObjectId, ref:"ServiceRequest", get:(p:ServiceRequest["instance"]) => p?p.preview:null, }; } } }; export const serviceRequestSchemaDef:ServiceRequestFactoryConfig["definition"] = { qid:{type:String,default:() => "ob_" + OB.longId().replace(/-/g,""),immutable:true}, domain:{type:String,trim:true,required:true,maxLength:120}, type:{type:String,enum:["contact-us","user-access","support-ticket","admn-task"],required:true}, category:{type:String,trim:true,required:true}, title:{type:String,trim:true,maxLength:120}, slug:{type:String,trim:true}, client:{ type:new Schema({ id:{type:String,trim:true,maxLength:100}, name:{type:String,trim:true,maxLength:100,required:true}, email:{type:String,trim:true,maxLength:1000,required:true}, phn:{type:String,trim:true,maxLength:100}, },{_id:false}), required:true, }, items:{type:[new Schema({ desc:{type:String,trim:true,maxLength:100,required:true}, feature:{type:String,trim:true,maxLength:100}, saved:{type:Boolean}, completed:{type:Date}, },{_id:false})],default:[]}, admin:userAcctAsPropSchema(), parent:getMiscReferenceSchemaDef(), notes:{type:[new Schema({ user:{type:String,trim:true,required:true}, msg:{type:String,trim:true,required:true,maxLength:120}, time:{type:Date,required:true}, info:{type:Object}, },{_id:false})],default:[]}, activity:{type:[getStatusSchemaDef({})],default:[]}, score:{type:Number,default:0}, dueDate:{type:Date}, }; export const serviceRequestRefs_:ServiceRequestFactoryConfig["refs"] = [ {path:"admin",model:"UserAcct",populate:userAcctRefs}, ]; export const serviceRequestRefs:ServiceRequestFactoryConfig["refs"] = [...serviceRequestRefs_]; export const serviceRequestVirtuals:ServiceRequestFactoryConfig["virtuals"] = { preview:{ get:function(){ const s = this as ServiceRequest["instance"]; const p = {} as ServiceRequest["preview"]; p.id = s.id; p.stat = s.stat; p.domain = s.domain; p.type = s.type; p.category = s.category; p.client = s.client; p.title = s.title; p.admin = s.admin as any; p.parent = s.parent; p.itemCt = s.items.length; p.published = s.created; return p; } } }; export const serviceRequestMethods:ServiceRequestFactoryConfig["methods"] = { json:function(){ const s = this as ServiceRequest["instance"]; const j = {} as ServiceRequest["json"]; j._type_ = "service-request"; j.id = s.id; j.qid = s.qid; j.status = s.status as any; j.stat = s.stat; s.desc?j.desc = s.desc:null; s.info?j.info = s.info:null; j.domain = s.domain; j.type = s.type; j.category = s.category; j.title = s.title; j.client = s.client; j.parent = s.parent; j.admin = s.admin as any; j.dueDate = s.dueDate; j.activity = s.activity.map(getStatus) as any[]; j.score = s.score; j.slug = s.slug; j.items = s.items; j.notes = s.notes;//.map(o => o.preview); j.published = s.created; return j; } }; export const ServiceRequestFactoryConfig:ServiceRequestFactoryConfig = { modelName:"ServiceRequest", businessName:"service request", collectionName:"cctx_playground_svc_reqs", statuses:DocStatuses, definition:serviceRequestSchemaDef, opts:{}, refs:serviceRequestRefs, virtuals:serviceRequestVirtuals, methods:serviceRequestMethods, }; export class ServiceRequestFactory extends ModelFactory {constructor(api:OBACore){super(api as any,ServiceRequestFactoryConfig);}}