part of 'endpoint_service.dart'; extension EndpointServiceTeacherX on EndpointService { Future>>> teacherScheduleWeeklyPersonal() async { try { final response = await http .get(Uri.parse(ApiConstant.teacherScheduleWeeklyPersonal), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken" }); final status = response.statusCode; final data = jsonDecode(response.body); if (response.statusCode == 200) { final schedules = (data["data"] as List) .map((e) => e as Map) .toList(); log("Message: ${data["message"]}"); log("Schedules: $schedules"); return ApiResult( success: data["success"] ?? true, data: schedules, message: data["message"], statusCode: status, ); } else { log("Teacher schedule weekly personal error: ${response.body}"); return ApiResult( success: data["success"] ?? false, message: data["message"] ?? "Something went wrong", statusCode: status, errors: data['errors'] ?? "Failed to fetch teacher schedule", ); } } catch (e) { log('Exception: $e'); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } Future>>> teacherSchedulePersonal() async { try { final response = await http .get(Uri.parse(ApiConstant.teacherSchedulePersonal), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken" }); final status = response.statusCode; final data = jsonDecode(response.body); if (response.statusCode == 200) { final schedules = (data["data"] as List) .map((e) => e as Map) .toList(); log("Message: ${data["message"]}"); log("Schedules: $schedules"); return ApiResult( success: data["success"] ?? true, data: schedules, message: data["message"], statusCode: status, ); } else { log("Teacher schedule personal error: ${response.body}"); return ApiResult( success: data["success"] ?? false, message: data["message"] ?? "Something went wrong", statusCode: status, errors: data['errors'] ?? "Failed to fetch teacher schedule", ); } } catch (e) { log('Exception: $e'); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } Future>>> scheduleByClass( String classId) async { try { final response = await http.get( Uri.parse('${ApiConstant.teacherScheduleClass}/$classId'), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken" }); final status = response.statusCode; final data = jsonDecode(response.body); if (response.statusCode == 200) { final schedules = (data["data"] as List) .map((e) => e as Map) .toList(); log("Message: ${data["message"]}"); log("Schedules: $schedules"); return ApiResult( success: data["success"] ?? true, data: schedules, message: data["message"], statusCode: status, ); } else { log("Schedule by class error: ${response.body}"); return ApiResult( success: data["success"] ?? false, message: data["message"] ?? "Something went wrong", statusCode: status, errors: data['errors'] ?? "Failed to fetch schedule by class", ); } } catch (e) { log('Exception: $e'); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } Future>> detailInformationClass( String classId) async { try { final response = await http.get( Uri.parse('${ApiConstant.detailInformationClass}/$classId'), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken" }); final status = response.statusCode; final data = jsonDecode(response.body); if (response.statusCode == 200) { log("Message: ${data["message"]}"); log("Class information: ${data["data"]}"); return ApiResult( success: data["success"] ?? true, data: data["data"], message: data["message"], statusCode: status, ); } else { log("Detail information class error: ${response.body}"); return ApiResult( success: data["success"] ?? false, message: data["message"] ?? "Something went wrong", statusCode: status, errors: data['errors'] ?? "Failed to fetch class information", ); } } catch (e) { log('Exception: $e'); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } // teacher only can access this endpoint to get all attendance history of student in class by date. Future>>> teacherClassesAttendance({ required String classId, required DateTime date, }) async { try { // date parameter in format YYYY-MM-DD final String dateStr = '${date.year.toString().padLeft(4, '0')}-' '${date.month.toString().padLeft(2, '0')}-' '${date.day.toString().padLeft(2, '0')}'; final response = await http.get( Uri.parse( '${ApiConstant.reportStudentAttendanceByClass}/$classId/$dateStr'), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken" }, ); final status = response.statusCode; final data = jsonDecode(response.body); if (status == 200) { final classes = (data["data"] as List) .map((e) => e as Map) .toList(); log("Message: ${data["message"]}"); log("Classes with Schedule attendance: $classes"); return ApiResult( success: data["success"] ?? true, data: classes, message: data["message"], statusCode: status, ); } else { log("Teacher classes error: ${response.body}"); return ApiResult( success: data["success"] ?? false, message: data["message"] ?? "Something went wrong", statusCode: status, errors: data['errors'] ?? "Failed to fetch teacher classes", ); } } catch (e) { log("Exception: $e"); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } // get all classes attendance history daily for teacher by date and class id. Future>>> fetchClassesAttendanceHistoryDaily( {required String classId, required String date // in format YYYY-MM-DD }) async { try { final response = await http.get( // /api/teacher/attendance/daily/class?id_class=1&date=2026-03-16 Uri.parse( '${ApiConstant.reportStudentAttendanceDailyByClass}?id_class=$classId&date=$date'), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken" }, ); final status = response.statusCode; final data = jsonDecode(response.body); if (status == 200 || status == 201) { final attendanceList = (data["data"] as List) .map((e) => e as Map) .toList(); return ApiResult( success: true, data: attendanceList, message: data["message"] ?? "Success", statusCode: status, ); } else { return ApiResult( success: false, message: data["message"] ?? "Failed to fetch data", statusCode: status, ); } } catch (e) { log("Exception: $e"); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } // send notification topic for teacher Future>> sendAnnouncement({ required String? title, required String message, required String idClass, required AnnouncementTypeEnum type, // "class_canceled", "assignment". (add later if needed) }) async { try { final response = await http.post( Uri.parse(ApiConstant.sendAnnouncement), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken", }, body: title != null ? { "title": title, "body": message, "class_id": idClass, "type": type.value, } : { "body": message, "class_id": idClass, "type": type.value, }, ); final decoded = jsonDecode(response.body) as Map; if (response.statusCode == 200 || response.statusCode == 201) { log("Announcement sent successfully: ${decoded["message"]}"); return ApiResult( success: decoded["success"] ?? true, message: decoded["message"] ?? "Announcement sent successfully", data: decoded["data"] is Map ? decoded["data"] as Map : null, statusCode: response.statusCode, ); } else { log("Failed to send announcement: ${response.body}"); final rawErrors = decoded["errors"]; return ApiResult( success: decoded["success"] ?? false, message: decoded["message"] ?? "Failed to send announcement", statusCode: response.statusCode, errors: rawErrors is Map ? rawErrors : { "message": rawErrors?.toString() ?? "Failed to send announcement" }, ); } } catch (e) { log("Exception while sending announcement: $e"); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } /// permission student feature zone // get permission by class. Future>>> permissionByClass( String classId, String startDate, // in format YYYY-MM-DD String endDate, // in format YYYY-MM-DD ) async { try { final response = await http.get( Uri.parse( '${ApiConstant.permissionReportByClass}/$classId?start_date=$startDate&end_date=$endDate'), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken" }); final status = response.statusCode; final data = jsonDecode(response.body); if (response.statusCode == 200) { final permissions = (data["data"] as List) .map((e) => e as Map) .toList(); log("Message: ${data["message"]}"); log("Permissions: $permissions"); return ApiResult( success: data["success"] ?? true, data: permissions, message: data["message"], statusCode: status, ); } else { log("Permission by class error: ${response.body}"); return ApiResult( success: data["success"] ?? false, message: data["message"] ?? "Something went wrong", statusCode: status, errors: data['errors'] ?? "Failed to fetch permissions by class", ); } } catch (e) { log('Exception: $e'); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } // accept permission by id permission (teacher only) Future>> acceptPermission( String permissionId) async { try { final response = await http.post( Uri.parse(ApiConstant.permissionAccept), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken" }, body: { "permission_id": permissionId, }, ); final status = response.statusCode; final data = jsonDecode(response.body); if (response.statusCode == 200) { log("Permission accepted successfully: ${data["message"]}"); return ApiResult( success: data["success"] ?? true, message: data["message"] ?? "Permission accepted successfully", data: data["data"] is Map ? data["data"] as Map : null, statusCode: status, ); } else { log("Failed to accept permission: ${response.body}"); return ApiResult( success: data["success"] ?? false, message: data["message"] ?? "Failed to accept permission", statusCode: status, errors: data['errors'] ?? "Failed to accept permission", ); } } catch (e) { log("Exception while accepting permission: $e"); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } // reject permission by id permission (teacher only) Future>> rejectPermission( String permissionId, String reasonReject) async { try { final response = await http.post( Uri.parse(ApiConstant.permissionReject), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken", }, body: { "permission_id": permissionId, "feedback": reasonReject, }, ); final status = response.statusCode; final data = jsonDecode(response.body); if (response.statusCode == 200) { log("Permission rejected successfully: ${data["message"]}"); return ApiResult( success: data["success"] ?? true, message: data["message"] ?? "Permission rejected successfully", data: data["data"] is Map ? data["data"] as Map : null, statusCode: status, ); } else { log("Failed to reject permission: ${response.body}"); return ApiResult( success: data["success"] ?? false, message: data["message"] ?? "Failed to reject permission", statusCode: status, errors: data['errors'] ?? "Failed to reject permission", ); } } catch (e) { log("Exception while rejecting permission: $e"); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } /// permission student feature zone END /// disrepancy report feature zone (teacher only) Future>> submitDiscrepancyReport({ required String attendanceHistoryId, required String disrepancyType, required String reason, }) async { try { final response = await http.post( Uri.parse(ApiConstant.discrepancyReport), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken", }, body: { "attendance_history_id": attendanceHistoryId, "disrepancy_type": disrepancyType, "description": reason, }, ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); log("Discrepancy report submitted successfully: ${data["message"]}"); return ApiResult( success: data["success"] ?? true, message: data["message"] ?? "Discrepancy report submitted successfully", data: data["data"] is Map ? data["data"] as Map : null, statusCode: response.statusCode, ); } else { log("Failed to submit discrepancy report: ${response.body}"); final data = jsonDecode(response.body); final rawErrors = data["errors"]; return ApiResult( success: data["success"] ?? false, message: data["message"] ?? "Failed to submit discrepancy report", statusCode: response.statusCode, errors: rawErrors is Map ? rawErrors : { "message": rawErrors?.toString() ?? "Failed to submit discrepancy report" }, ); } } catch (e) { log("Exception while submitting discrepancy report: $e"); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } /// disrepancy report feature zone END // get all activity from teacher here. Future>>> getTeacherActivity({ required String startDate, // in format YYYY-MM-DD required String endDate, // in format YYYY-MM-DD }) async { try { final response = await http.get( // {{wifirumah}}/api/teacher/activity?start_date=2026-04-1&end_date=2026-04-23 Uri.parse( '${ApiConstant.teacherActivity}?start_date=$startDate&end_date=$endDate'), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken", }, ); final status = response.statusCode; final data = jsonDecode(response.body); if (status == 200) { final activities = (data["data"] as List) .map((e) => e as Map) .toList(); log("Message: ${data["message"]}"); log("Activities: $activities"); return ApiResult( success: data["success"] ?? true, data: activities, message: data["message"], statusCode: status, ); } else { log("Get teacher activity error: ${response.body}"); return ApiResult( success: data["success"] ?? false, message: data["message"] ?? "Something went wrong", statusCode: status, errors: data['errors'] ?? "Failed to fetch teacher activity", ); } } catch (e) { log('Exception: $e'); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } // generate qr code public for teacher // teacher/attendance/qr/generate/{schedule_id} // { // "success": true, // "message": "QR link generated", // "data": { // "url": "http://presensiku.site/public/attendance/qr/ltZcKoHd7yN2DbL6ijkYlBpt7j1zxtsDTmKNAl6xq9cD9mK7IFRi7YGndUoPpmm9", // "token": "ltZcKoHd7yN2DbL6ijkYlBpt7j1zxtsDTmKNAl6xq9cD9mK7IFRi7YGndUoPpmm9", // "schedule_id": "1", // "expired_in_seconds": 600, // "expired_in_minutes": 10 // } // } Future>> generateScheduleQrCode( String scheduleId) async { try { final response = await http.get( Uri.parse('${ApiConstant.scheduleQrURL}/$scheduleId'), headers: { "Accept": "application/json", "Authorization": "$tokenType $accessToken", }, ); final status = response.statusCode; final data = jsonDecode(response.body); if (status == 200 || status == 201) { final qrData = (data["data"] as Map) .map((key, value) => MapEntry(key, value)); log("Message: ${data["message"]}"); log("QR Data: $qrData"); return ApiResult( success: data["success"] ?? true, data: qrData, message: data["message"], statusCode: status, ); } else { log("Failed to generate schedule QR code: ${response.body}"); return ApiResult( success: data["success"] ?? false, message: data["message"] ?? "Failed to generate schedule QR code", statusCode: status, errors: data['errors'] ?? "Failed to generate schedule QR code", ); } } catch (e) { log("Exception while generating schedule QR code: $e"); return ApiResult( success: false, message: "Exception: $e", statusCode: null, ); } } }