Converted to a prisma singleton

This commit is contained in:
Tim Howitz 2025-05-20 18:26:40 +01:00
parent 8341d9d8ce
commit 885e694ad2
13 changed files with 36 additions and 87 deletions

View File

@ -1,10 +1,6 @@
import { NextResponse } from "next/server";
import { PrismaClient } from "@prismaclient";
const usingPrisma = false;
let prisma: PrismaClient;
if (usingPrisma) prisma = new PrismaClient();
import { prisma } from "@utils/prisma";
export async function POST(req: Request) {
try {
@ -33,7 +29,5 @@ export async function POST(req: Request) {
} catch (error) {
console.error("Error in earthquakes endpoint:", error);
return NextResponse.json({ message: "Internal Server Error" }, { status: 500 });
} finally {
if (usingPrisma) await prisma.$disconnect();
}
}

View File

@ -1,10 +1,8 @@
import { NextResponse } from "next/server";
import { cookies } from "next/headers";
import { env } from "@utils/env";
import { PrismaClient } from "@prisma/client";
import { verifyJwt } from "@utils/verifyJwt";
const prisma = new PrismaClient();
import { prisma } from "@utils/prisma";
export async function POST(req: Request) {
let cookieStore;
@ -41,7 +39,5 @@ export async function POST(req: Request) {
console.error("Error in user endpoint:", error);
cookieStore?.delete("jwt"); // Delete JWT cookie on error
return NextResponse.json({ message: "Internal Server Error" }, { status: 500 });
} finally {
await prisma.$disconnect();
}
}

View File

@ -1,13 +1,11 @@
import { parse } from "csv-parse/sync";
import fs from "fs/promises";
import { NextResponse } from "next/server";
import { prisma } from "@utils/prisma";
import path from "path";
import { PrismaClient } from "@prismaclient";
// Path to your earthquakes.csv
const csvFilePath = path.resolve(process.cwd(), "public/earthquakes.csv");
const prisma = new PrismaClient();
type CsvRow = {
Date: string;
@ -50,7 +48,5 @@ export async function POST() {
} catch (error: any) {
console.error(error);
return NextResponse.json({ success: false, error: error.message }, { status: 500 });
} finally {
await prisma.$disconnect();
}
}

View File

@ -3,11 +3,10 @@ import fs from "fs/promises";
import { NextResponse } from "next/server";
import path from "path";
import { PrismaClient } from "@prismaclient";
import { prisma } from "@utils/prisma";
// CSV location (update filename as needed)
const csvFilePath = path.resolve(process.cwd(), "public/observatories.csv");
const prisma = new PrismaClient();
type CsvRow = {
Name: string;
@ -61,7 +60,5 @@ export async function POST() {
} catch (error: any) {
console.error(error);
return NextResponse.json({ success: false, error: error.message }, { status: 500 });
} finally {
await prisma.$disconnect();
}
}

View File

@ -3,10 +3,8 @@ import fs from "fs/promises";
import { NextResponse } from "next/server";
import path from "path";
import { PrismaClient } from "@prismaclient";
import { prisma } from "@utils/prisma";
const csvFilePath = path.resolve(process.cwd(), "public/requests.csv");
const prisma = new PrismaClient();
type RequestType = "NEW_USER" | "CHANGE_LEVEL" | "DELETE";
type RequestOutcome = "FULFILLED" | "REJECTED" | "IN_PROGRESS" | "CANCELLED" | "OTHER";
@ -56,7 +54,5 @@ export async function POST() {
} catch (error: any) {
console.error(error);
return NextResponse.json({ success: false, error: error.message }, { status: 500 });
} finally {
await prisma.$disconnect();
}
}

View File

@ -3,11 +3,10 @@ import fs from "fs/promises";
import { NextResponse } from "next/server";
import path from "path";
import { PrismaClient } from "@prismaclient";
import { prisma } from "@utils/prisma";
// Path to CSV file
const csvFilePath = path.resolve(process.cwd(), "public/scientists.csv");
const prisma = new PrismaClient();
type CsvRow = {
Name: string;
@ -53,7 +52,5 @@ export async function POST() {
} catch (error: any) {
console.error(error);
return NextResponse.json({ success: false, error: error.message }, { status: 500 });
} finally {
await prisma.$disconnect();
}
}

View File

@ -3,11 +3,10 @@ import fs from "fs/promises";
import { NextResponse } from "next/server";
import path from "path";
import { PrismaClient } from "@prismaclient";
import { prisma } from "@utils/prisma";
// Path to users.csv - adjust as needed
const csvFilePath = path.resolve(process.cwd(), "public/users.csv");
const prisma = new PrismaClient();
type CsvRow = {
Name: string;
@ -51,7 +50,5 @@ export async function POST() {
} catch (error: any) {
console.error(error);
return NextResponse.json({ success: false, error: error.message }, { status: 500 });
} finally {
await prisma.$disconnect();
}
}

View File

