76 lines
1.9 KiB
TypeScript
76 lines
1.9 KiB
TypeScript
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<string>('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) {}
|
|
}
|
|
}
|