import * as Mongo from 'mongodb'; import * as dotenv from 'dotenv'; dotenv.config(); const MONGO_URI = process.env.MONGO_URI; export class LogService { private static instance: LogService; private MongoClient: any; private MongoDB: any; private constructor() { this.MongoClient = Mongo.MongoClient; this.MongoClient.connect(MONGO_URI, (err: any, database: any) => { this.MongoDB = database; if (err) console.log(err) }) } public saveMessage(message: any, bot_address: string): Promise { return new Promise((resolve, reject) => { if (message.references.length === 0) { this.MongoDB.collection('chats').insert({ user_address: message.to[0].address, bot_address: bot_address, parent_id: message.message_id, messages: [message] }, (err: any, result: any) => { if (err) return reject(err); return resolve(); }) } else { this.MongoDB.collection('chats').update({ parent_id: this.getParentId(message.references) }, { $push: { messages: message } }, (err: any, result: any) => { if (err) return reject(err); return resolve(); }) } }) } public saveAccount(account: any): Promise { return new Promise((resolve, reject) => { this.MongoDB.collection('accounts').insert(account, (err: any, result: any) => { if (err) return reject(err); return resolve(); }) }) } public findAccount(accountAddress: string): Promise { return new Promise((resolve, reject) => { this.MongoDB.collection('accounts').findOne({ account_address: accountAddress }, (err: any, result: any) => { if (err) return reject(err); return resolve(result); }) }) } public getAllThreadsFromAccount(accountAddress: string): Promise { return new Promise((resolve, reject) => { this.MongoDB.collection('chats').findOne({ user_address: accountAddress }, (err: any, result: any) => { if (err) return reject(err); return resolve(result); }) }) } public getThread(accountAddress: string, parentMessageId: string): Promise { return new Promise((resolve, reject) => { this.MongoDB.collection('chats').findOne({ $and: [{ user_address: accountAddress }, { parent_id: parentMessageId }] }, (err: any, result: any) => { if (err) return reject(err); return resolve(result); }) }) } public static getInstance(): LogService { if (!this.instance) { this.instance = new LogService(); } return this.instance; } private getParentId(references: string[]): string { let idx = references.length - 1; while (references[idx] === "null" || references[idx] === null || !references[idx]) { idx--; } return references[idx]; } }