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);
});
}
}