Finalised prisma common module setup

This commit is contained in:
GeorgeWebberley 2026-03-01 11:51:46 +01:00
parent a7da23778c
commit 32b00a5417
9 changed files with 146 additions and 3 deletions

58
package-lock.json generated
View file

@ -7,12 +7,14 @@
"": { "": {
"name": "pandektes-challenge", "name": "pandektes-challenge",
"version": "0.0.1", "version": "0.0.1",
"hasInstallScript": true,
"license": "UNLICENSED", "license": "UNLICENSED",
"dependencies": { "dependencies": {
"@apollo/server": "^5.4.0", "@apollo/server": "^5.4.0",
"@as-integrations/express5": "^1.1.2", "@as-integrations/express5": "^1.1.2",
"@nestjs/apollo": "^13.2.4", "@nestjs/apollo": "^13.2.4",
"@nestjs/common": "^11.1.14", "@nestjs/common": "^11.1.14",
"@nestjs/config": "^4.0.3",
"@nestjs/core": "^11.1.14", "@nestjs/core": "^11.1.14",
"@nestjs/graphql": "^13.2.4", "@nestjs/graphql": "^13.2.4",
"@nestjs/platform-express": "^11.0.1", "@nestjs/platform-express": "^11.0.1",
@ -37,6 +39,7 @@
"@types/express": "^5.0.0", "@types/express": "^5.0.0",
"@types/jest": "^30.0.0", "@types/jest": "^30.0.0",
"@types/node": "^22.10.7", "@types/node": "^22.10.7",
"@types/pg": "^8.18.0",
"@types/supertest": "^6.0.2", "@types/supertest": "^6.0.2",
"eslint": "^9.18.0", "eslint": "^9.18.0",
"eslint-config-prettier": "^10.0.1", "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": { "node_modules/@nestjs/core": {
"version": "11.1.14", "version": "11.1.14",
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.14.tgz", "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.14.tgz",
@ -3745,6 +3775,18 @@
"undici-types": "~6.21.0" "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": { "node_modules/@types/qs": {
"version": "6.14.0", "version": "6.14.0",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
@ -5947,7 +5989,6 @@
"version": "16.6.1", "version": "16.6.1",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
"integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
"devOptional": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
@ -5956,6 +5997,21 @@
"url": "https://dotenvx.com" "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": { "node_modules/dunder-proto": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",

View file

@ -25,6 +25,7 @@
"@as-integrations/express5": "^1.1.2", "@as-integrations/express5": "^1.1.2",
"@nestjs/apollo": "^13.2.4", "@nestjs/apollo": "^13.2.4",
"@nestjs/common": "^11.1.14", "@nestjs/common": "^11.1.14",
"@nestjs/config": "^4.0.3",
"@nestjs/core": "^11.1.14", "@nestjs/core": "^11.1.14",
"@nestjs/graphql": "^13.2.4", "@nestjs/graphql": "^13.2.4",
"@nestjs/platform-express": "^11.0.1", "@nestjs/platform-express": "^11.0.1",
@ -49,6 +50,7 @@
"@types/express": "^5.0.0", "@types/express": "^5.0.0",
"@types/jest": "^30.0.0", "@types/jest": "^30.0.0",
"@types/node": "^22.10.7", "@types/node": "^22.10.7",
"@types/pg": "^8.18.0",
"@types/supertest": "^6.0.2", "@types/supertest": "^6.0.2",
"eslint": "^9.18.0", "eslint": "^9.18.0",
"eslint-config-prettier": "^10.0.1", "eslint-config-prettier": "^10.0.1",

View file

@ -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")
);

View file

@ -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"

View file

@ -12,3 +12,17 @@ generator client {
datasource db { datasource db {
provider = "postgresql" 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
}

View file

@ -1,7 +1,8 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { PrismaModule } from './common/prisma/prisma.module';
@Module({ @Module({
imports: [], imports: [PrismaModule],
controllers: [], controllers: [],
providers: [], providers: [],
}) })

View file

@ -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 {}

View file

@ -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<string>('DATABASE_URL'),
});
this.client = new PrismaClient({ adapter });
}
async onModuleInit() {
await this.client.$connect();
}
async onModuleDestroy() {
await this.client.$disconnect();
}
}

View file

@ -14,6 +14,11 @@
"sourceMap": true, "sourceMap": true,
"outDir": "./dist", "outDir": "./dist",
"baseUrl": "./", "baseUrl": "./",
"paths": {
"@db": [
"./src/generated/prisma/client.ts"
]
},
"incremental": true, "incremental": true,
"skipLibCheck": true, "skipLibCheck": true,
"strictNullChecks": true, "strictNullChecks": true,
@ -22,4 +27,4 @@
"strictBindCallApply": false, "strictBindCallApply": false,
"noFallthroughCasesInSwitch": false "noFallthroughCasesInSwitch": false
} }
} }