diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 65d51cd..28e4f43 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -27,6 +27,8 @@ jobs: node-version: 23 - name: Install dependencies run: npm install --legacy-peer-deps + - name: Install prisma + run: npx prisma generate - name: Build codebase run: npm run build diff --git a/backend/__test__/utils.ts b/backend/__test__/utils.ts new file mode 100644 index 0000000..86f94c6 --- /dev/null +++ b/backend/__test__/utils.ts @@ -0,0 +1,5 @@ +export const generateMockRequest = (payload: object) => { + return { + json: async () => payload, + }; +}; diff --git a/backend/app/api/user/register/route.test.ts b/backend/app/api/user/register/route.test.ts new file mode 100644 index 0000000..0c0b133 --- /dev/null +++ b/backend/app/api/user/register/route.test.ts @@ -0,0 +1,28 @@ +import { prismaMock } from '@/__test__/singleton'; +import { User } from '@prisma/client'; +import { POST } from './route'; +import { generateMockRequest } from '@/__test__/utils'; +import { NextRequest } from 'next/server'; + +test('Register route returns intended user', async () => { + const temporaryUser: User = { + id: 1, + username: 'test', + createdAt: new Date(), + updatedAt: new Date(), + }; + + prismaMock.user.create.mockResolvedValue(temporaryUser); + + const req = generateMockRequest(temporaryUser); + const res = await POST(req as NextRequest); + const data = await res.json(); + + const expected = { + ...temporaryUser, + updatedAt: temporaryUser.updatedAt.toISOString(), + createdAt: temporaryUser.createdAt.toISOString(), + }; + + expect(data.user).toEqual(expected); +}); diff --git a/backend/app/api/user/register/route.ts b/backend/app/api/user/register/route.ts new file mode 100644 index 0000000..144301b --- /dev/null +++ b/backend/app/api/user/register/route.ts @@ -0,0 +1,25 @@ +import prisma from '@/lib/prisma'; +import { User } from '@prisma/client'; +import { NextRequest, NextResponse } from 'next/server'; + +type PostRequest = { + username: string; +}; + +type PostResponse = { + user: User; +}; + +export const POST = async ( + req: NextRequest +): Promise> => { + const { username }: PostRequest = await req.json(); + + const user = await prisma.user.create({ + data: { + username, + }, + }); + + return NextResponse.json({ user }); +}; diff --git a/backend/prisma/migrations/20250116232308_add_username_to_user/migration.sql b/backend/prisma/migrations/20250116232308_add_username_to_user/migration.sql new file mode 100644 index 0000000..2d730b3 --- /dev/null +++ b/backend/prisma/migrations/20250116232308_add_username_to_user/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - Added the required column `username` to the `User` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "User" ADD COLUMN "username" TEXT NOT NULL; diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 4da3be3..732603c 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -3,6 +3,10 @@ datasource db { url = env("DATABASE_URL") } +generator client { + provider = "prisma-client-js" +} + model Genre { id Int @id @default(autoincrement()) value String @unique @@ -11,6 +15,7 @@ model Genre { model User { id Int @id @default(autoincrement()) + username String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt preferences Genre[]