import 'dart:io'; import 'dart:convert'; import 'package:shelf/shelf.dart'; import 'package:shelf/shelf_io.dart' as io; import 'package:shelf_router/shelf_router.dart'; import 'package:tracker_backend/database.dart'; void main(List args) async { // Use port 8090 as requested final port = 8090; final db = TrackerDatabase(); final app = Router(); app.get('/', (Request request) { return Response.ok('Tracker Sync Server Running'); }); // Simple Sync Endpoint (Push) // Expects JSON: { "userId": "...", "entries": [ ... ] } app.post('/sync/push', (Request request) async { try { final payload = await request.readAsString(); final data = jsonDecode(payload); final userId = data['userId']; final entries = data['entries'] as List; print('Received sync push for $userId with ${entries.length} entries'); for (var entry in entries) { // Basic upsert handling db.upsertCycleEntry(userId, entry); } return Response.ok( jsonEncode({'status': 'success', 'synced': entries.length})); } catch (e) { print('Sync Error: $e'); return Response.internalServerError(body: 'Sync Failed: $e'); } }); // Pull Endpoint // GET /sync/pull?userId=... app.get('/sync/pull', (Request request) { final userId = request.url.queryParameters['userId']; if (userId == null) return Response.badRequest(body: 'Missing userId'); final entries = db.getCycleEntries(userId); return Response.ok(jsonEncode({'entries': entries})); }); // Enable CORS final handler = Pipeline().addMiddleware((innerHandler) { return (request) async { final response = await innerHandler(request); return response.change(headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Headers': 'Origin, Content-Type', }); }; }).addHandler(app); final server = await io.serve(handler, InternetAddress.anyIPv4, port); print('Server running on localhost:${server.port}'); }