"feat: implement AccessLog and AppLog APIs with CRUD operations and test cases"

This commit is contained in:
louiscklaw
2025-06-03 15:27:56 +08:00
parent fc6ed533e2
commit 5480b62131
13 changed files with 402 additions and 15 deletions

View File

@@ -3,12 +3,13 @@ import type { NextRequest } from 'next/server';
import { sign } from 'src/utils/jwt';
import { STATUS, response, handleError } from 'src/utils/response';
import { _users, JWT_SECRET, JWT_EXPIRES_IN } from 'src/_mock/_auth';
import { JWT_SECRET, JWT_EXPIRES_IN } from 'src/_mock/_auth';
import { createAccessLog } from 'src/app/services/AccessLog.service';
import prisma from '../../../lib/prisma';
// ----------------------------------------------------------------------
export const runtime = 'edge';
/**
* This API is used for demo purpose only
* You should use a real database
@@ -17,29 +18,36 @@ export const runtime = 'edge';
* You should not expose the JWT_SECRET in the client side
*/
const ERR_USER_NOT_FOUND = 'There is no user corresponding to the email address.';
const ERR_WRONG_PASSWORD = 'Wrong password';
export async function POST(req: NextRequest) {
const debug = { 'req.headers': Object.fromEntries(req.headers.entries()) };
try {
const { email, password } = await req.json();
const currentUser = _users.find((user) => user.email === email);
const currentUser = await prisma.user.findFirst({ where: { email } });
if (!currentUser) {
return response(
{ message: 'There is no user corresponding to the email address.' },
STATUS.UNAUTHORIZED
);
await createAccessLog('', `user tried login with email ${email}`, { debug });
return response({ message: ERR_USER_NOT_FOUND }, STATUS.UNAUTHORIZED);
}
if (currentUser?.password !== password) {
return response({ message: 'Wrong password' }, STATUS.UNAUTHORIZED);
await createAccessLog(currentUser.id, 'user logged with wrong password', { debug });
return response({ message: ERR_WRONG_PASSWORD }, STATUS.UNAUTHORIZED);
}
const accessToken = await sign({ userId: currentUser?.id }, JWT_SECRET, {
expiresIn: JWT_EXPIRES_IN,
});
return response({ user: currentUser, accessToken }, 200);
await createAccessLog(currentUser.id, 'access granted', { debug });
return response({ user: currentUser, accessToken }, STATUS.OK);
} catch (error) {
await createAccessLog('', 'attempted login but failed', { debug, error });
return handleError('Auth - Sign in', error);
}
}

View File

@@ -0,0 +1,29 @@
###
# username and password ok
POST http://localhost:7272/api/auth/sign-in
content-type: application/json
{
"email": "demo@minimals.cc",
"password": "@2Minimal"
}
###
# There is no user corresponding to the email address.
POST http://localhost:7272/api/auth/sign-in
content-type: application/json
{
"email": "demo@minimals1.cc",
"password": "@2Minimal"
}
###
# Wrong password
POST http://localhost:7272/api/auth/sign-in
content-type: application/json
{
"email": "demo@minimals.cc",
"password": "@2Min111imal"
}

View File

@@ -24,10 +24,7 @@ export async function POST(req: NextRequest) {
const userExists = _users.find((user) => user.email === email);
if (userExists) {
return response(
{ message: 'There already exists an account with the given email address.' },
STATUS.CONFLICT
);
return response({ message: 'There already exists an account with the given email address.' }, STATUS.CONFLICT);
}
const newUser = {