prisma postgresql notify DB 이벤트 감지

agnusdei·2024년 7월 17일
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Injectable, OnModuleInit, Scope } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { PrismaClient } from '@prisma/client';
import createSubscriber from 'pg-listen';

export const EVENT = 'new_notification';

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
  constructor(private readonly eventEmitter: EventEmitter2) {
    super();
  }

  async onModuleInit() {
    await this.$connect();
    await this.$queryRawUnsafe(`
      DROP TRIGGER IF EXISTS update_trigger ON public."Faq";
    `);
    console.log('트리거 삭제 🎈');
    await this.$queryRawUnsafe(`
      CREATE OR REPLACE FUNCTION update_trigger_func()
      RETURNS TRIGGER AS $$
      BEGIN
          PERFORM pg_notify('${EVENT}', row_to_json(NEW)::text);
          RETURN NEW;
      END;
      $$ LANGUAGE plpgsql;
    `);
    console.log('트리거 생성 🎈');
    await this.$queryRawUnsafe(`
      CREATE TRIGGER update_trigger
      AFTER UPDATE ON public."Faq"
      FOR EACH ROW
      EXECUTE FUNCTION update_trigger_func();
    `);
    console.log('트리거 실행 🎈');

    const subscriber = createSubscriber({
      connectionString: process.env.DATABASE_URL,
    });

    await subscriber.connect();
    await subscriber.listenTo(EVENT);

    subscriber.notifications.on(EVENT, async (payload) => {
      console.log(payload);
    });
  }
}
profile
DevSecOps Pentest🚩

0개의 댓글