import OB,{AnyBoolean} from "@onebro/oba-common"; import OBACore from "@onebro/oba-core"; import {Schema} from "mongoose"; import { ModelFactoryConfig, ModelFactory, getInfoMapSchemaDef, getSettingsSchemaDef, getSpecialTypeSchemaDef, getStatusSchemaDef, getStatus, } from "@onebro/oba-mongoose"; import { UserProfile, UserProfileSignature, UserRoles, UserStatuses, UserProfileSocials, UserProfileStats, UserProfileActions, } from "../00-model-types"; import { uploadRefs,uploadAsPropSchema } from "./02-upload"; export type UserProfileFactoryConfig = ModelFactoryConfig; export const userProfileAsPropSchema = (arr?:AnyBoolean,useracct?:AnyBoolean) => { switch(true){ case !!arr:return { type:[Schema.Types.ObjectId], ref:"UserProfile", default:[] as UserProfile["instance"][], get:(p:UserProfile["instance"][]) => p.map(o => useracct?o.json():o.preview), }; default:return { type:Schema.Types.ObjectId, ref:"UserProfile", get:(p:UserProfile["instance"]) => p?useracct?p.json():p.preview:null, }; } }; export const userProfileSchemaDef:UserProfileFactoryConfig["definition"] = { qid:{type:String,default:() => "ob_" + OB.longId().replace(/-/g,""),immutable:true}, name:{type:String,required:true,index:true,unique:true}, bio:{type:String,trim:true}, motto:{type:String,trim:true}, role:{...getSpecialTypeSchemaDef(UserRoles),immutable:true}, img:uploadAsPropSchema(), settings:getSettingsSchemaDef(), socials:getInfoMapSchemaDef(UserProfileSocials,String), stats:getInfoMapSchemaDef(UserProfileStats,Number), activity:{type:[getStatusSchemaDef(UserProfileActions)],default:[]}, following:userProfileAsPropSchema(1), followers:userProfileAsPropSchema(1), endorsements:userProfileAsPropSchema(1), rating:{type:Number,default:5}, }; export const userProfileRefs_:UserProfileFactoryConfig["refs"] = [{path:"img",model:"Upload",populate:uploadRefs}]; export const userProfileRefs:UserProfileFactoryConfig["refs"] = [ ...userProfileRefs_, {path:"followers",model:"UserProfile",populate:userProfileRefs_}, {path:"following",model:"UserProfile",populate:userProfileRefs_}, {path:"endorsements",model:"UserProfile",populate:userProfileRefs_}, ]; export const userProfileVirtuals:UserProfileFactoryConfig["virtuals"] = { preview:{ get:function(){ const s = this as UserProfile["instance"]; const p = {} as UserProfile["preview"]; p.id = s.id; p.name = s.name; s.img?p.img = s.img as any:null; p.memberSince = s.created; return p; } } }; export const userProfileMethods:UserProfileFactoryConfig["methods"] = { json:function(){ const s = this as UserProfile["instance"]; const j = {} as UserProfile["json"]; j._type_ = "user-profile"; 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.name = s.name; s.bio?j.bio = s.bio:null; s.motto?j.motto = s.motto:null; j.role = s.role as any; s.img?j.img = s.img as any:null; j.settings = s.settings; j.socials = s.socials as any; j.stats = s.stats as any; j.rating = s.rating; j.activity = s.activity.map(getStatus) as any[]; j.followers = s.followers.map(o => o.preview); j.following = s.following.map(o => o.preview); j.endorsements = s.endorsements.map(o => o.preview); j.memberSince = s.created; return j; } }; export const UserProfileFactoryConfig:UserProfileFactoryConfig = { modelName:"UserProfile", businessName:"user profile", collectionName:"cctx_playground_user_profiles", statuses:UserStatuses, definition:userProfileSchemaDef, opts:{}, refs:userProfileRefs, virtuals:userProfileVirtuals, methods:userProfileMethods, }; export class UserProfileFactory extends ModelFactory {constructor(api:OBACore){super(api as any,UserProfileFactoryConfig);}}