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 '../../shared/pagination.dart'; import 'reward_service.dart'; /// Reward module route definitions. class RewardRoutes { final RewardService _service; RewardRoutes(this._service); Router get router { final router = Router(); router.post('/generate', _generate); router.get('/history', _history); return router; } // ── Handlers ──────────────────────────────────────────────────────── Future _generate(Request request) async { final userId = request.context['userId'] as String; final body = jsonDecode(await request.readAsString()) as Map; final taskId = body['task_id'] as String?; final taskEnergyLevel = body['task_energy_level'] as int?; if (taskId == null || taskEnergyLevel == null) { throw ApiException.badRequest( 'Missing required fields: task_id, task_energy_level', ); } final reward = await _service.generateReward( userId: userId, taskId: taskId, taskEnergyLevel: taskEnergyLevel, currentStreak: (body['current_streak'] as int?) ?? 0, ); return ApiResponse.created(reward, message: 'Reward generated!'); } Future _history(Request request) async { final userId = request.context['userId'] as String; final paging = Pagination.fromRequest(request); final rewards = await _service.getHistory( userId, limit: paging.perPage, offset: paging.offset, ); return ApiResponse.success(rewards); } }