@ -2,15 +2,11 @@ import bcryptjs from "bcryptjs";
import { SignJWT } from "jose";
import { NextResponse } from "next/server";
import { PrismaClient } from "@prismaclient";
import { env } from "@utils/env";
import { prisma } from "@utils/prisma";
import { findUserByEmail, readUserCsv, User } from "../functions/csvReadWrite";
const usingPrisma = false;
let prisma: PrismaClient;
if (usingPrisma) prisma = new PrismaClient();
export async function POST(req: Request) {
try {
const { email, password } = await req.json(); // Parse incoming JSON data
@ -67,7 +63,5 @@ export async function POST(req: Request) {
} catch (error) {
console.error("Error in signup endpoint:", error);
return NextResponse.json({ message: "Internal Server Error" }, { status: 500 });
} finally {
if (usingPrisma) await prisma.$disconnect();
}
}

View File

@ -1,10 +1,6 @@
import { NextResponse } from "next/server";
import { PrismaClient } from "@prismaclient";
const usingPrisma = false;
let prisma: PrismaClient;
if (usingPrisma) prisma = new PrismaClient();
import { prisma } from "@utils/prisma";
export async function GET(request: Request) {
try {
@ -36,8 +32,7 @@ export async function GET(request: Request) {
];
// todo get earthquakes associated with observatories
let observatories;
if (usingPrisma) observatories = await prisma.observatory.findMany();
const observatories = await prisma.observatory.findMany();
if (observatories) {
return NextResponse.json({ message: "Got observatories successfully", observatories }, { status: 200 });
@ -48,7 +43,5 @@ export async function GET(request: Request) {
} catch (error) {
console.error("Error in observatories endpoint:", error);
return NextResponse.json({ message: "Internal Server Error" }, { status: 500 });
} finally {
if (usingPrisma) await prisma.$disconnect();
}
}

View File

@ -2,15 +2,11 @@ import bcryptjs from "bcryptjs";
import { SignJWT } from "jose";
import { NextResponse } from "next/server";
import { PrismaClient } from "@prismaclient";
import { prisma } from "@utils/prisma";
import { env } from "@utils/env";
import { findUserByEmail, passwordStrengthCheck, readUserCsv, User, writeUserCsv } from "../functions/csvReadWrite";
const usingPrisma = false;
let prisma: PrismaClient;
if (usingPrisma) prisma = new PrismaClient();
export async function POST(req: Request) {
try {
const { email, password, name } = await req.json(); // Parse incoming JSON data
@ -23,17 +19,11 @@ export async function POST(req: Request) {
console.log("Email:", email); // ! remove
console.log("Password:", password); // ! remove
let foundUser;
if (usingPrisma) {
foundUser = await prisma.user.findUnique({
const foundUser = await prisma.user.findUnique({
where: {
email: email, // use the email to uniquely identify the user
},
});
} else {
foundUser = findUserByEmail(userData, email);
}
if (foundUser) {
return NextResponse.json({ message: "Sorry, this email is already in use" }, { status: 409 });
@ -58,20 +48,15 @@ export async function POST(req: Request) {
} else {
try {
const passwordHash = await bcryptjs.hash(password, 10);
let user;
if (usingPrisma) {
// todo add sending back user
user = await prisma.user.create({
const user = await prisma.user.create({
data: {
name,
email,
passwordHash,
},
});
} else {
user = { name, email, password: passwordHash, accessLevel };
userData.push(user);
}
await writeUserCsv(userData);
const secret = new TextEncoder().encode(env.JWT_SECRET_KEY);

View File

@ -2,14 +2,12 @@ import { NextResponse } from "next/server";
import { JWTPayload } from "@appTypes/JWT";
import { cookies } from "next/headers";
import { PrismaClient } from "@prismaclient";
import { prisma } from "@utils/prisma";
import { env } from "@utils/env";
import { verifyJwt } from "@utils/verifyJwt";
import { ExtendedArtefact } from "@appTypes/ApiTypes";
import { apiAuthMiddleware } from "@utils/apiAuthMiddleware";
const prisma = new PrismaClient();
export async function POST(req: Request) {
try {
const authResult = await apiAuthMiddleware();
@ -40,7 +38,5 @@ export async function POST(req: Request) {
} catch (error) {
console.error("Error in artefacts endpoint:", error);
return NextResponse.json({ message: "Internal Server Error" }, { status: 500 });
} finally {
await prisma.$disconnect();
}
}

View File

@ -1,11 +1,10 @@
import { NextResponse } from "next/server";
import { cookies } from "next/headers";
import { verifyJwt } from "@utils/verifyJwt";
import { PrismaClient } from "@prismaclient";
import type { JWTPayload } from "@/types/JWT";
import { env } from "@utils/env";
const prisma = new PrismaClient();
import { prisma } from "@utils/prisma";
export async function apiAuthMiddleware() {
const cookieStore = await cookies();

9
src/utils/prisma.ts Normal file
View File

@ -0,0 +1,9 @@
import { PrismaClient } from "@prisma/client";
declare global {
var prisma: PrismaClient | undefined;
}
const prisma = process.env.NODE_ENV === "production" ? new PrismaClient() : global.prisma ?? (global.prisma = new PrismaClient());
export { prisma };