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 * 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.log( `Receive Data from ${database}: ${change?.id}`, 'CouchService', ); this.changeDoc(change, database); }); 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) {} } 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) {} } 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) {} } }