From 55c5a359180a3bfc0a028b387bd10c4504c8d015 Mon Sep 17 00:00:00 2001 From: charles-gauthereau Date: Mon, 11 Nov 2024 18:27:20 +0100 Subject: [PATCH] Working on API route for status. --- app/api/agent/[agentId]/status/route.ts | 47 +++++++++++++++++++++++++ middleware.ts | 39 ++++++++++++++++++++ package.json | 2 +- src/middleware/errorHandler.ts | 8 +++++ src/middleware/loggingMiddleware.ts | 8 +++++ tsconfig.json | 2 +- 6 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 app/api/agent/[agentId]/status/route.ts create mode 100644 middleware.ts create mode 100644 src/middleware/errorHandler.ts create mode 100644 src/middleware/loggingMiddleware.ts diff --git a/app/api/agent/[agentId]/status/route.ts b/app/api/agent/[agentId]/status/route.ts new file mode 100644 index 00000000..e601e83d --- /dev/null +++ b/app/api/agent/[agentId]/status/route.ts @@ -0,0 +1,47 @@ +import {prisma} from "@/prisma"; +import {NextResponse} from "next/server"; + +export async function POST( + request: Request, + {params}: { params: Promise<{ agentId: string }> } +) { + const agentId = (await params).agentId + + const agent = await prisma.agent.findFirst({ + where: { + id: agentId + } + }) + + if(!agent){ + return NextResponse.json({error: "Agent not found"}, {status: 404}) + } + + await prisma.agent.update({ + where: { + id: agent.id, + }, + data: { + lastContact: new Date(), + } + }); + + const response = { + agent: { + id: agentId, + lastContact: agent.lastContact + }, + backup: { + action: false, + cron : "" + }, + restore: { + action: false, + file: "" + } + } + + return Response.json({ + message: response + }) +} \ No newline at end of file diff --git a/middleware.ts b/middleware.ts new file mode 100644 index 00000000..ecb9ada5 --- /dev/null +++ b/middleware.ts @@ -0,0 +1,39 @@ +import {NextRequest, NextResponse} from 'next/server' +import {loggingMiddleware} from "@/middleware/loggingMiddleware"; +import {errorHandler} from "@/middleware/errorHandler"; + +export function middleware(request: NextRequest) { + const url = request.nextUrl.clone(); + if (url.pathname.startsWith('/api')) { + const routeExists = checkRouteExists(url.pathname); + // If the route does not exist, return a 404 JSON response + if (!routeExists) { + return new NextResponse( + JSON.stringify({ message: "This API route does not exist.", status: 404 }), + { status: 404, headers: { 'Content-Type': 'application/json' } } + ); + } + } + try{ + loggingMiddleware(request); + }catch(err){ + errorHandler(err) + } + + +} +// Function to check if the route exists (supports dynamic routes) +function checkRouteExists(pathname) { + // Define static and dynamic routes with patterns + const routePatterns = [ + //do not delete + // /^\/api\/auth\/\d+$/, // Dynamic route with a number as a parameter (e.g., /api/dynamic/123) + // /^\/api\/auth\/\w+$/, // Dynamic route with a number as a parameter (e.g., /api/dynamic/123) + // /^\/api\/agent\/healthcheck\/\w+$/, // Dynamic route with an alphanumeric parameter (e.g., /api/user/username) + /^\/api\/agent\/[^/]+\/status\/?$/, // Dynamic route for /api/agent/[id]/status + ]; + return routePatterns.some(pattern => pattern.test(pathname)); +} +export const config = { + matcher: ['/api/agent/:path*'], +}; \ No newline at end of file diff --git a/package.json b/package.json index cfceb8b8..b1b4e371 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev --turbopack -p 80", + "dev": "next dev -p 80", "build": "next build", "start": "next start", "lint": "next lint" diff --git a/src/middleware/errorHandler.ts b/src/middleware/errorHandler.ts new file mode 100644 index 00000000..227b22fb --- /dev/null +++ b/src/middleware/errorHandler.ts @@ -0,0 +1,8 @@ +import {NextResponse} from "next/server"; + +export const errorHandler = (error: any) => { + return new NextResponse( + JSON.stringify({ message: 'An error occurred while processing your request.', status: 500 }), + { status: 500, headers: { 'Content-Type': 'application/json' } } + ); +}; \ No newline at end of file diff --git a/src/middleware/loggingMiddleware.ts b/src/middleware/loggingMiddleware.ts new file mode 100644 index 00000000..d22c4a63 --- /dev/null +++ b/src/middleware/loggingMiddleware.ts @@ -0,0 +1,8 @@ +import { NextRequest, NextResponse } from 'next/server'; + +export function loggingMiddleware(request: NextRequest) { + if (request.url.includes('/api')) { + console.log(`[API] Received ${request.method} request : ${request.url} at ${new Date()}`); + } + return NextResponse.next(); +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 12112c71..a34a8ca0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -33,7 +33,7 @@ "next-env.d.ts", "**/*.ts", "**/*.tsx", - ".next/types/**/*.ts" + ".next/types/**/*.ts", ], "exclude": [ "node_modules"