feat(SPG-10) Research & Testing PG to Couch, Couch to PG
parent
71c3f91a52
commit
e9d2ba952c
|
@ -30,6 +30,8 @@ lerna-debug.log*
|
|||
# IDE - VSCode
|
||||
.vscode/*
|
||||
.env
|
||||
.dockerignore
|
||||
docker-compose.yml
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
|
|
23
Dockerfile
23
Dockerfile
|
@ -1,15 +1,12 @@
|
|||
FROM node:18.17-alpine as builder
|
||||
RUN apk add --no-cache git
|
||||
FROM node:20
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
|
||||
RUN yarn
|
||||
|
||||
COPY . .
|
||||
RUN yarn install
|
||||
RUN yarn build
|
||||
FROM node:18.17-alpine
|
||||
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"]
|
||||
|
||||
|
||||
CMD [ "yarn", "start:dev" ]
|
|
@ -0,0 +1,3 @@
|
|||
export const DatabaseListen = [
|
||||
'transaction'
|
||||
]
|
|
@ -1,14 +1,16 @@
|
|||
import { ConfigModule } from '@nestjs/config';
|
||||
import { CouchDataController } from './infrastructure/couch.controller';
|
||||
import { Module } from '@nestjs/common';
|
||||
import { CouchService } from './data/services/couch.service';
|
||||
import { CqrsModule } from '@nestjs/cqrs';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
ConfigModule.forRoot(),
|
||||
// TypeOrmModule.forFeature([UserPrivilegeModel], CONNECTION_NAME.DEFAULT),
|
||||
// CqrsModule,
|
||||
CqrsModule,
|
||||
],
|
||||
controllers: [CouchDataController],
|
||||
providers: [],
|
||||
providers: [CouchService],
|
||||
})
|
||||
export class CouchModule {}
|
||||
|
|
|
@ -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,
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
export class ChangeDocEvent {
|
||||
constructor(public readonly data: IEventDoc) {}
|
||||
}
|
||||
|
||||
export interface IEventDoc {
|
||||
id: string,
|
||||
database: string,
|
||||
data: any,
|
||||
}
|
Loading…
Reference in New Issue