All files / src/lib/api/middleware withLogging.ts

36.92% Statements 24/65
100% Branches 0/0
0% Functions 0/1
36.92% Lines 24/65

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 661x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x                                                                                    
/**
 * Logging Middleware
 *
 * Logs request and response details for debugging and monitoring.
 */
 
import { } from 'next/server';
import { logger } from '@/lib/logging';
import type { RouteContext, RouteHandler } from './types';
 
/**
 * Logging middleware
 *
 * Wraps a handler to log request details and response status.
 * Useful for debugging and monitoring API endpoints.
 *
 * @example
 * ```ts
 * export const GET = withLogging(async (request, context) => {
 *   // Request will be logged automatically
 *   return successResponse({ message: 'Hello' });
 * });
 * ```
 */
export function withLogging<T>(handler: RouteHandler<T>): RouteHandler<T> {
  return async (request, context?: RouteContext) => {
    const url = new URL(request.url);
    const startTime = Date.now();

    // Log incoming request
    logger.info(`${request.method} ${url.pathname}`, {
      category: 'API',
      query: Object.fromEntries(url.searchParams),
      headers: {
        'content-type': request.headers.get('content-type'),
        'user-agent': request.headers.get('user-agent')?.substring(0, 50) } });

    try {
      const response = await handler(request, context);
      const duration = Date.now() - startTime;

      // Log successful response
      logger.info(`${request.method} ${url.pathname} completed`, {
        category: 'API',
        status: response.status,
        duration: `${duration}ms` });

      return response;
    } catch (error) {
      const duration = Date.now() - startTime;

      // Log error
      logger.error(
        `${request.method} ${url.pathname} failed`,
        error instanceof Error ? error : new Error(String(error)),
        {
          category: 'API',
          duration: `${duration}ms`
        }
      );

      throw error;
    }
  };
}