feat(SPG-10) Research & Testing PG to Couch, Couch to PG
parent
71c3f91a52
commit
e9d2ba952c
|
@ -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
|
||||||
|
|
23
Dockerfile
23
Dockerfile
|
@ -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"]
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
export const DatabaseListen = [
|
||||||
|
'transaction'
|
||||||
|
]
|
|
@ -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 {}
|
||||||
|
|
|
@ -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