Complete Socratic adaptive exams in Flutter, Guardian WhatsApp alerts, and curriculum robustness
This commit is contained in:
@@ -3,6 +3,7 @@ import '../../core/network/api_client.dart';
|
||||
import '../../core/services/storage_service.dart';
|
||||
import '../models/user_model.dart';
|
||||
import '../models/lesson_model.dart';
|
||||
import '../models/exam_model.dart';
|
||||
|
||||
/// Authentication Repository (OTP, National ID, me, logout)
|
||||
class AuthRepository {
|
||||
@@ -176,3 +177,52 @@ class GuardianRepository {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/// Exam Repository (Adaptive Exams, Questions, Diagnostic Submissions)
|
||||
class ExamRepository {
|
||||
final ApiClient _api;
|
||||
|
||||
ExamRepository({ApiClient? api}) : _api = api ?? ApiClient();
|
||||
|
||||
Future<List<ExamModel>> getExams({int? courseId, int? lessonId, String? scope}) async {
|
||||
final params = <String, dynamic>{};
|
||||
if (courseId != null) params['course_id'] = courseId;
|
||||
if (lessonId != null) params['lesson_id'] = lessonId;
|
||||
if (scope != null) params['scope'] = scope;
|
||||
|
||||
final res = await _api.get(AppConfig.examsEndpoint, queryParams: params);
|
||||
if (res is Map && res['data'] is List) {
|
||||
return (res['data'] as List)
|
||||
.map((item) => ExamModel.fromJson(Map<String, dynamic>.from(item)))
|
||||
.toList();
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
Future<ExamModel> getExamDetails(int examId) async {
|
||||
final res = await _api.get('${AppConfig.examsEndpoint}/$examId');
|
||||
if (res is Map && res['data'] is Map) {
|
||||
return ExamModel.fromJson(Map<String, dynamic>.from(res['data']));
|
||||
}
|
||||
throw ApiException('فشل تحميل تفاصيل الامتحان');
|
||||
}
|
||||
|
||||
Future<ExamSubmissionResultModel> submitExam(
|
||||
int examId, {
|
||||
required List<Map<String, dynamic>> answers,
|
||||
required int timeSpentSeconds,
|
||||
}) async {
|
||||
final res = await _api.post(
|
||||
'${AppConfig.examsEndpoint}/$examId/submit',
|
||||
body: {
|
||||
'answers': answers,
|
||||
'time_spent_seconds': timeSpentSeconds,
|
||||
},
|
||||
);
|
||||
|
||||
if (res is Map && res['data'] is Map) {
|
||||
return ExamSubmissionResultModel.fromJson(Map<String, dynamic>.from(res['data']));
|
||||
}
|
||||
throw ApiException('فشل تقديم الامتحان والتشخيص الذكي');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user