From 32b00a5417b78ca7014561bae952ccfcfb3819a4 Mon Sep 17 00:00:00 2001 From: GeorgeWebberley Date: Sun, 1 Mar 2026 11:51:46 +0100 Subject: [PATCH] Finalised prisma common module setup --- package-lock.json | 58 ++++++++++++++++++- package.json | 2 + .../migration.sql | 16 +++++ prisma/migrations/migration_lock.toml | 3 + prisma/schema.prisma | 14 +++++ src/app.module.ts | 3 +- src/common/prisma/prisma.module.ts | 19 ++++++ src/common/prisma/prisma.service.ts | 27 +++++++++ tsconfig.json | 7 ++- 9 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 prisma/migrations/20260301101919_add_caselaw_model/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 src/common/prisma/prisma.module.ts create mode 100644 src/common/prisma/prisma.service.ts diff --git a/package-lock.json b/package-lock.json index 799675f..d3ac843 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,12 +7,14 @@ "": { "name": "pandektes-challenge", "version": "0.0.1", + "hasInstallScript": true, "license": "UNLICENSED", "dependencies": { "@apollo/server": "^5.4.0", "@as-integrations/express5": "^1.1.2", "@nestjs/apollo": "^13.2.4", "@nestjs/common": "^11.1.14", + "@nestjs/config": "^4.0.3", "@nestjs/core": "^11.1.14", "@nestjs/graphql": "^13.2.4", "@nestjs/platform-express": "^11.0.1", @@ -37,6 +39,7 @@ "@types/express": "^5.0.0", "@types/jest": "^30.0.0", "@types/node": "^22.10.7", + "@types/pg": "^8.18.0", "@types/supertest": "^6.0.2", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", @@ -2759,6 +2762,33 @@ } } }, + "node_modules/@nestjs/config": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.3.tgz", + "integrity": "sha512-FQ3M3Ohqfl+nHAn5tp7++wUQw0f2nAk+SFKe8EpNRnIifPqvfJP6JQxPKtFLMOHbyer4X646prFG4zSRYEssQQ==", + "license": "MIT", + "dependencies": { + "dotenv": "17.2.3", + "dotenv-expand": "12.0.3", + "lodash": "4.17.23" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "rxjs": "^7.1.0" + } + }, + "node_modules/@nestjs/config/node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/@nestjs/core": { "version": "11.1.14", "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.14.tgz", @@ -3745,6 +3775,18 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/pg": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.18.0.tgz", + "integrity": "sha512-gT+oueVQkqnj6ajGJXblFR4iavIXWsGAFCk3dP4Kki5+a9R4NMt0JARdk6s8cUKcfUoqP5dAtDSLU8xYUTFV+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -5947,7 +5989,6 @@ "version": "16.6.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "devOptional": true, "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -5956,6 +5997,21 @@ "url": "https://dotenvx.com" } }, + "node_modules/dotenv-expand": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.3.tgz", + "integrity": "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", diff --git a/package.json b/package.json index b898111..2ed88a0 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@as-integrations/express5": "^1.1.2", "@nestjs/apollo": "^13.2.4", "@nestjs/common": "^11.1.14", + "@nestjs/config": "^4.0.3", "@nestjs/core": "^11.1.14", "@nestjs/graphql": "^13.2.4", "@nestjs/platform-express": "^11.0.1", @@ -49,6 +50,7 @@ "@types/express": "^5.0.0", "@types/jest": "^30.0.0", "@types/node": "^22.10.7", + "@types/pg": "^8.18.0", "@types/supertest": "^6.0.2", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", diff --git a/prisma/migrations/20260301101919_add_caselaw_model/migration.sql b/prisma/migrations/20260301101919_add_caselaw_model/migration.sql new file mode 100644 index 0000000..31e7db8 --- /dev/null +++ b/prisma/migrations/20260301101919_add_caselaw_model/migration.sql @@ -0,0 +1,16 @@ +-- CreateTable +CREATE TABLE "CaseLaw" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "decisionType" TEXT, + "decisionDate" TIMESTAMP(3), + "office" TEXT, + "court" TEXT, + "caseNumber" TEXT, + "summary" TEXT, + "fileType" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "CaseLaw_pkey" PRIMARY KEY ("id") +); diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..044d57c --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f51cc2c..29281a6 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -12,3 +12,17 @@ generator client { datasource db { provider = "postgresql" } + +model CaseLaw { + id String @id @default(uuid()) + title String + decisionType String? + decisionDate DateTime? + office String? + court String? + caseNumber String? + summary String? @db.Text + fileType String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} diff --git a/src/app.module.ts b/src/app.module.ts index ee5f2c9..d49fd1a 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,7 +1,8 @@ import { Module } from '@nestjs/common'; +import { PrismaModule } from './common/prisma/prisma.module'; @Module({ - imports: [], + imports: [PrismaModule], controllers: [], providers: [], }) diff --git a/src/common/prisma/prisma.module.ts b/src/common/prisma/prisma.module.ts new file mode 100644 index 0000000..57abed0 --- /dev/null +++ b/src/common/prisma/prisma.module.ts @@ -0,0 +1,19 @@ +import { Global, Module } from '@nestjs/common'; +import { + PrismaService, + PRISMA_CLIENT, +} from './prisma.service.js'; + +@Global() +@Module({ + providers: [ + PrismaService, + { + provide: PRISMA_CLIENT, + useFactory: (prismaService: PrismaService) => prismaService.client, + inject: [PrismaService], + }, + ], + exports: [PrismaService, PRISMA_CLIENT], +}) +export class PrismaModule {} diff --git a/src/common/prisma/prisma.service.ts b/src/common/prisma/prisma.service.ts new file mode 100644 index 0000000..c520ca8 --- /dev/null +++ b/src/common/prisma/prisma.service.ts @@ -0,0 +1,27 @@ +import { PrismaClient } from '@db'; +import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { PrismaPg } from '@prisma/adapter-pg'; + +export type PrismaClientInstance = PrismaClient; +export const PRISMA_CLIENT = Symbol('PRISMA_CLIENT'); + +@Injectable() +export class PrismaService implements OnModuleInit, OnModuleDestroy { + public readonly client: PrismaClient; + + constructor(private config: ConfigService) { + const adapter = new PrismaPg({ + connectionString: this.config.getOrThrow('DATABASE_URL'), + }); + this.client = new PrismaClient({ adapter }); + } + + async onModuleInit() { + await this.client.$connect(); + } + + async onModuleDestroy() { + await this.client.$disconnect(); + } +} diff --git a/tsconfig.json b/tsconfig.json index aba29b0..76db106 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,6 +14,11 @@ "sourceMap": true, "outDir": "./dist", "baseUrl": "./", + "paths": { + "@db": [ + "./src/generated/prisma/client.ts" + ] + }, "incremental": true, "skipLibCheck": true, "strictNullChecks": true, @@ -22,4 +27,4 @@ "strictBindCallApply": false, "noFallthroughCasesInSwitch": false } -} +} \ No newline at end of file