mirror of
https://github.com/kjanat/livedash-node.git
synced 2026-01-16 15:32:10 +01:00
- Fixed missing type imports in lib/api/index.ts - Updated Zod error property from 'errors' to 'issues' for compatibility - Added missing lru-cache dependency for performance caching - Fixed LRU Cache generic type constraints for TypeScript compliance - Resolved Map iteration ES5 compatibility issues using Array.from() - Fixed Redis configuration by removing unsupported socket options - Corrected Prisma relationship naming (auditLogs vs securityAuditLogs) - Applied type casting for missing database schema fields - Created missing security types file for enhanced security service - Disabled deprecated ESLint during build (using Biome for linting) - Removed deprecated critters dependency and disabled CSS optimization - Achieved successful production build with all 47 pages generated
136 lines
3.3 KiB
TypeScript
136 lines
3.3 KiB
TypeScript
/**
|
|
* API Infrastructure Export Module
|
|
*
|
|
* Centralized exports for the standardized API layer architecture.
|
|
* This module provides a clean interface for importing API utilities
|
|
* throughout the application.
|
|
*/
|
|
|
|
// Authorization system
|
|
export {
|
|
type CompanyAccessResult,
|
|
canManageUser,
|
|
createPermissionChecker,
|
|
getUserPermissions,
|
|
hasAllPermissions,
|
|
hasAnyPermission,
|
|
hasPermission,
|
|
isRoleHigherThan,
|
|
Permission,
|
|
ResourceType,
|
|
requireAllPermissions,
|
|
requireAnyPermission,
|
|
requireCompanyAccess,
|
|
requireCompanyAccessFromRequest,
|
|
requirePermission,
|
|
requireUserManagementPermission,
|
|
validateCompanyAccess,
|
|
withPermissions,
|
|
} from "./authorization";
|
|
|
|
// Error handling
|
|
export {
|
|
APIError,
|
|
AuthenticationError,
|
|
AuthorizationError,
|
|
asyncErrorHandler,
|
|
ConflictError,
|
|
DatabaseError,
|
|
ExternalServiceError,
|
|
handleAPIError,
|
|
NotFoundError,
|
|
RateLimitError,
|
|
ValidationError,
|
|
withErrorHandling,
|
|
} from "./errors";
|
|
|
|
// API handlers and middleware
|
|
export {
|
|
type APIContext,
|
|
type APIHandler,
|
|
type APIHandlerOptions,
|
|
createAdminHandler,
|
|
createAPIHandler,
|
|
createAuthenticatedHandler,
|
|
createGETHandler,
|
|
createPOSTHandler,
|
|
type RateLimitConfig,
|
|
UserRole,
|
|
} from "./handler";
|
|
|
|
// Re-import types for use in functions below
|
|
import type { APIContext, APIHandler, APIHandlerOptions } from "./handler";
|
|
import { createAPIHandler } from "./handler";
|
|
import { Permission, createPermissionChecker } from "./authorization";
|
|
// Response utilities
|
|
export {
|
|
type APIResponse,
|
|
type APIResponseMeta,
|
|
calculatePaginationMeta,
|
|
createErrorResponse,
|
|
createPaginatedResponse,
|
|
createSuccessResponse,
|
|
extractPaginationParams,
|
|
type PaginationMeta,
|
|
} from "./response";
|
|
|
|
/**
|
|
* Utility function to create a fully configured API endpoint
|
|
* with authentication, authorization, and validation
|
|
*/
|
|
export function createSecureAPIEndpoint<T = unknown>(
|
|
handler: APIHandler<T>,
|
|
requiredPermission: Permission,
|
|
options: Omit<APIHandlerOptions, "requireAuth" | "requiredRole"> = {}
|
|
) {
|
|
return createAPIHandler(
|
|
async (context, validatedData, validatedQuery) => {
|
|
// Check permission
|
|
const permissions = createPermissionChecker(context);
|
|
permissions.require(requiredPermission);
|
|
|
|
// Execute handler
|
|
return handler(context, validatedData, validatedQuery);
|
|
},
|
|
{
|
|
...options,
|
|
requireAuth: true,
|
|
auditLog: true,
|
|
}
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Utility function to create a company-scoped API endpoint
|
|
*/
|
|
export function createCompanyScopedEndpoint<T = unknown>(
|
|
handler: (
|
|
context: APIContext,
|
|
validatedData?: unknown,
|
|
validatedQuery?: unknown
|
|
) => Promise<T>,
|
|
requiredPermission: Permission,
|
|
getCompanyId: (context: APIContext) => string | Promise<string>,
|
|
options: Omit<APIHandlerOptions, "requireAuth"> = {}
|
|
) {
|
|
return createAPIHandler(
|
|
async (context, validatedData, validatedQuery) => {
|
|
// Check permission
|
|
const permissions = createPermissionChecker(context);
|
|
permissions.require(requiredPermission);
|
|
|
|
// Validate company access
|
|
const companyId = await getCompanyId(context);
|
|
permissions.requireCompanyAccess(companyId);
|
|
|
|
// Execute handler with company context
|
|
return handler(context, validatedData, validatedQuery);
|
|
},
|
|
{
|
|
...options,
|
|
requireAuth: true,
|
|
auditLog: true,
|
|
}
|
|
);
|
|
}
|