{"version":3,"sources":["../../../src/adapters/prisma/repositories.ts","../../../src/core/types.ts","../../../src/core/schemas.ts","../../../src/core/errors.ts","../../../src/server/next/routes.ts","../../../src/server/next/middleware.ts","../../../src/server/next/auth.ts"],"names":["TimeEntryStatus","TimeCategoryType","z","getServerSession","NextResponse","UserRole"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Repository interfaces and Prisma implementations\n */\n\nimport type { PrismaClient } from '@prisma/client';\nimport type { \n  TimeEntry, \n  Timesheet, \n  RateCard, \n  TimeCategory, \n  TimeLock,\n  AuditLog \n} from '../../core/types';\nimport type { \n  CreateTimeEntryInput, \n  UpdateTimeEntryInput, \n  TimeEntryFilter,\n  PaginationParams \n} from '../../core/schemas';\n\nexport interface TimeEntryRepository {\n  create(input: CreateTimeEntryInput): Promise<TimeEntry>;\n  update(id: string, input: UpdateTimeEntryInput): Promise<TimeEntry>;\n  delete(id: string): Promise<void>;\n  findById(id: string): Promise<TimeEntry | null>;\n  findMany(filter: TimeEntryFilter): Promise<{ data: TimeEntry[]; total: number }>;\n  findOverlapping(developerId: string, startAt: Date, endAt: Date, excludeId?: string): Promise<TimeEntry[]>;\n}\n\nexport interface TimesheetRepository {\n  generate(developerId: string, clientId: string, periodStart: Date, periodEnd: Date): Promise<Timesheet>;\n  findById(id: string): Promise<Timesheet | null>;\n  findMany(filter: PaginationParams & { developerId?: string; clientId?: string }): Promise<{ data: Timesheet[]; total: number }>;\n  submit(id: string): Promise<Timesheet>;\n  approve(id: string, approvedBy: string): Promise<Timesheet>;\n  reject(id: string, rejectedBy: string, reason: string): Promise<Timesheet>;\n}\n\nexport interface RateCardRepository {\n  create(input: Omit<RateCard, 'id' | 'createdAt' | 'updatedAt'>): Promise<RateCard>;\n  update(id: string, input: Partial<RateCard>): Promise<RateCard>;\n  findById(id: string): Promise<RateCard | null>;\n  findEffective(params: { developerId?: string; projectId?: string; clientId?: string; date: Date }): Promise<RateCard | null>;\n  findMany(filter: PaginationParams): Promise<{ data: RateCard[]; total: number }>;\n}\n\nexport interface TimeCategoryRepository {\n  create(input: Omit<TimeCategory, 'id'>): Promise<TimeCategory>;\n  update(id: string, input: Partial<TimeCategory>): Promise<TimeCategory>;\n  findById(id: string): Promise<TimeCategory | null>;\n  findAll(): Promise<TimeCategory[]>;\n}\n\nexport interface TimeLockRepository {\n  create(input: Omit<TimeLock, 'id'>): Promise<TimeLock>;\n  unlock(id: string, unlockedBy: string): Promise<TimeLock>;\n  findActive(projectId?: string, clientId?: string): Promise<TimeLock[]>;\n  checkLocked(params: { projectId?: string; clientId?: string; startAt: Date; endAt: Date }): Promise<boolean>;\n}\n\nexport interface AuditLogRepository {\n  create(input: Omit<AuditLog, 'id' | 'createdAt'>): Promise<AuditLog>;\n  findMany(filter: { entityType?: string; entityId?: string; userId?: string } & PaginationParams): Promise<{ data: AuditLog[]; total: number }>;\n}\n\n/**\n * Create repository instances with Prisma client\n */\nexport function createRepositories(prisma: PrismaClient) {\n  // Implementation placeholder - will be completed in next phase\n  return {\n    timeEntry: {} as TimeEntryRepository,\n    timesheet: {} as TimesheetRepository,\n    rateCard: {} as RateCardRepository,\n    timeCategory: {} as TimeCategoryRepository,\n    timeLock: {} as TimeLockRepository,\n    auditLog: {} as AuditLogRepository,\n  };\n}","/**\n * Core TypeScript type definitions for Time Log domain\n */\n\nexport enum TimeEntryStatus {\n  DRAFT = 'DRAFT',\n  SUBMITTED = 'SUBMITTED',\n  APPROVED = 'APPROVED',\n  REJECTED = 'REJECTED',\n  LOCKED = 'LOCKED',\n  BILLED = 'BILLED',\n}\n\nexport enum TimeCategoryType {\n  BILLABLE = 'BILLABLE',\n  NON_BILLABLE = 'NON_BILLABLE',\n  INTERNAL = 'INTERNAL',\n  TRAINING = 'TRAINING',\n  MEETING = 'MEETING',\n}\n\nexport interface TimeEntry {\n  id: string;\n  projectId: string;\n  taskId?: string;\n  developerId: string;\n  clientId: string;\n  startAt: Date;\n  endAt: Date;\n  durationMinutes: number;\n  billable: boolean;\n  category: TimeCategoryType;\n  tags: string[];\n  status: TimeEntryStatus;\n  notes?: string;\n  approvedBy?: string;\n  approvedAt?: Date;\n  rejectedBy?: string;\n  rejectedAt?: Date;\n  rejectionReason?: string;\n  lockedAt?: Date;\n  billedAt?: Date;\n  invoiceId?: string;\n  createdAt: Date;\n  updatedAt: Date;\n}\n\nexport interface Timesheet {\n  id: string;\n  developerId: string;\n  clientId: string;\n  periodStart: Date;\n  periodEnd: Date;\n  totalMinutes: number;\n  billableMinutes: number;\n  status: TimeEntryStatus;\n  submittedAt?: Date;\n  approvedAt?: Date;\n  approvedBy?: string;\n  entries: TimeEntry[];\n}\n\nexport interface RateCard {\n  id: string;\n  developerId?: string;\n  projectId?: string;\n  clientId?: string;\n  hourlyRate: number;\n  currency: string;\n  effectiveFrom: Date;\n  effectiveTo?: Date;\n  isActive: boolean;\n  createdAt: Date;\n  updatedAt: Date;\n}\n\nexport interface TimeCategory {\n  id: string;\n  name: string;\n  type: TimeCategoryType;\n  billable: boolean;\n  color: string;\n  description?: string;\n  isActive: boolean;\n}\n\nexport interface TimeLock {\n  id: string;\n  projectId?: string;\n  clientId?: string;\n  periodStart: Date;\n  periodEnd: Date;\n  reason: string;\n  lockedBy: string;\n  lockedAt: Date;\n  unlockedBy?: string;\n  unlockedAt?: Date;\n  isActive: boolean;\n}\n\nexport interface AuditLog {\n  id: string;\n  entityType: string;\n  entityId: string;\n  action: string;\n  userId: string;\n  metadata?: Record<string, any>;\n  createdAt: Date;\n}","/**\n * Zod validation schemas for Time Log domain\n */\n\nimport { z } from 'zod';\nimport { TimeEntryStatus, TimeCategoryType } from './types';\n\n// Base schemas\nexport const timeEntryStatusSchema = z.nativeEnum(TimeEntryStatus);\nexport const timeCategoryTypeSchema = z.nativeEnum(TimeCategoryType);\n\n// TimeEntry schemas\nexport const createTimeEntrySchema = z.object({\n  projectId: z.string().min(1),\n  taskId: z.string().optional(),\n  developerId: z.string().min(1),\n  clientId: z.string().min(1),\n  startAt: z.string().datetime().or(z.date()),\n  endAt: z.string().datetime().or(z.date()),\n  billable: z.boolean().default(true),\n  category: timeCategoryTypeSchema.default(TimeCategoryType.BILLABLE),\n  tags: z.array(z.string()).default([]),\n  notes: z.string().optional(),\n});\n\nexport const updateTimeEntrySchema = createTimeEntrySchema.partial().extend({\n  id: z.string().min(1),\n});\n\nexport const submitTimeEntrySchema = z.object({\n  id: z.string().min(1),\n});\n\nexport const approveTimeEntrySchema = z.object({\n  id: z.string().min(1),\n  approvedBy: z.string().min(1),\n});\n\nexport const rejectTimeEntrySchema = z.object({\n  id: z.string().min(1),\n  rejectedBy: z.string().min(1),\n  reason: z.string().min(1),\n});\n\n// Timesheet schemas\nexport const timesheetQuerySchema = z.object({\n  developerId: z.string().optional(),\n  clientId: z.string().optional(),\n  projectId: z.string().optional(),\n  periodStart: z.string().datetime().or(z.date()),\n  periodEnd: z.string().datetime().or(z.date()),\n  status: timeEntryStatusSchema.optional(),\n});\n\n// RateCard schemas\nexport const createRateCardSchema = z.object({\n  developerId: z.string().optional(),\n  projectId: z.string().optional(),\n  clientId: z.string().optional(),\n  hourlyRate: z.number().positive(),\n  currency: z.string().length(3).default('USD'),\n  effectiveFrom: z.string().datetime().or(z.date()),\n  effectiveTo: z.string().datetime().or(z.date()).optional(),\n}).refine(\n  (data) => data.developerId || data.projectId || data.clientId,\n  { message: 'At least one of developerId, projectId, or clientId must be provided' }\n);\n\n// TimeCategory schemas\nexport const createTimeCategorySchema = z.object({\n  name: z.string().min(1).max(50),\n  type: timeCategoryTypeSchema,\n  billable: z.boolean(),\n  color: z.string().regex(/^#[0-9A-Fa-f]{6}$/),\n  description: z.string().optional(),\n});\n\n// TimeLock schemas\nexport const createTimeLockSchema = z.object({\n  projectId: z.string().optional(),\n  clientId: z.string().optional(),\n  periodStart: z.string().datetime().or(z.date()),\n  periodEnd: z.string().datetime().or(z.date()),\n  reason: z.string().min(1),\n  lockedBy: z.string().min(1),\n}).refine(\n  (data) => data.projectId || data.clientId,\n  { message: 'Either projectId or clientId must be provided' }\n);\n\n// Query and filter schemas\nexport const paginationSchema = z.object({\n  page: z.coerce.number().int().positive().default(1),\n  limit: z.coerce.number().int().positive().max(100).default(20),\n  sortBy: z.string().optional(),\n  sortOrder: z.enum(['asc', 'desc']).default('desc'),\n});\n\nexport const timeEntryFilterSchema = z.object({\n  developerId: z.string().optional(),\n  clientId: z.string().optional(),\n  projectId: z.string().optional(),\n  taskId: z.string().optional(),\n  status: timeEntryStatusSchema.optional(),\n  billable: z.coerce.boolean().optional(),\n  category: timeCategoryTypeSchema.optional(),\n  tags: z.array(z.string()).optional(),\n  startDate: z.string().datetime().or(z.date()).optional(),\n  endDate: z.string().datetime().or(z.date()).optional(),\n}).merge(paginationSchema);\n\n// Export types from schemas\nexport type CreateTimeEntryInput = z.infer<typeof createTimeEntrySchema>;\nexport type UpdateTimeEntryInput = z.infer<typeof updateTimeEntrySchema>;\nexport type TimeEntryFilter = z.infer<typeof timeEntryFilterSchema>;\nexport type TimesheetQuery = z.infer<typeof timesheetQuerySchema>;\nexport type CreateRateCardInput = z.infer<typeof createRateCardSchema>;\nexport type CreateTimeCategoryInput = z.infer<typeof createTimeCategorySchema>;\nexport type CreateTimeLockInput = z.infer<typeof createTimeLockSchema>;\nexport type PaginationParams = z.infer<typeof paginationSchema>;","/**\n * Custom error types for Time Log domain\n */\n\nexport class TimeLogError extends Error {\n  constructor(\n    message: string,\n    public code: string,\n    public statusCode: number = 400,\n    public details?: Record<string, any>\n  ) {\n    super(message);\n    this.name = 'TimeLogError';\n  }\n}\n\nexport class ValidationError extends TimeLogError {\n  constructor(message: string, details?: Record<string, any>) {\n    super(message, 'VALIDATION_ERROR', 400, details);\n    this.name = 'ValidationError';\n  }\n}\n\nexport class AuthorizationError extends TimeLogError {\n  constructor(message: string = 'Unauthorized access', details?: Record<string, any>) {\n    super(message, 'AUTHORIZATION_ERROR', 403, details);\n    this.name = 'AuthorizationError';\n  }\n}\n\nexport class NotFoundError extends TimeLogError {\n  constructor(resource: string, id?: string) {\n    const message = id ? `${resource} with id ${id} not found` : `${resource} not found`;\n    super(message, 'NOT_FOUND', 404);\n    this.name = 'NotFoundError';\n  }\n}\n\nexport class ConflictError extends TimeLogError {\n  constructor(message: string, details?: Record<string, any>) {\n    super(message, 'CONFLICT', 409, details);\n    this.name = 'ConflictError';\n  }\n}\n\nexport class OverlapError extends ConflictError {\n  constructor(overlappingEntries: Array<[string, string]>) {\n    super('Time entries overlap', { overlappingEntries });\n    this.name = 'OverlapError';\n  }\n}\n\nexport class PeriodLockedError extends ConflictError {\n  constructor(periodStart: Date, periodEnd: Date) {\n    super('Cannot modify entries in locked period', {\n      periodStart: periodStart.toISOString(),\n      periodEnd: periodEnd.toISOString(),\n    });\n    this.name = 'PeriodLockedError';\n  }\n}\n\nexport class InvalidStatusTransitionError extends ValidationError {\n  constructor(currentStatus: string, targetStatus: string) {\n    super(`Cannot transition from ${currentStatus} to ${targetStatus}`, {\n      currentStatus,\n      targetStatus,\n    });\n    this.name = 'InvalidStatusTransitionError';\n  }\n}\n\nexport class RateLimitError extends TimeLogError {\n  constructor(limit: number, window: string) {\n    super(`Rate limit exceeded: ${limit} requests per ${window}`, 'RATE_LIMIT', 429, {\n      limit,\n      window,\n    });\n    this.name = 'RateLimitError';\n  }\n}","/**\n * Next.js route handler factory for Time Log API\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport type { PrismaClient } from '@prisma/client';\nimport type { AuthOptions, Session } from 'next-auth';\nimport { getServerSession } from 'next-auth';\nimport { createRepositories } from '../../adapters/prisma';\nimport { \n  createTimeEntrySchema, \n  updateTimeEntrySchema, \n  timeEntryFilterSchema,\n  submitTimeEntrySchema,\n  approveTimeEntrySchema,\n  rejectTimeEntrySchema \n} from '../../core/schemas';\nimport { AuthorizationError, ValidationError, NotFoundError } from '../../core/errors';\n\nexport interface ExtendedUser {\n  id: string;\n  email?: string | null;\n  name?: string | null;\n  image?: string | null;\n  role: string;\n  developerId?: string;\n  clientId?: string;\n}\n\nexport interface ExtendedSession extends Session {\n  user: ExtendedUser;\n}\n\nexport interface RouteConfig {\n  prisma: PrismaClient;\n  authOptions: AuthOptions;\n}\n\n/**\n * Create Time Entry route handlers\n */\nexport function createTimeEntryRoutes(config: RouteConfig) {\n  const repositories = createRepositories(config.prisma);\n  \n  const GET = async (request: NextRequest) => {\n    try {\n      // Check authentication\n      const session = await getServerSession(config.authOptions) as ExtendedSession | null;\n      if (!session?.user) {\n        return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n      }\n      \n      // Parse query parameters\n      const searchParams = Object.fromEntries(request.nextUrl.searchParams);\n      const filter = timeEntryFilterSchema.parse(searchParams);\n      \n      // Apply authorization filters based on user role\n      if (session.user.role === 'DEVELOPER') {\n        filter.developerId = session.user.developerId;\n      } else if (session.user.role === 'CLIENT') {\n        filter.clientId = session.user.clientId;\n      }\n      \n      // Fetch time entries\n      const result = await repositories.timeEntry.findMany(filter);\n      \n      return NextResponse.json(result);\n    } catch (error: any) {\n      if (error.name === 'ZodError') {\n        return NextResponse.json({ error: 'Invalid parameters', details: error.errors }, { status: 400 });\n      }\n      return NextResponse.json({ error: error.message }, { status: error.statusCode || 500 });\n    }\n  };\n  \n  const POST = async (request: NextRequest) => {\n    try {\n      // Check authentication\n      const session = await getServerSession(config.authOptions) as ExtendedSession | null;\n      if (!session?.user) {\n        return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n      }\n      \n      // Parse and validate request body\n      const body = await request.json();\n      const input = createTimeEntrySchema.parse(body);\n      \n      // Apply authorization\n      if (session.user.role === 'DEVELOPER' && input.developerId !== session.user.developerId) {\n        throw new AuthorizationError('Cannot create time entries for other developers');\n      }\n      \n      // Create time entry\n      const timeEntry = await repositories.timeEntry.create(input);\n      \n      // Log audit event\n      await repositories.auditLog.create({\n        entityType: 'TimeEntry',\n        entityId: timeEntry.id,\n        action: 'CREATE',\n        userId: session.user.id,\n        metadata: { role: session.user.role, changes: input },\n      });\n      \n      return NextResponse.json(timeEntry, { status: 201 });\n    } catch (error: any) {\n      if (error.name === 'ZodError') {\n        return NextResponse.json({ error: 'Invalid input', details: error.errors }, { status: 400 });\n      }\n      return NextResponse.json({ error: error.message }, { status: error.statusCode || 500 });\n    }\n  };\n  \n  const PUT = async (request: NextRequest) => {\n    try {\n      // Check authentication\n      const session = await getServerSession(config.authOptions) as ExtendedSession | null;\n      if (!session?.user) {\n        return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n      }\n      \n      // Parse and validate request body\n      const body = await request.json();\n      const input = updateTimeEntrySchema.parse(body);\n      \n      // Check if entry exists\n      const existing = await repositories.timeEntry.findById(input.id);\n      if (!existing) {\n        throw new NotFoundError('TimeEntry', input.id);\n      }\n      \n      // Apply authorization\n      if (session.user.role === 'DEVELOPER' && existing.developerId !== session.user.developerId) {\n        throw new AuthorizationError('Cannot update time entries for other developers');\n      }\n      \n      // Update time entry\n      const timeEntry = await repositories.timeEntry.update(input.id, input);\n      \n      // Log audit event\n      await repositories.auditLog.create({\n        entityType: 'TimeEntry',\n        entityId: timeEntry.id,\n        action: 'UPDATE',\n        userId: session.user.id,\n        metadata: { role: session.user.role, changes: input },\n      });\n      \n      return NextResponse.json(timeEntry);\n    } catch (error: any) {\n      if (error.name === 'ZodError') {\n        return NextResponse.json({ error: 'Invalid input', details: error.errors }, { status: 400 });\n      }\n      return NextResponse.json({ error: error.message }, { status: error.statusCode || 500 });\n    }\n  };\n  \n  const DELETE = async (request: NextRequest) => {\n    try {\n      // Check authentication\n      const session = await getServerSession(config.authOptions) as ExtendedSession | null;\n      if (!session?.user) {\n        return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n      }\n      \n      // Get ID from query params\n      const id = request.nextUrl.searchParams.get('id');\n      if (!id) {\n        throw new ValidationError('ID is required');\n      }\n      \n      // Check if entry exists\n      const existing = await repositories.timeEntry.findById(id);\n      if (!existing) {\n        throw new NotFoundError('TimeEntry', id);\n      }\n      \n      // Apply authorization\n      if (session.user.role === 'DEVELOPER' && existing.developerId !== session.user.developerId) {\n        throw new AuthorizationError('Cannot delete time entries for other developers');\n      }\n      \n      // Delete time entry\n      await repositories.timeEntry.delete(id);\n      \n      // Log audit event\n      await repositories.auditLog.create({\n        entityType: 'TimeEntry',\n        entityId: id,\n        action: 'DELETE',\n        userId: session.user.id,\n        metadata: { role: session.user.role },\n      });\n      \n      return new NextResponse(null, { status: 204 });\n    } catch (error: any) {\n      return NextResponse.json({ error: error.message }, { status: error.statusCode || 500 });\n    }\n  };\n  \n  return { GET, POST, PUT, DELETE };\n}\n\n/**\n * Create Timesheet route handlers\n */\nexport function createTimesheetRoutes(config: RouteConfig) {\n  const repositories = createRepositories(config.prisma);\n  \n  const GET = async (request: NextRequest) => {\n    try {\n      const session = await getServerSession(config.authOptions) as ExtendedSession | null;\n      if (!session?.user) {\n        return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n      }\n      \n      // Implementation placeholder\n      return NextResponse.json({ timesheets: [] });\n    } catch (error: any) {\n      return NextResponse.json({ error: error.message }, { status: error.statusCode || 500 });\n    }\n  };\n  \n  const POST = async (request: NextRequest) => {\n    try {\n      const session = await getServerSession(config.authOptions) as ExtendedSession | null;\n      if (!session?.user) {\n        return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n      }\n      \n      // Implementation placeholder\n      return NextResponse.json({ success: true });\n    } catch (error: any) {\n      return NextResponse.json({ error: error.message }, { status: error.statusCode || 500 });\n    }\n  };\n  \n  return { GET, POST };\n}\n\n/**\n * Create Reports route handlers\n */\nexport function createReportsRoutes(config: RouteConfig) {\n  const GET = async (request: NextRequest) => {\n    try {\n      const session = await getServerSession(config.authOptions) as ExtendedSession | null;\n      if (!session?.user) {\n        return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n      }\n      \n      // Implementation placeholder\n      return NextResponse.json({ reports: [] });\n    } catch (error: any) {\n      return NextResponse.json({ error: error.message }, { status: error.statusCode || 500 });\n    }\n  };\n  \n  return { GET };\n}","/**\n * Middleware utilities for Next.js routes\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport type { Session } from 'next-auth';\n\n/**\n * Rate limiting middleware\n */\nexport function withRateLimit(limit: number = 100, window: number = 60000) {\n  const requests = new Map<string, number[]>();\n  \n  return (handler: Function) => {\n    return async (request: NextRequest, ...args: any[]) => {\n      const ip = request.headers.get('x-forwarded-for') || \n                 request.headers.get('x-real-ip') || \n                 'unknown';\n      const now = Date.now();\n      const windowStart = now - window;\n      \n      // Get or create request history for this IP\n      const history = requests.get(ip) || [];\n      const recentRequests = history.filter(time => time > windowStart);\n      \n      if (recentRequests.length >= limit) {\n        return NextResponse.json(\n          { error: 'Rate limit exceeded', retryAfter: window / 1000 },\n          { status: 429 }\n        );\n      }\n      \n      // Update request history\n      recentRequests.push(now);\n      requests.set(ip, recentRequests);\n      \n      // Clean up old entries periodically\n      if (Math.random() < 0.01) {\n        for (const [key, times] of requests.entries()) {\n          const recent = times.filter(time => time > windowStart);\n          if (recent.length === 0) {\n            requests.delete(key);\n          } else {\n            requests.set(key, recent);\n          }\n        }\n      }\n      \n      return handler(request, ...args);\n    };\n  };\n}\n\n/**\n * CORS middleware\n */\nexport function withCors(allowedOrigins: string[] = ['*']) {\n  return (handler: Function) => {\n    return async (request: NextRequest, ...args: any[]) => {\n      const origin = request.headers.get('origin') || '';\n      const isAllowed = allowedOrigins.includes('*') || allowedOrigins.includes(origin);\n      \n      if (request.method === 'OPTIONS') {\n        return new NextResponse(null, {\n          status: 200,\n          headers: {\n            'Access-Control-Allow-Origin': isAllowed ? origin : '',\n            'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',\n            'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n            'Access-Control-Max-Age': '86400',\n          },\n        });\n      }\n      \n      const response = await handler(request, ...args);\n      \n      if (isAllowed && response instanceof NextResponse) {\n        response.headers.set('Access-Control-Allow-Origin', origin);\n      }\n      \n      return response;\n    };\n  };\n}\n\n/**\n * Logging middleware\n */\nexport function withLogging(logger?: (log: LogEntry) => void) {\n  return (handler: Function) => {\n    return async (request: NextRequest, ...args: any[]) => {\n      const start = Date.now();\n      const method = request.method;\n      const url = request.url;\n      \n      try {\n        const response = await handler(request, ...args);\n        const duration = Date.now() - start;\n        \n        const log: LogEntry = {\n          method,\n          url,\n          status: response.status,\n          duration,\n          timestamp: new Date().toISOString(),\n        };\n        \n        if (logger) {\n          logger(log);\n        } else {\n          console.log(`[${log.timestamp}] ${method} ${url} - ${response.status} (${duration}ms)`);\n        }\n        \n        return response;\n      } catch (error: any) {\n        const duration = Date.now() - start;\n        \n        const log: LogEntry = {\n          method,\n          url,\n          status: 500,\n          duration,\n          error: error.message,\n          timestamp: new Date().toISOString(),\n        };\n        \n        if (logger) {\n          logger(log);\n        } else {\n          console.error(`[${log.timestamp}] ${method} ${url} - ERROR: ${error.message} (${duration}ms)`);\n        }\n        \n        throw error;\n      }\n    };\n  };\n}\n\ninterface LogEntry {\n  method: string;\n  url: string;\n  status: number;\n  duration: number;\n  error?: string;\n  timestamp: string;\n}\n\n/**\n * Compose multiple middleware functions\n */\nexport function composeMiddleware(...middlewares: Function[]) {\n  return (handler: Function) => {\n    return middlewares.reduceRight((acc, middleware) => middleware(acc), handler);\n  };\n}","/**\n * Authentication utilities for Next.js routes\n */\n\nimport type { Session } from 'next-auth';\nimport { AuthorizationError } from '../../core/errors';\n\nexport enum UserRole {\n  ADMIN = 'ADMIN',\n  FINANCE = 'FINANCE',\n  CLIENT = 'CLIENT',\n  DEVELOPER = 'DEVELOPER',\n}\n\nexport interface AuthUser {\n  id: string;\n  email: string;\n  role: UserRole;\n  developerId?: string;\n  clientId?: string;\n}\n\nexport interface AuthSession extends Session {\n  user: AuthUser;\n}\n\n/**\n * Check if user has required role\n */\nexport function hasRole(session: AuthSession | null, requiredRoles: UserRole[]): boolean {\n  if (!session?.user) return false;\n  return requiredRoles.includes(session.user.role as UserRole);\n}\n\n/**\n * Enforce role-based access control\n */\nexport function requireRole(session: AuthSession | null, requiredRoles: UserRole[]): void {\n  if (!hasRole(session, requiredRoles)) {\n    throw new AuthorizationError(`Requires one of roles: ${requiredRoles.join(', ')}`);\n  }\n}\n\n/**\n * Check if user can access developer resources\n */\nexport function canAccessDeveloper(session: AuthSession | null, developerId: string): boolean {\n  if (!session?.user) return false;\n  \n  // Admins and Finance can access all\n  if ([UserRole.ADMIN, UserRole.FINANCE].includes(session.user.role as UserRole)) {\n    return true;\n  }\n  \n  // Developers can only access their own data\n  if (session.user.role === UserRole.DEVELOPER) {\n    return session.user.developerId === developerId;\n  }\n  \n  return false;\n}\n\n/**\n * Check if user can access client resources\n */\nexport function canAccessClient(session: AuthSession | null, clientId: string): boolean {\n  if (!session?.user) return false;\n  \n  // Admins and Finance can access all\n  if ([UserRole.ADMIN, UserRole.FINANCE].includes(session.user.role as UserRole)) {\n    return true;\n  }\n  \n  // Clients can only access their own data\n  if (session.user.role === UserRole.CLIENT) {\n    return session.user.clientId === clientId;\n  }\n  \n  return false;\n}\n\n/**\n * Check if user can approve time entries\n */\nexport function canApproveTimeEntries(session: AuthSession | null): boolean {\n  if (!session?.user) return false;\n  return [UserRole.ADMIN, UserRole.FINANCE, UserRole.CLIENT].includes(session.user.role as UserRole);\n}\n\n/**\n * Check if user can lock time periods\n */\nexport function canLockTimePeriods(session: AuthSession | null): boolean {\n  if (!session?.user) return false;\n  return [UserRole.ADMIN, UserRole.FINANCE].includes(session.user.role as UserRole);\n}\n\n/**\n * Check if user can generate invoices\n */\nexport function canGenerateInvoices(session: AuthSession | null): boolean {\n  if (!session?.user) return false;\n  return [UserRole.ADMIN, UserRole.FINANCE].includes(session.user.role as UserRole);\n}\n\n/**\n * Get authorization filters based on user role\n */\nexport function getAuthFilters(session: AuthSession | null): Record<string, any> {\n  if (!session?.user) return {};\n  \n  const filters: Record<string, any> = {};\n  \n  switch (session.user.role) {\n    case UserRole.DEVELOPER:\n      filters.developerId = session.user.developerId;\n      break;\n    case UserRole.CLIENT:\n      filters.clientId = session.user.clientId;\n      break;\n    case UserRole.ADMIN:\n    case UserRole.FINANCE:\n      // No filters - can see everything\n      break;\n  }\n  \n  return filters;\n}"]}