import OB, {AnyBoolean} from "@onebro/oba-common"; import OBACore from "@onebro/oba-core"; import {Schema} from "mongoose"; import {ModelFactoryConfig,ModelFactory, getMiscReferenceSchemaDef, getStatusSchemaDef} from "@onebro/oba-mongoose"; import {DocStatuses,Post,PostSignature} from "../00-model-types"; import { userAcctAsPropSchema } from "./01-user-acct"; //import { MessageRefs, getMessageAsPropSchema } from "./05-message"; export type PostFactoryConfig = ModelFactoryConfig; export const postAsPropSchema = (arr?:AnyBoolean) => { switch(true){ case !!arr:{ return { type:[Schema.Types.ObjectId], ref:"Post", default:[] as Post["instance"][], get:(p:Post["instance"][]) => p.map(o => o.preview), }; } default:{ return { type:Schema.Types.ObjectId, ref:"Post", get:(p:Post["instance"]) => p?p.preview:null, }; } } }; export const postSchemaDef:PostFactoryConfig["definition"] = { qid:{type:String,default:() => "ob_" + OB.longId().replace(/-/g,""),immutable:true}, domain:{type:String,trim:true,required:true,maxLength:120}, type:{type:String,trim:true,required:true,maxLength:120}, title:{type:String,trim:true,required:true,maxLength:120}, body:{type:String,trim:true,required:true}, slug:{type:String,trim:true}, author:userAcctAsPropSchema(), }; export const postRefs_:PostFactoryConfig["refs"] = []; export const postRefs:PostFactoryConfig["refs"] = [...postRefs_]; export const postVirtuals:PostFactoryConfig["virtuals"] = { preview:{ get:function(){ const s = this as Post["instance"]; const p = {} as Post["preview"]; p.id = s.id; p.stat = s.stat; p.domain = s.domain; p.type = s.type; p.title = s.title; p.body = s.body; p.author = s.author as any; p.published = s.created; return p; } } }; export const postMethods:PostFactoryConfig["methods"] = { json:function(){ const s = this as Post["instance"]; const j = {} as Post["json"]; j._type_ = "post"; 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; s.domain = s.domain; j.type = s.type; j.title = s.title; j.slug = s.slug; j.body = s.body; j.author = s.author as any; j.published = s.created; return j; } }; export const PostFactoryConfig:PostFactoryConfig = { modelName:"Post", businessName:"post", collectionName:"cctx_playground_posts", statuses:DocStatuses, definition:postSchemaDef, opts:{}, refs:postRefs, virtuals:postVirtuals, methods:postMethods, }; export class PostFactory extends ModelFactory {constructor(api:OBACore){super(api as any,PostFactoryConfig);}}