feat(SPG-10) Research & Testing PG to Couch, Couch to PG

pull/2/head
ashar 2024-06-07 09:49:43 +07:00
parent 71c3f91a52
commit e9d2ba952c
6 changed files with 63 additions and 15 deletions

2
.gitignore vendored
View File

@ -30,6 +30,8 @@ lerna-debug.log*
# IDE - VSCode # IDE - VSCode
.vscode/* .vscode/*
.env .env
.dockerignore
docker-compose.yml
!.vscode/settings.json !.vscode/settings.json
!.vscode/tasks.json !.vscode/tasks.json
!.vscode/launch.json !.vscode/launch.json

View File

@ -1,15 +1,12 @@
FROM node:18.17-alpine as builder FROM node:20
RUN apk add --no-cache git
WORKDIR /app WORKDIR /app
COPY package*.json ./
RUN yarn
COPY . . COPY . .
RUN yarn install
RUN yarn build
FROM node:18.17-alpine CMD [ "yarn", "start:dev" ]
ARG env_target
WORKDIR /app
RUN echo ${env_target}
COPY --from=builder /app/env/$env_target .env
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package.json ./package.json
CMD ["node", "--max-old-space-size=8192","--max-http-header-size", "512000", "-r", "dotenv/config", "dist/main"]

View File

@ -0,0 +1,3 @@
export const DatabaseListen = [
'transaction'
]

View File

@ -1,14 +1,16 @@
import { ConfigModule } from '@nestjs/config'; import { ConfigModule } from '@nestjs/config';
import { CouchDataController } from './infrastructure/couch.controller'; import { CouchDataController } from './infrastructure/couch.controller';
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { CouchService } from './data/services/couch.service';
import { CqrsModule } from '@nestjs/cqrs';
@Module({ @Module({
imports: [ imports: [
ConfigModule.forRoot(), ConfigModule.forRoot(),
// TypeOrmModule.forFeature([UserPrivilegeModel], CONNECTION_NAME.DEFAULT), // TypeOrmModule.forFeature([UserPrivilegeModel], CONNECTION_NAME.DEFAULT),
// CqrsModule, CqrsModule,
], ],
controllers: [CouchDataController], controllers: [CouchDataController],
providers: [], providers: [CouchService],
}) })
export class CouchModule {} export class CouchModule {}

View File

@ -0,0 +1,35 @@
import { Injectable } from "@nestjs/common";
import { DatabaseListen } from "../../constants";
import { EventBus } from "@nestjs/cqrs";
import { ChangeDocEvent } from "../../domain/events/change-doc.event";
@Injectable()
export class CouchService {
constructor(
private eventBus: EventBus,
) {}
async onModuleInit() {
const nano = require('nano')('http://root:password@172.10.10.2:5970');
for (const database of DatabaseListen) {
const db = nano.db.use(database)
db.changesReader.start({ includeDocs: true })
.on('change', (change) => {
this.changeDoc(change, database);
})
console.log(`start listen database ${database}`)
}
}
private changeDoc(data, database) {
this.eventBus.publish(
new ChangeDocEvent({
id: data.id,
database: database,
data: data.doc,
})
)
}
}

View File

@ -0,0 +1,9 @@
export class ChangeDocEvent {
constructor(public readonly data: IEventDoc) {}
}
export interface IEventDoc {
id: string,
database: string,
data: any,
}