Add peer management routes and server configuration services
This commit is contained in:
165
lib/web/peer_routes.dart
Normal file
165
lib/web/peer_routes.dart
Normal file
@@ -0,0 +1,165 @@
|
||||
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/<publicKey>', _deletePeer);
|
||||
router.get('/peers/<publicKey>/config', _getPeerConfig);
|
||||
router.put('/peers/<publicKey>/speed-limit', _setSpeedLimit);
|
||||
router.put('/peers/<publicKey>/data-cap', _setDataCap);
|
||||
|
||||
return router;
|
||||
}
|
||||
|
||||
Future<Response> _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<Response> _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<Response> _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<Response> _setSpeedLimit(Request request) async {
|
||||
final publicKey = request.params['publicKey']!;
|
||||
|
||||
try {
|
||||
final body = await request.readAsString();
|
||||
final data = jsonDecode(body) as Map<String, dynamic>;
|
||||
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<Response> _setDataCap(Request request) async {
|
||||
final publicKey = request.params['publicKey']!;
|
||||
|
||||
try {
|
||||
final body = await request.readAsString();
|
||||
final data = jsonDecode(body) as Map<String, dynamic>;
|
||||
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'},
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user