import { LogAndError } from '@birbal/common-utilities/dist/error'; import { AvatarInfoModel, IAvatarInfo, IAvatarInfoBody } from '../../Model/Demography/avatar'; import { VirtualBaseResource } from '../../Utility/Profile/virtual'; import { MongoFactory } from '@birbal/mongo-utilities/dist/mongo-factory'; const DEFAULT_LIMIT = 10; const DEFAULT_SKIP = 0; type TDemography = any; export class AvatarInfoResource extends VirtualBaseResource { protected ID_TYPE = "avatar"; constructor(dbName: string, superSecret: string) { super(dbName, superSecret); } async setInfo(userId: string, details: IAvatarInfoBody, dbTxnId?: string): Promise { if (!userId || !details) { throw new LogAndError("Invalid userid or details"); } try { let [virtualId, state] = await this.makeEntry(userId, dbTxnId); // Set details let model = new AvatarInfoModel(this.DATABASE_NAME); await model.defineSchema(); let body: IAvatarInfo = { avatar: { virtualId: virtualId , info: details , status: state } } await model.upsert(userId, body, dbTxnId); return virtualId; } catch (e) { throw e; } } async performAction( virtualId: string , action: 'remove'|'reject'|'approve'|'expire'|'revoke' , dbTxnId?: string ) { if (!virtualId || !action) { throw new LogAndError("Invalid virtual id or action"); } if (!this.SUPER_SECRET || !this.DATABASE_NAME) { throw new LogAndError("Invalid dbname or super secret"); } try { let [state, userId] = await this.updateStatus(virtualId, action, dbTxnId); let model = new AvatarInfoModel(this.DATABASE_NAME); await model.defineSchema(); let infoDoc = await model.find(userId ,dbTxnId); let info = model.getDataModel(infoDoc); if (!info || !info.avatar) { throw new LogAndError("Invalid info details"); } info.avatar.status = state; await model.update(userId, info, dbTxnId); } catch (e) { throw e; } } async advancedSearch( dbName: string , userId?: string , limit?: number , skip?: number ): Promise<[number, Array]> { /** Check for madatory Inputs */ if (!this.SUPER_SECRET || !this.DATABASE_NAME) { throw new LogAndError("Invalid dbname or super secret"); } try { let params: TDemography = {}; if (userId) { params._id = userId; } let db = await MongoFactory.getSingleton().getBirbalDatabase(dbName); let conn = await db.getDatabase(); let aInfoModel = new AvatarInfoModel(this.DATABASE_NAME) if(!limit) { limit = DEFAULT_LIMIT; } if(!skip) { skip = DEFAULT_SKIP; } let cursor = conn.collection(aInfoModel.TABLE_NAME).find(params); let count = await cursor.count(); let limitedCursor = cursor.limit(limit).skip(skip); let results = await limitedCursor.toArray(); return [count, results]; } catch (e) { throw e; } } }