All checks were successful
CI / skip-ci-check (pull_request) Successful in 1m23s
CI / lint-and-type-check (pull_request) Successful in 1m47s
CI / test (pull_request) Successful in 1m51s
CI / build (pull_request) Successful in 1m52s
CI / secret-scanning (pull_request) Successful in 1m25s
CI / dependency-scan (pull_request) Successful in 1m28s
CI / sast-scan (pull_request) Successful in 2m32s
CI / workflow-summary (pull_request) Successful in 1m22s
This document lists code and features that were added during development/debugging that might be candidates for cleanup or removal in the future. ## Debug/Development Code ### 1. Verbose Logging in Production **Location:** Multiple files **Status:** Consider reducing in production - `lib/auth.ts` - Session callback logging (lines 78-103, 105-113) - Logs full session details on every session creation - Could be reduced to warnings only or removed in production - `app/photos/page.tsx` - Page render logging (lines 12-33) - Logs auth() calls and session details - Useful for debugging but verbose for production - `app/api/debug/session/route.ts` - Entire debug endpoint - Created for debugging session issues - Consider removing or protecting with admin-only access - Or move to development-only route ### 2. Activity Logging **Location:** `lib/activity-log.ts`, `proxy.ts`, API routes **Status:** Keep but consider optimization - Activity logging is useful for monitoring - Consider: - Moving to structured logging (JSON format) - Adding log rotation/retention policies - Option to disable in production if not needed - Rate limiting logs to prevent spam ### 3. Upload Verification Logging **Location:** `app/api/photos/upload/route.ts` **Status:** Keep but reduce verbosity - Lines 89-91: Directory creation/existence logging - Lines 101: File save verification logging - Useful for debugging but could be reduced to errors only ### 4. Middleware Debug Logging **Location:** `proxy.ts` **Status:** Keep but consider reducing - Lines 22-37: Activity logging for all requests - Useful for monitoring but generates many logs - Consider: log only important events or add log level filtering ## Unused/Redundant Code ### 5. Legacy Upload Route **Location:** `app/api/photos/route.ts` **Status:** Consider deprecating - Legacy URL-based upload endpoint - New uploads use `/api/photos/upload` - Consider: - Marking as deprecated - Removing if not used - Or consolidating with upload route ### 6. Multiple Upload Routes **Location:** `app/api/photos/upload/route.ts` and `app/api/photos/upload-multiple/route.ts` **Status:** Keep but document usage - Two separate upload endpoints - Consider if both are needed or can be consolidated ### 7. Proxy.ts Cookie Name Variable **Location:** `proxy.ts` line 15 **Status:** Minor cleanup - `cookieName` variable defined but could use constant - Consider moving to shared constant or env var ## Configuration Cleanup ### 8. Next.js Config **Location:** `next.config.ts` **Status:** Review - Image optimization settings (line 19: `unoptimized: false`) - Consider if all remote patterns are needed - Review Turbopack configuration if not using ## Documentation Cleanup ### 10. ARCHITECTURE.md References **Location:** `ARCHITECTURE.md` line 156 **Status:** Update - Still references `middleware.ts` in some places - Should reference `proxy.ts` instead - Update all middleware references ## Testing/Debugging Utilities ### 11. Watch Activity Script **Location:** `watch-activity.sh` (if created) **Status:** Keep or document - Useful utility for monitoring - Consider adding to README or removing if not needed ## Recommendations ### High Priority (Consider Removing) 1. `app/api/debug/session/route.ts` - Debug endpoint (protect or remove) 2. Verbose logging in `app/photos/page.tsx` - Reduce to errors only 3. Update ARCHITECTURE.md middleware references ### Medium Priority (Optimize) 1. Activity logging - Add log levels or filtering 2. Upload logging - Reduce verbosity 3. Session callback logging - Reduce in production ### Low Priority (Keep) 1. Activity logging utility - Useful for monitoring 2. Multiple upload routes - Document usage 3. Watch activity script - Useful utility ## Notes - **Consider** adding environment-based log levels (DEBUG, INFO, WARN, ERROR) - **Consider** moving debug endpoints behind admin authentication - **Consider** adding log rotation/retention for production --- Do all these in stages. create new tests and test and docuemtn as u go. add DEBUG, INFO, WARN, ERROR flags and only show when asked for. create new branch.
157 lines
4.0 KiB
TypeScript
157 lines
4.0 KiB
TypeScript
/**
|
|
* Structured logging utility with log levels and environment-based filtering
|
|
*
|
|
* Log levels (in order of severity):
|
|
* - DEBUG: Detailed information for debugging (only in development)
|
|
* - INFO: General informational messages
|
|
* - WARN: Warning messages for potentially harmful situations
|
|
* - ERROR: Error messages for error events
|
|
*
|
|
* Usage:
|
|
* import { logger } from '@/lib/logger'
|
|
* logger.debug('Debug message', { data })
|
|
* logger.info('Info message', { data })
|
|
* logger.warn('Warning message', { data })
|
|
* logger.error('Error message', { error })
|
|
*/
|
|
|
|
export enum LogLevel {
|
|
DEBUG = 0,
|
|
INFO = 1,
|
|
WARN = 2,
|
|
ERROR = 3,
|
|
NONE = 4, // Disable all logging
|
|
}
|
|
|
|
export interface LogContext {
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
export interface Logger {
|
|
debug(message: string, context?: LogContext): void;
|
|
info(message: string, context?: LogContext): void;
|
|
warn(message: string, context?: LogContext): void;
|
|
error(message: string, context?: LogContext | Error): void;
|
|
isLevelEnabled(level: LogLevel): boolean;
|
|
}
|
|
|
|
/**
|
|
* Parse log level from environment variable or default based on NODE_ENV
|
|
*/
|
|
function getLogLevel(): LogLevel {
|
|
const envLogLevel = process.env.LOG_LEVEL?.toUpperCase();
|
|
|
|
// If explicitly set, use that
|
|
if (envLogLevel) {
|
|
switch (envLogLevel) {
|
|
case 'DEBUG':
|
|
return LogLevel.DEBUG;
|
|
case 'INFO':
|
|
return LogLevel.INFO;
|
|
case 'WARN':
|
|
return LogLevel.WARN;
|
|
case 'ERROR':
|
|
return LogLevel.ERROR;
|
|
case 'NONE':
|
|
return LogLevel.NONE;
|
|
default:
|
|
// Invalid value, fall through to default behavior
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Default behavior: DEBUG in development, INFO in production
|
|
return process.env.NODE_ENV === 'production' ? LogLevel.INFO : LogLevel.DEBUG;
|
|
}
|
|
|
|
/**
|
|
* Format log entry as structured JSON or human-readable string
|
|
*/
|
|
function formatLog(
|
|
level: LogLevel,
|
|
message: string,
|
|
context?: LogContext | Error
|
|
): string {
|
|
const timestamp = new Date().toISOString();
|
|
const levelName = LogLevel[level];
|
|
|
|
// If structured logging is enabled, output JSON
|
|
if (process.env.LOG_FORMAT === 'json') {
|
|
const logEntry: Record<string, unknown> = {
|
|
timestamp,
|
|
level: levelName,
|
|
message,
|
|
};
|
|
|
|
if (context) {
|
|
if (context instanceof Error) {
|
|
logEntry.error = {
|
|
name: context.name,
|
|
message: context.message,
|
|
stack: context.stack,
|
|
};
|
|
} else {
|
|
Object.assign(logEntry, context);
|
|
}
|
|
}
|
|
|
|
return JSON.stringify(logEntry);
|
|
}
|
|
|
|
// Human-readable format
|
|
const contextStr = context
|
|
? context instanceof Error
|
|
? ` | Error: ${context.name}: ${context.message}`
|
|
: ` | ${JSON.stringify(context)}`
|
|
: '';
|
|
|
|
return `[${levelName}] ${timestamp} | ${message}${contextStr}`;
|
|
}
|
|
|
|
/**
|
|
* Create a logger instance with the configured log level
|
|
*/
|
|
function createLogger(): Logger {
|
|
const currentLevel = getLogLevel();
|
|
|
|
const shouldLog = (level: LogLevel): boolean => {
|
|
return level >= currentLevel;
|
|
};
|
|
|
|
return {
|
|
debug(message: string, context?: LogContext): void {
|
|
if (shouldLog(LogLevel.DEBUG)) {
|
|
console.log(formatLog(LogLevel.DEBUG, message, context));
|
|
}
|
|
},
|
|
|
|
info(message: string, context?: LogContext): void {
|
|
if (shouldLog(LogLevel.INFO)) {
|
|
console.log(formatLog(LogLevel.INFO, message, context));
|
|
}
|
|
},
|
|
|
|
warn(message: string, context?: LogContext): void {
|
|
if (shouldLog(LogLevel.WARN)) {
|
|
console.warn(formatLog(LogLevel.WARN, message, context));
|
|
}
|
|
},
|
|
|
|
error(message: string, context?: LogContext | Error): void {
|
|
if (shouldLog(LogLevel.ERROR)) {
|
|
console.error(formatLog(LogLevel.ERROR, message, context));
|
|
}
|
|
},
|
|
|
|
isLevelEnabled(level: LogLevel): boolean {
|
|
return shouldLog(level);
|
|
},
|
|
};
|
|
}
|
|
|
|
// Export singleton logger instance
|
|
export const logger = createLogger();
|
|
|
|
// Export for testing
|
|
export { getLogLevel, formatLog, createLogger };
|