import 'dart:convert'; import 'package:shelf/shelf.dart'; import 'package:shelf_router/shelf_router.dart'; import '../../middleware/error_handler.dart'; import '../../shared/api_response.dart'; import 'streak_service.dart'; /// Streak module route definitions. class StreakRoutes { final StreakService _service; StreakRoutes(this._service); Router get router { final router = Router(); router.get('/', _listStreaks); router.post('/', _createStreak); router.get('/', _getStreak); router.post('//complete', _completeToday); router.post('//forgive', _forgive); router.post('//freeze', _freeze); router.get('//history', _getHistory); return router; } // ── Handlers ──────────────────────────────────────────────────────── Future _listStreaks(Request request) async { final userId = request.context['userId'] as String; final streaks = await _service.listStreaks(userId); return ApiResponse.success(streaks); } Future _createStreak(Request request) async { final userId = request.context['userId'] as String; final body = jsonDecode(await request.readAsString()) as Map; if (body['name'] == null || (body['name'] as String).isEmpty) { throw ApiException.badRequest('Name is required'); } final streak = await _service.createStreak(userId, body); return ApiResponse.created(streak); } Future _getStreak(Request request, String id) async { final userId = request.context['userId'] as String; final streak = await _service.getStreak(id, userId); return ApiResponse.success(streak); } Future _completeToday(Request request, String id) async { final userId = request.context['userId'] as String; final result = await _service.completeToday(id, userId); return ApiResponse.success(result, message: result['message'] as String); } Future _forgive(Request request, String id) async { final userId = request.context['userId'] as String; String? note; try { final body = jsonDecode(await request.readAsString()) as Map; note = body['note'] as String?; } catch (_) { // body optional } final result = await _service.forgive(id, userId, note: note); return ApiResponse.success(result, message: result['message'] as String); } Future _freeze(Request request, String id) async { final userId = request.context['userId'] as String; final body = jsonDecode(await request.readAsString()) as Map; final days = body['days'] as int?; if (days == null) { throw ApiException.badRequest('Field "days" is required'); } final result = await _service.freeze(id, userId, days: days); return ApiResponse.success(result, message: result['message'] as String); } Future _getHistory(Request request, String id) async { final userId = request.context['userId'] as String; final history = await _service.getHistory(id, userId); return ApiResponse.success(history); } }