74 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | /** | ||
|  |  * API Server | ||
|  |  * HTTP REST API compatible with Mailgun | ||
|  |  */ | ||
|  | 
 | ||
|  | import * as plugins from '../plugins.ts'; | ||
|  | 
 | ||
|  | export interface IApiServerOptions { | ||
|  |   port: number; | ||
|  |   apiKeys: string[]; | ||
|  | } | ||
|  | 
 | ||
|  | export class ApiServer { | ||
|  |   private server: Deno.HttpServer | null = null; | ||
|  | 
 | ||
|  |   constructor(private options: IApiServerOptions) {} | ||
|  | 
 | ||
|  |   /** | ||
|  |    * Start the API server | ||
|  |    */ | ||
|  |   async start(): Promise<void> { | ||
|  |     console.log(`[ApiServer] Starting on port ${this.options.port}...`); | ||
|  | 
 | ||
|  |     this.server = Deno.serve({ port: this.options.port }, (req) => { | ||
|  |       return this.handleRequest(req); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   /** | ||
|  |    * Stop the API server | ||
|  |    */ | ||
|  |   async stop(): Promise<void> { | ||
|  |     console.log('[ApiServer] Stopping...'); | ||
|  |     if (this.server) { | ||
|  |       await this.server.shutdown(); | ||
|  |       this.server = null; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   /** | ||
|  |    * Handle incoming HTTP request | ||
|  |    */ | ||
|  |   private async handleRequest(req: Request): Promise<Response> { | ||
|  |     const url = new URL(req.url); | ||
|  | 
 | ||
|  |     // Basic routing
 | ||
|  |     if (url.pathname === '/v1/messages' && req.method === 'POST') { | ||
|  |       return this.handleSendEmail(req); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (url.pathname === '/v1/domains' && req.method === 'GET') { | ||
|  |       return this.handleListDomains(req); | ||
|  |     } | ||
|  | 
 | ||
|  |     return new Response('Not Found', { status: 404 }); | ||
|  |   } | ||
|  | 
 | ||
|  |   private async handleSendEmail(req: Request): Promise<Response> { | ||
|  |     // TODO: Implement email sending
 | ||
|  |     return new Response(JSON.stringify({ message: 'Email queued' }), { | ||
|  |       status: 200, | ||
|  |       headers: { 'Content-Type': 'application/json' }, | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   private async handleListDomains(req: Request): Promise<Response> { | ||
|  |     // TODO: Implement domain listing
 | ||
|  |     return new Response(JSON.stringify({ domains: [] }), { | ||
|  |       status: 200, | ||
|  |       headers: { 'Content-Type': 'application/json' }, | ||
|  |     }); | ||
|  |   } | ||
|  | } |