Files
Tracker/backend/bin/server.dart

68 lines
2.1 KiB
Dart

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<String> 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}');
}