diff --git a/.gitignore b/.gitignore index f55a81d..fac794b 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ lerna-debug.log* # IDE - VSCode .vscode/* .env +.dockerignore +docker-compose.yml !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json diff --git a/Dockerfile b/Dockerfile index 3c91300..8567780 100644 --- a/Dockerfile +++ b/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" ] \ No newline at end of file diff --git a/src/modules/configuration/couch/constants.ts b/src/modules/configuration/couch/constants.ts index e69de29..81278e6 100644 --- a/src/modules/configuration/couch/constants.ts +++ b/src/modules/configuration/couch/constants.ts @@ -0,0 +1,3 @@ +export const DatabaseListen = [ + 'transaction' +] \ No newline at end of file diff --git a/src/modules/configuration/couch/couch.module.ts b/src/modules/configuration/couch/couch.module.ts index 69bb385..c0e0232 100644 --- a/src/modules/configuration/couch/couch.module.ts +++ b/src/modules/configuration/couch/couch.module.ts @@ -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 {} diff --git a/src/modules/configuration/couch/data/services/couch.service.ts b/src/modules/configuration/couch/data/services/couch.service.ts new file mode 100644 index 0000000..1af2890 --- /dev/null +++ b/src/modules/configuration/couch/data/services/couch.service.ts @@ -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, + }) + ) + } +} \ No newline at end of file diff --git a/src/modules/configuration/couch/domain/events/change-doc.event.ts b/src/modules/configuration/couch/domain/events/change-doc.event.ts new file mode 100644 index 0000000..25b6394 --- /dev/null +++ b/src/modules/configuration/couch/domain/events/change-doc.event.ts @@ -0,0 +1,9 @@ +export class ChangeDocEvent { + constructor(public readonly data: IEventDoc) {} +} + +export interface IEventDoc { + id: string, + database: string, + data: any, +} \ No newline at end of file