because I got bored of customising my CV for every job
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(server): add messenger module with project-q Postgres transport

+87
+16
apps/server/prisma/migrations/20260222120000_add_queue_schema/migration.sql
··· 1 + -- Queue schema for project-q messenger (Postgres transport) 2 + CREATE SCHEMA IF NOT EXISTS queue; 3 + 4 + CREATE TABLE IF NOT EXISTS queue.messages ( 5 + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), 6 + queue_name TEXT NOT NULL, 7 + body JSONB NOT NULL, 8 + headers JSONB NOT NULL DEFAULT '{}', 9 + available_at TIMESTAMPTZ NOT NULL DEFAULT now(), 10 + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), 11 + delivered_at TIMESTAMPTZ 12 + ); 13 + 14 + CREATE INDEX IF NOT EXISTS idx_queue_dequeue 15 + ON queue.messages (queue_name, available_at) 16 + WHERE delivered_at IS NULL;
+6
apps/server/prisma/migrations/20260222130000_add_worker_heartbeats/migration.sql
··· 1 + -- Worker heartbeat tracking for health checks 2 + CREATE TABLE IF NOT EXISTS queue.worker_heartbeats ( 3 + worker_id UUID PRIMARY KEY, 4 + started_at TIMESTAMPTZ NOT NULL DEFAULT now(), 5 + last_seen_at TIMESTAMPTZ NOT NULL DEFAULT now() 6 + );
+18
apps/server/src/modules/messenger/logger.provider.ts
··· 1 + import { Logger as NestLogger } from "@nestjs/common"; 2 + import type { Logger } from "@riotbyte/project-q-core"; 3 + 4 + export class NestProjectQLogger implements Logger { 5 + private readonly logger = new NestLogger("ProjectQ"); 6 + 7 + info(message: string): void { 8 + this.logger.log(message); 9 + } 10 + 11 + error(message: string): void { 12 + this.logger.error(message); 13 + } 14 + 15 + debug(message: string): void { 16 + this.logger.debug(message); 17 + } 18 + }
+11
apps/server/src/modules/messenger/messages/render-pdf.message.ts
··· 1 + import { defineZodMessage } from "@riotbyte/project-q-core"; 2 + import { z } from "zod/v4"; 3 + 4 + export const RenderPdfMessage = defineZodMessage( 5 + "render-pdf", 6 + z.object({ 7 + cvId: z.string(), 8 + html: z.string(), 9 + requestedBy: z.string(), 10 + }), 11 + );
+23
apps/server/src/modules/messenger/messenger.module.ts
··· 1 + import { Module } from "@nestjs/common"; 2 + import { LoggerProvider, MessengerModule } from "@riotbyte/project-q-nestjs"; 3 + import { NestProjectQLogger } from "./logger.provider"; 4 + import { PrismaTransportModule } from "./prisma-transport.module"; 5 + 6 + @Module({ 7 + imports: [ 8 + PrismaTransportModule, 9 + MessengerModule.forRoot({ 10 + transports: { 11 + async: { dsn: "prisma://?queue=default", retry: true }, 12 + }, 13 + routing: new Map<string, "async">([["render-pdf", "async"]]), 14 + }), 15 + ], 16 + providers: [ 17 + { 18 + provide: LoggerProvider, 19 + useClass: NestProjectQLogger, 20 + }, 21 + ], 22 + }) 23 + export class ProjectQMessengerModule {}
+13
apps/server/src/modules/messenger/prisma-transport.module.ts
··· 1 + import { Module } from "@nestjs/common"; 2 + import { DatabaseModule, PrismaService } from "@cv/system"; 3 + import { PrismaClientToken, PrismaTransportFactory } from "@riotbyte/project-q-prisma"; 4 + 5 + @Module({ 6 + imports: [DatabaseModule], 7 + providers: [ 8 + PrismaTransportFactory, 9 + { provide: PrismaClientToken, useExisting: PrismaService }, 10 + ], 11 + exports: [PrismaTransportFactory], 12 + }) 13 + export class PrismaTransportModule {}