import 'dart:convert'; import 'package:shelf/shelf.dart'; import 'package:shelf_router/shelf_router.dart'; import 'package:waylume_server/wireguard/peers.dart'; class PeerRoutes { Router get router { final router = Router(); router.post('/peers', _createPeer); router.delete('/peers/', _deletePeer); router.get('/peers//config', _getPeerConfig); router.put('/peers//speed-limit', _setSpeedLimit); router.put('/peers//data-cap', _setDataCap); return router; } Future _createPeer(Request request) async { try { final peer = await createPeer(); final config = await generateClientConfigForPeer(peer); return Response.ok( jsonEncode({ 'success': true, 'peer': peer.toJson(), 'config': config, }), headers: {'Content-Type': 'application/json'}, ); } catch (e) { return Response.internalServerError( body: jsonEncode({ 'success': false, 'error': e.toString(), }), headers: {'Content-Type': 'application/json'}, ); } } Future _deletePeer(Request request) async { final publicKey = request.params['publicKey']!; try { final success = await deletePeer(publicKey); return Response.ok( jsonEncode({ 'success': success, 'message': success ? 'Peer deleted successfully' : 'Failed to delete peer', }), headers: {'Content-Type': 'application/json'}, ); } catch (e) { return Response.internalServerError( body: jsonEncode({ 'success': false, 'error': e.toString(), }), headers: {'Content-Type': 'application/json'}, ); } } Future _getPeerConfig(Request request) async { final publicKey = request.params['publicKey']!; try { return Response.notFound( jsonEncode({ 'success': false, 'error': 'Config retrieval not implemented - peer info not stored', }), headers: {'Content-Type': 'application/json'}, ); } catch (e) { return Response.internalServerError( body: jsonEncode({ 'success': false, 'error': e.toString(), }), headers: {'Content-Type': 'application/json'}, ); } } Future _setSpeedLimit(Request request) async { final publicKey = request.params['publicKey']!; try { final body = await request.readAsString(); final data = jsonDecode(body) as Map; final speedKbps = data['speedKbps'] as int?; if (speedKbps == null) { return Response.badRequest( body: jsonEncode({ 'success': false, 'error': 'speedKbps parameter is required', }), headers: {'Content-Type': 'application/json'}, ); } await setSpeedLimit(publicKey, speedKbps); return Response.ok( jsonEncode({ 'success': true, 'message': 'Speed limit set successfully', }), headers: {'Content-Type': 'application/json'}, ); } catch (e) { return Response.internalServerError( body: jsonEncode({ 'success': false, 'error': e.toString(), }), headers: {'Content-Type': 'application/json'}, ); } } Future _setDataCap(Request request) async { final publicKey = request.params['publicKey']!; try { final body = await request.readAsString(); final data = jsonDecode(body) as Map; final dataCapMB = data['dataCapMB'] as int?; if (dataCapMB == null) { return Response.badRequest( body: jsonEncode({ 'success': false, 'error': 'dataCapMB parameter is required', }), headers: {'Content-Type': 'application/json'}, ); } await setDataCap(publicKey, dataCapMB); return Response.ok( jsonEncode({ 'success': true, 'message': 'Data cap set successfully', }), headers: {'Content-Type': 'application/json'}, ); } catch (e) { return Response.internalServerError( body: jsonEncode({ 'success': false, 'error': e.toString(), }), headers: {'Content-Type': 'application/json'}, ); } } }