import { Injectable, Logger } from '@nestjs/common'; import { DatabaseListen } from '../../constants'; import { EventBus } from '@nestjs/cqrs'; import { ChangeDocEvent } from '../../domain/events/change-doc.event'; import { ConfigService } from '@nestjs/config'; import { apm } from 'src/core/apm'; import * as Nano from 'nano'; @Injectable() export class CouchService { constructor( private eventBus: EventBus, private configService: ConfigService, ) {} get nanoInstance() { const couchConfiguration = this.configService.get('COUCHDB_CONFIG'); return Nano(couchConfiguration); } async onModuleInit() { const nano = this.nanoInstance; for (const database of DatabaseListen) { const db = nano.db.use(database); db.changesReader.start({ includeDocs: true }).on('change', (change) => { Logger.verbose( `Receive Data from ${database}: ${change?.id}`, 'CouchService', ); this.changeDoc(change, database); }); // transaction Logger.log(`start listen database ${database}`, 'CouchService'); } } private changeDoc(data, database) { this.eventBus.publish( new ChangeDocEvent({ id: data.id, database: database, data: data.doc, }), ); } public async createDoc(data, database) { try { const nano = this.nanoInstance; const db = nano.use(database); return await db.insert(data); } catch (error) { console.log(error); apm.captureError(error); } } public async deleteDoc(data, database) { try { const nano = this.nanoInstance; const db = nano.use(database); const result = await db.get(data.id); await db.destroy(data.id, result._rev); } catch (error) { console.log(error); apm.captureError(error); } } public async updateDoc(data, database) { try { const nano = this.nanoInstance; const db = nano.use(database); const result = await db.get(data.id); await db.insert({ ...data, _rev: result._rev, }); } catch (error) { console.log(error); apm.captureError(error); } } public async getDoc(id: string, database: string) { try { const nano = this.nanoInstance; const db = nano.use(database); const result = await db.get(id); return result; } catch (error) { console.log(error); apm.captureError(error); return null; } } }