Skip to content

Commit 73b8569

Browse files
authored
Create login route (#45)
* Add login route logic * Add tests for login route
1 parent 30fcaf3 commit 73b8569

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { prismaMock } from '@/__test__/singleton';
2+
import { User } from '@prisma/client';
3+
import { POST } from './route';
4+
import { generateMockRequest } from '@/__test__/utils';
5+
import { NextRequest } from 'next/server';
6+
7+
jest.mock('@/lib/session', () => ({
8+
createSession: jest.fn(async (x: number) => x),
9+
}));
10+
11+
test('Login succeeds for existing user', async () => {
12+
const temporaryUser: User = {
13+
id: 1,
14+
username: 'test',
15+
createdAt: new Date(),
16+
updatedAt: new Date(),
17+
};
18+
19+
prismaMock.user.findFirst.mockResolvedValue(temporaryUser);
20+
21+
const req = generateMockRequest(temporaryUser);
22+
const res = await POST(req as NextRequest);
23+
const data = await res.json();
24+
25+
const expected = {
26+
...temporaryUser,
27+
updatedAt: temporaryUser.updatedAt.toISOString(),
28+
createdAt: temporaryUser.createdAt.toISOString(),
29+
};
30+
31+
expect(data.user).toEqual(expected);
32+
expect(data.success).toBeTruthy();
33+
});
34+
35+
test('Login fails if user does not exist', async () => {
36+
prismaMock.user.findFirst.mockResolvedValue(null);
37+
38+
const req = generateMockRequest({ username: 'test' });
39+
const res = await POST(req as NextRequest);
40+
const data = await res.json();
41+
42+
expect(data.error).toEqual("User doesn't exist");
43+
});

backend/app/api/user/login/route.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import prisma from '@/lib/prisma';
2+
import { createSession } from '@/lib/session';
3+
import { User } from '@prisma/client';
4+
import { NextRequest, NextResponse } from 'next/server';
5+
6+
type PostRequest = {
7+
username: string;
8+
};
9+
10+
type PostResponse = {
11+
success: boolean;
12+
user: User;
13+
};
14+
15+
// Make sure to call Firebase auth in frontend after to ensure correct password
16+
// This route only ensures that the user exists within our system, nothing else
17+
export const POST = async (
18+
req: NextRequest
19+
): Promise<NextResponse<PostResponse | { error: string }>> => {
20+
const { username }: PostRequest = await req.json();
21+
22+
const existingUser = await prisma.user.findFirst({
23+
where: {
24+
username,
25+
},
26+
});
27+
28+
if (!existingUser) {
29+
return NextResponse.json({ error: "User doesn't exist" }, { status: 404 });
30+
}
31+
32+
await createSession(existingUser.id);
33+
34+
return NextResponse.json({ success: true, user: existingUser });
35+
};

0 commit comments

Comments
 (0)