@@ -504,6 +504,99 @@ pub fn generate_websockets(schema: &Schema, output_dir: &Path) -> Result<()> {
504504 Ok ( ( ) )
505505}
506506
507+ pub fn generate_middlewares ( schema : & Schema , output_dir : & Path ) -> Result < ( ) > {
508+ use std:: collections:: HashSet ;
509+
510+ let mut middleware_names = HashSet :: new ( ) ;
511+
512+ for api in & schema. apis {
513+ for middleware in & api. middlewares {
514+ middleware_names. insert ( middleware. clone ( ) ) ;
515+ }
516+ }
517+
518+ for ws in & schema. websockets {
519+ for middleware in & ws. middlewares {
520+ middleware_names. insert ( middleware. clone ( ) ) ;
521+ }
522+ }
523+
524+ if middleware_names. is_empty ( ) {
525+ return Ok ( ( ) ) ;
526+ }
527+
528+ let middlewares_dir = output_dir. join ( "middlewares" ) ;
529+ for middleware_name in middleware_names {
530+ let file_name = format ! ( "{}.ts" , middleware_name) ;
531+ let middleware_path = middlewares_dir. join ( & file_name) ;
532+
533+ if !middleware_path. exists ( ) {
534+ let content = generate_middleware_stub ( & middleware_name) ;
535+ fs:: write ( middleware_path, content) ?;
536+ }
537+ }
538+
539+ Ok ( ( ) )
540+ }
541+
542+ fn generate_middleware_stub ( middleware_name : & str ) -> String {
543+ let mut content = String :: new ( ) ;
544+
545+ content. push_str ( "import { State } from '@generated/state';\n \n " ) ;
546+
547+ content. push_str ( "export interface MiddlewareContext {\n " ) ;
548+ content. push_str ( " payload?: any;\n " ) ;
549+ content. push_str ( " query_params?: Record<string, string>;\n " ) ;
550+ content. push_str ( " connection?: any;\n " ) ;
551+ content. push_str ( " websocket_name?: string;\n " ) ;
552+ content. push_str ( " api_name?: string;\n " ) ;
553+ content. push_str ( " trace_id?: string;\n " ) ;
554+ content. push_str ( "}\n \n " ) ;
555+
556+ content. push_str ( & format ! (
557+ "export async function {}Middleware(\n " ,
558+ middleware_name
559+ ) ) ;
560+ content. push_str ( " context: MiddlewareContext,\n " ) ;
561+ content. push_str ( " state: State\n " ) ;
562+ content. push_str ( "): Promise<MiddlewareContext | null> {\n " ) ;
563+ content. push_str ( " /**\n " ) ;
564+ content. push_str ( & format ! ( " * Middleware function for {}.\n " , middleware_name) ) ;
565+ content. push_str ( " * \n " ) ;
566+ content. push_str ( " * @param context - Request context containing:\n " ) ;
567+ content. push_str ( " * - payload: Request payload (for APIs)\n " ) ;
568+ content. push_str ( " * - query_params: Query parameters (for APIs)\n " ) ;
569+ content. push_str ( " * - connection: WebSocket connection info (for WebSockets)\n " ) ;
570+ content. push_str ( " * - websocket_name: WebSocket name (for WebSockets)\n " ) ;
571+ content. push_str ( " * - api_name: API name (for APIs)\n " ) ;
572+ content. push_str ( " * - trace_id: Trace ID\n " ) ;
573+ content. push_str ( " * @param state - State object for logging and triggering events\n " ) ;
574+ content. push_str ( " * @returns Modified context with 'payload' and/or 'query_params' keys,\n " ) ;
575+ content. push_str ( " * or null to pass through unchanged. Throw an error to reject the request.\n " ) ;
576+ content. push_str ( " * \n " ) ;
577+ content. push_str ( " * To reject the request, throw an error:\n " ) ;
578+ content. push_str ( " * throw new Error('Access denied');\n " ) ;
579+ content. push_str ( " * \n " ) ;
580+ content. push_str ( " * To modify the request:\n " ) ;
581+ content. push_str ( " * return {\n " ) ;
582+ content. push_str ( " * ...context,\n " ) ;
583+ content. push_str ( " * payload: modifiedPayload,\n " ) ;
584+ content. push_str ( " * query_params: modifiedQueryParams\n " ) ;
585+ content. push_str ( " * };\n " ) ;
586+ content. push_str ( " */\n " ) ;
587+ content. push_str ( " // TODO: Implement middleware logic\n " ) ;
588+ content. push_str ( " // Example: Validate authentication\n " ) ;
589+ content. push_str ( " // Example: Rate limiting\n " ) ;
590+ content. push_str ( " // Example: Logging\n " ) ;
591+ content. push_str ( " // Example: Modify payload/query_params\n " ) ;
592+ content. push_str ( " \n " ) ;
593+ content. push_str ( " // Pass through unchanged\n " ) ;
594+ content. push_str ( " return null;\n " ) ;
595+ content. push_str ( "}\n " ) ;
596+
597+ content
598+ }
599+
507600fn generate_websocket_content ( ws : & WebSocket ) -> String {
508601 let mut content = String :: new ( ) ;
509602
0 commit comments