import OB, {AnyBoolean} from "@onebro/oba-common"; import OBACore from "@onebro/oba-core"; import {Schema} from "mongoose"; import { ModelFactoryConfig, ModelFactory, getInfoMapSchemaDef, getSettingsSchemaDef, getSpecialTypeSchemaDef, } from "@onebro/oba-mongoose"; import { UserAcct, UserAcctSignature, UserStatuses, UserRoles, UserAcctPermissions, UserAcctTypes, AuthActions, } from "../00-model-types"; export type UserAcctFactoryConfig = ModelFactoryConfig; export const userAcctAsPropSchema = (arr?:AnyBoolean,useracct?:AnyBoolean) => { switch(true){ case !!arr:return { type:[Schema.Types.ObjectId], ref:"UserAcct", default:[] as UserAcct["instance"][], get:(p:UserAcct["instance"][]) => p.map(o => useracct?o.json():o.preview), }; default:return { type:Schema.Types.ObjectId, ref:"UserAcct", get:(p:UserAcct["instance"]) => p?useracct?p.json():p.preview:null, }; } }; export const userAcctSchemaDef:UserAcctFactoryConfig["definition"] = { qid:{type:String,default:() => "ob_" + OB.longId().replace(/-/g,""),immutable:true}, email:{type:String,trim:true,required:true,index:true,unique:true,maxLength:40}, username:{type:String,trim:true,index:true,sparse:true,maxLength:40}, role:getSpecialTypeSchemaDef(UserRoles), scopes:{type:[String],default:[]}, meta:getInfoMapSchemaDef(AuthActions,Date), name:new Schema({ first:{type:String,trim:true,maxLength:20}, last:{type:String,trim:true,maxLength:20} },{_id:false}), dob:{type:String}, phn:{type:String,trim:true}, hometown:{type:String,trim:true}, acct:getSpecialTypeSchemaDef(UserAcctTypes), settings:getSettingsSchemaDef(), permissions:getInfoMapSchemaDef(UserAcctPermissions,Date), pin:{type:String,trim:true}, attempts:{type:Number,default:0}, reset:{type:String,trim:true}, verification:{type:String,trim:true}, devices:{type:[String]}, next:{type:String}, }; export const userAcctRefs_:UserAcctFactoryConfig["refs"] = []; export const userAcctRefs:UserAcctFactoryConfig["refs"] = [...userAcctRefs_]; export const userAcctVirtuals:UserAcctFactoryConfig["virtuals"] = { preview:{ get:function(){ const s = this as UserAcct["instance"]; const p = {} as UserAcct["preview"]; p.id = s.id; p.stat = s.stat; p.username = s.username; p.email = s.email; p.role = s.role as any; p.fullname = s.name?s.name.first + " " +s.name.last:""; p.age = s.age; p.hometown = s.hometown; p.phn = s.phn; p.meta = s.meta; return p; } }, age:{ get:function(){ const s = this as UserAcct["instance"]; const dob = s.dob && new Date(s.dob); if(dob){ const today = new Date(); let age = today.getFullYear() - dob.getFullYear(); const m = today.getMonth() - dob.getMonth(); if (m < 0 || (m === 0 && today.getDate() < dob.getDate())) age--; return age; } else return null; } }, device:{ get:function(){ const s = this as UserAcct["instance"]; return s.devices[s.devices.length-1]; } }, }; export const userAcctMethods:UserAcctFactoryConfig["methods"] = { json:function(){ const s = this as UserAcct["instance"]; const j = {} as UserAcct["json"]; j._type_ = "user-acct"; 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.email = s.email; j.phn = s.phn; j.username = s.username; j.fullname = s.name?s.name.first + " " +s.name.last:""; j.age = s.age; j.role = s.role as any; j.hometown = s.hometown; return j; }, jsonAuth:function(auth:boolean){ const s = this as UserAcct["instance"]; const j = {} as UserAcct["json"]; j._type_ = "user-acct"; 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.email = s.email; j.username = s.username; j.role = s.role as any; j.scopes = s.scopes; j.meta = s.meta; j.phn = s.phn; j.fullname = s.name?s.name.first + " " +s.name.last:""; j.age = s.age; j.dob = s.dob; j.hometown = s.hometown; j.settings = s.settings; j.permissions = s.permissions as any; j.device = s.device; return j; } }; export const UserAcctFactoryConfig:UserAcctFactoryConfig = { modelName:"UserAcct", businessName:"user account", collectionName:"cctx_playground_user_accts", statuses:UserStatuses, definition:userAcctSchemaDef, opts:{}, refs:userAcctRefs, virtuals:userAcctVirtuals, methods:userAcctMethods, }; export class UserAcctFactory extends ModelFactory {constructor(api:OBACore){super(api as any,UserAcctFactoryConfig);}}