Files
herolib/lib/hero/heroserver/api_handler.v
Mahmoud-Emad 386fae3421 refactor: integrate heromodels RPC with heroserver
- Integrate heromodels RPC as a handler within heroserver
- Update API endpoint to use standard JSON-RPC format
- Add generated curl examples with copy button to docs
- Improve error handling to return JSON-RPC errors
- Simplify heromodels server example script
2025-09-17 21:08:17 +03:00

67 lines
1.9 KiB
V

module heroserver
import json
import veb
import freeflowuniverse.herolib.schemas.jsonrpc
@['/auth/:action']
pub fn (mut server HeroServer) auth_handler(mut ctx Context, action string) !veb.Result {
match action {
'register' {
request := json.decode(RegisterRequest, ctx.req.data) or {
return ctx.request_error('Invalid JSON format')
}
server.register(request.pubkey)!
return ctx.json({
'status': 'success'
})
}
'authreq' {
request := json.decode(AuthRequest, ctx.req.data) or {
return ctx.request_error('Invalid JSON format')
}
response := server.auth_request(request.pubkey)!
return ctx.json(response)
}
'auth' {
request := json.decode(AuthSubmitRequest, ctx.req.data) or {
return ctx.request_error('Invalid JSON format')
}
response := server.auth_submit(request.pubkey, request.signature)!
return ctx.json(response)
}
else {
return ctx.not_found()
}
}
}
@['/api/:handler_type'; post]
pub fn (mut server HeroServer) api_handler(mut ctx Context, handler_type string) veb.Result {
// TODO: For now, skip authentication for testing
// session_key := ctx.get_header(.authorization) or {
// return ctx.request_error('Missing session key in Authorization header')
// }.replace('Bearer ', '')
// // Validate session
// mut session := server.validate_session(session_key) or {
// return ctx.request_error('Invalid session')
// }
// Get the registered handler
mut handler := server.handlers[handler_type] or {
return ctx.request_error('Handler not found: ${handler_type}')
}
// Parse JSON-RPC request
request := jsonrpc.decode_request(ctx.req.data) or {
return ctx.request_error('Invalid JSON-RPC request: ${err}')
}
// Handle the request using the OpenRPC handler
response := handler.handle(request) or { return ctx.server_error('Handler error: ${err}') }
// Return the JSON-RPC response
return ctx.json(response)
}