article

Friday, February 9, 2024

NextJS 14 CRUD REST API using Prisma with MYSQL

NextJS 14 CRUD REST API using Prisma with MYSQL

Prisma is an open-source next-generation ORM. It consists of the following parts: Prisma Client: Auto-generated and type-safe query builder
https://www.prisma.io

Install prisma/client
npm install @prisma/client
https://www.prisma.io/docs/orm/prisma-client/setup-and-configuration/generating-prisma-client

Generate Prisma Client with the following command:
npx prisma generate

Install prisma
npm install prisma --save-dev
https://www.prisma.io/docs/getting-started/quickstart

set up Prisma with the init command of the Prisma CLI:
npx prisma init --datasource-provider sqlite
to npx prisma init --datasource-provider mysql

Model data in the Prisma schema
prisma/schema.prisma
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}

Run a migration to create your database tables with Prisma Migrate
npx prisma migrate dev --name init

.env
DATABASE_URL="mysql://root:root@localhost:8889/nextjsdb"

https://www.prisma.io/docs/orm/prisma-client/queries/crud

https://nextjs.org/docs/app/building-your-application/routing/route-handlers

Create Folder and Files
app\users\route.js
//app\users\route.js
import { NextResponse } from "next/server";
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();

export async function POST(request) {
    try {
        const data = await request.json();
        console.log(data);
        const { name, email } = data

        const newUser = await prisma.user.create({
            data: {
                name,
                email
            }
        });
        return NextResponse.json(newUser);
    } catch (error) {
        console.log("Error creating user:", error)
        return NextResponse.error("Internal Server Error", 500)
    }
}

export async function GET() {
    try {
        const users = await prisma.user.findMany();
        return NextResponse.json(users);
    } catch (error) {
        console.error("Error fetching users:", error);
        return NextResponse.error("Internal Server Error", 500);
    }
}
app\users\[id]\route.js
//app\users\[id]\route.js
import { NextResponse } from "next/server";
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();

export async function GET(request, { params }) {
    const id = parseInt(params.id);
    try {
        const users = await prisma.user.findUnique({
        where: {
            id: id,
        },
        })
        return NextResponse.json(users);
    } catch (error) {
        console.error("Error fetching users:", error);
        return NextResponse.error("Internal Server Error", 500);
    }
}

export async function PUT(request, { params }) {
    try {
        const data = await request.json();
        console.log(data);
        const { name, email } = data
        const id = parseInt(params.id);

        const updatedUser = await prisma.user.update({
            where: { id },
            data: {
                name,
                email
            }
        });
        return NextResponse.json(updatedUser);
    } catch (error) {
        console.log("Error updating user:", error)
        return NextResponse.error("Internal Server Error", 500)
    }
}

export async function DELETE(request, { params }) {
    try {
        const id = parseInt(params.id);
        const deleteUser = await prisma.user.delete({
            where: { id }
        });
        return NextResponse.json(deleteUser);
    } catch (error) {
        console.error("error deleting user:", error);
        return NextResponse.error("Internal server Error", 500);
    }
}
run C:\nextjs>npm run dev

Related Post