import 'package:dio/dio.dart'; import 'package:yimaru_app/models/learn_lesson.dart'; import 'package:yimaru_app/models/learn_practice.dart'; import 'package:yimaru_app/models/learn_program.dart'; import 'package:yimaru_app/models/level.dart'; import 'package:yimaru_app/models/assessment_question.dart'; import 'package:yimaru_app/models/course_catalog.dart'; import 'package:yimaru_app/models/course_lesson.dart'; import 'package:yimaru_app/models/course_progress.dart'; import 'package:yimaru_app/models/course.dart'; import 'package:yimaru_app/models/practice.dart'; import 'package:yimaru_app/models/user.dart'; import 'package:yimaru_app/services/dio_service.dart'; import 'package:yimaru_app/ui/common/app_constants.dart'; import '../app/app.locator.dart'; import '../models/course_module.dart'; import '../models/course_unit.dart'; import '../models/learn_course.dart'; import '../models/learn_module.dart'; import '../models/learn_question.dart'; import '../models/learn_subscription.dart'; import '../models/lesson.dart'; import '../models/module.dart'; import '../models/assessment.dart'; import '../models/submodule.dart'; import '../models/learn_subscription_request.dart'; import '../ui/common/enmus.dart'; class ApiService { // Dependency injection final _service = locator(); // Register with email Future> registerWithEmail( Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$kRegisterUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Otp sent successfully' }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Login Future> login(Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kLoginUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Logged in successfully', 'data': User.fromJson(response.data['data']), }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Google auth Future> googleAuth(Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kGoogleAuthUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Logged in successfully', 'data': User.fromJson(response.data['data']), }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Verify otp Future> verifyOtp(Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$kVerifyOtpUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Otp verified successfully', 'data': User.fromJson(response.data['data']), }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Resend otp Future> resendOtp(Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$kResendOtpUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Otp resend successfully' }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Request reset code Future> requestResetCode( Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$kRequestResetCode', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Reset code sent successfully', }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Reset password Future> resetPassword(Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$kResetPassword', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Password reset successfully', }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Get profile completion status Future> getProfileStatus(User? user) async { try { Response response = await _service.dio.get( '$kBaseUrl/$kUserBaseUrl/${user?.userId}/$kProfileStatusUrl', ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Profile completion status fetched successfully', 'data': response.data['data']['is_profile_completed'] as bool, }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Get profile data Future> getProfileData(int? userId) async { try { Response response = await _service.dio.get( '$kBaseUrl/$kUserBaseUrl/$kGetUserUrl', ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Profile fetched successfully', 'data': User.fromJson(response.data['data']), }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Complete profile Future> completeProfile( Map data) async { try { Response response = await _service.dio.put( '$kBaseUrl/$kUserBaseUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Profile updated successfully' }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Update profile image Future> updateProfileImage( {required int? userId, required Map data}) async { try { late FormData formData; if (data['profile_picture_url'] .toString() .contains('com.yimaru.lms.app/')) { formData = FormData.fromMap({ 'file': data['profile_picture_url'].toString().isNotEmpty ? MultipartFile.fromFileSync( data['profile_picture_url'], filename: data['profile_picture_url'].toString().split('/').last, ) : null, }); } else { formData = FormData.fromMap({ 'file': data['profile_picture_url'].toString().isNotEmpty ? MultipartFile.fromFileSync( data['profile_picture_url'], filename: data['profile_picture_url'].toString().split('/').last, ) : null, }); } Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$userId/$kUpdateProfileImage', data: formData, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Profile updated successfully' }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Get assessment question sets Future> getAssessments() async { try { List assessments = []; final Response response = await _service.dio.get( '$kBaseUrl/api/$kApiVersionUrl/$kQuestionSetsUrl?set_type=INITIAL_ASSESSMENT&limit=10&offset=0'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['question_sets'] as List; assessments = decodedData .map( (e) { return Assessment.fromJson(e); }, ) .toList() .reversed .toList(); return assessments; } return []; } catch (e) { return []; } } // Get assessment questions Future> getAssessmentQuestions(int id) async { try { List questions = []; final Response response = await _service.dio.get( '$kBaseUrl/api/$kApiVersionUrl/$kQuestionSetsUrl/$id/$kQuestionsUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; questions = decodedData.map( (e) { return AssessmentQuestion.fromJson(e); }, ).toList(); return questions; } return []; } catch (e) { return []; } } // Learn learn programs Future> getLearnPrograms() async { try { List learnPrograms = []; final Response response = await _service.dio.get('$kBaseUrl/api/$kApiVersionUrl/$kProgramsUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['programs'] as List; learnPrograms = decodedData.map( (e) { return LearnProgram.fromJson(e); }, ).toList(); return learnPrograms; } return []; } catch (e) { return []; } } // Learn learn courses Future> getLearnCourses(int id) async { try { List learnCourses = []; final Response response = await _service.dio .get('$kBaseUrl/api/$kApiVersionUrl/$kProgramsUrl/$id/$kCoursesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['courses'] as List; learnCourses = decodedData.map( (e) { return LearnCourse.fromJson(e); }, ).toList(); return learnCourses; } return []; } catch (e) { return []; } } // Learn course practices Future> getLearnCoursePractices(int id) async { try { List practices = []; final Response response = await _service.dio .get('$kBaseUrl/api/$kApiVersionUrl/$kCoursesUrl/$id/$kPracticesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['practices'] as List; practices = decodedData.map( (e) { return LearnPractice.fromJson(e); }, ).toList(); return practices; } return []; } catch (e) { return []; } } // Get learn modules Future> getLearnModules(int id) async { try { List modules = []; final Response response = await _service.dio .get('$kBaseUrl/api/$kApiVersionUrl/$kCoursesUrl/$id/$kModulesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['modules'] as List; modules = decodedData.map( (e) { return LearnModule.fromJson(e); }, ).toList(); return modules; } return []; } catch (e) { return []; } } // Learn module practices Future> getLearnModulePractices(int id) async { try { List practices = []; final Response response = await _service.dio .get('$kBaseUrl/api/$kApiVersionUrl/$kModulesUrl/$id/$kPracticesUrl'); print('MODULE PRACTICES: ${response.data}'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['practices'] as List; practices = decodedData.map( (e) { return LearnPractice.fromJson(e); }, ).toList(); return practices; } return []; } catch (e) { return []; } } // Get learn lessons Future> getLearnLessons(int id) async { try { List lessons = []; final Response response = await _service.dio .get('$kBaseUrl/api/$kApiVersionUrl/$kModulesUrl/$id/$kLessonsUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['lessons'] as List; lessons = decodedData.map( (e) { return LearnLesson.fromJson(e); }, ).toList(); return lessons; } return []; } catch (e) { return []; } } // Complete lesson Future> completeLearnLesson(int id) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kApiUrl/$kApiVersionUrl/$kLessonsUrl/$id/$kCompleteUrl', ); if (response.statusCode == 200 && response.data['success']) { return { 'message': 'Lesson completed', 'status': ResponseStatus.success, }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Learn lesson practices Future> getLearnLessonPractices(int id) async { try { List practices = []; final Response response = await _service.dio .get('$kBaseUrl/api/$kApiVersionUrl/$kLessonsUrl/$id/$kPracticesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['practices'] as List; practices = decodedData.map( (e) { return LearnPractice.fromJson(e); }, ).toList(); return practices; } return []; } catch (e) { return []; } } // Get learn questions Future> getLearnQuestions(int id) async { try { List questions = []; print('Here'); final Response response = await _service.dio.get( '$kBaseUrl/api/$kApiVersionUrl/$kQuestionSetsUrl/$id/$kQuestionsUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; questions = decodedData.map( (e) { return LearnQuestion.fromJson(e); }, ).toList(); return questions; } return []; } catch (e) { return []; } } // Complete lesson Future> completeLearnPractice(int id) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kApiUrl/$kApiVersionUrl/$kProgressUrl/$kPracticesUrl/$id/$kCompleteUrl', ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Lesson completed' }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } Future> getLearnSubscriptions() async { try { List subscriptions = []; final Response response = await _service.dio .get('$kBaseUrl/$kApiUrl/$kApiVersionUrl/$kSubscriptionsUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; subscriptions = decodedData.map( (e) { return LearnSubscription.fromJson(e); }, ).toList(); return subscriptions; } return []; } catch (e) { return []; } } // Create subscription Future> createSubscriptionRequest( Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kApiUrl/$kApiVersionUrl/$kPaymentsUrl/$kSubscribeUrl', data: data); if (response.statusCode == 200) { return { 'message': 'Lesson completed', 'status': ResponseStatus.success, 'data': LearnSubscriptionRequest.fromJson(response.data['data']), }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Get course catalogs Future> getCourseCatalogs() async { try { List catalogs = []; final Response response = await _service.dio.get( '$kBaseUrl/$kApiUrl/$kApiVersionUrl/$kExamPrepUrl/$kCatalogCoursesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['catalog_courses'] as List; catalogs = decodedData.map( (e) { return CourseCatalog.fromJson(e); }, ).toList(); return catalogs; } return []; } catch (e) { return []; } } // Get course units Future> getCourseUnits(int id) async { try { List units = []; final Response response = await _service.dio.get( '$kBaseUrl/$kApiUrl/$kApiVersionUrl/$kExamPrepUrl/$kCatalogCoursesUrl/$id/$kUnitsUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['units'] as List; units = decodedData.map( (e) { return CourseUnit.fromJson(e); }, ).toList(); return units; } return []; } catch (e) { return []; } } // Get course modules Future> getCourseModules(int id) async { try { List modules = []; final Response response = await _service.dio.get( '$kBaseUrl/$kApiUrl/$kApiVersionUrl/$kExamPrepUrl/$kUnitsUrl/$id/$kModulesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['modules'] as List; modules = decodedData.map( (e) { return CourseModule.fromJson(e); }, ).toList(); return modules; } return []; } catch (e) { return []; } } /* TO BE MODIFIED*/ // Get courses // Future> getCourses(int id) async { // try { // List courses = []; // // final Response response = await _service.dio // .get('$kBaseUrl/$kCourseBaseUrl/$kCoursesUrl/$id/$kSubcoursesUrl'); // // if (response.statusCode == 200) { // var data = response.data; // var decodedData = data['data']['sub_courses'] as List; // courses = decodedData.map( // (e) { // return Course.fromJson(e); // }, // ).toList(); // return courses; // } // return []; // } catch (e) { // return []; // } // } // Get course progress Future> getCourseProgress(int id) async { try { List courseProgress = []; final Response response = await _service.dio.get('$kBaseUrl/$kCourseProgressUrl/$id'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; courseProgress = decodedData.map( (e) { return CourseProgress.fromJson(e); }, ).toList(); return courseProgress; } return []; } catch (e) { return []; } } // Get course lessons Future> getCourseLessons(int id) async { try { List courseLessons = []; final Response response = await _service.dio.get( '$kBaseUrl/$kCourseBaseUrl/$kSubcoursesUrl/$id/$kPublishedVideos'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; courseLessons = decodedData.map( (e) { return CourseLesson.fromJson(e); }, ).toList(); return courseLessons; } return []; } catch (e) { return []; } } // Complete lesson Future> completeLesson(int id) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kLessonProgressUrl/$id/$kCompleteUrl', ); if (response.statusCode == 200) { return {'status': ResponseStatus.success, 'message': 'Video completed'}; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Course practices Future> getCoursePractices(int id) async { try { List coursePractices = []; final Response response = await _service.dio.get( '$kBaseUrl/$kPracticeBaseUrl/$kCoursePractice?owner_type=SUB_COURSE&owner_id=$id'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; coursePractices = decodedData.map( (e) { return Practice.fromJson(e); }, ).toList(); return coursePractices; } return []; } catch (e) { return []; } } // Get course practic questions Future> getCoursePracticeQuestions(int id) async { try { List coursePracticeQuestions = []; final Response response = await _service.dio .get('$kBaseUrl/$kPracticeBaseUrl/$id/$kCoursePracticeQuestions'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; coursePracticeQuestions = decodedData.map( (e) { return AssessmentQuestion.fromJson(e); }, ).toList(); return coursePracticeQuestions; } return []; } catch (e) { return []; } } // Get course practice question Future getCoursePracticeQuestion(int id) async { try { final Response response = await _service.dio.get('$kBaseUrl/$kCoursePracticeQuestion/$id'); if (response.statusCode == 200) { AssessmentQuestion question = AssessmentQuestion.fromJson(response.data['data']); return question; } return null; } catch (e) { return null; } } // Get learn subcategories Future> getLearnSubcategories() async { try { List learnSubcategories = []; final Response response = await _service.dio.get( '$kBaseUrl/api/$kApiVersionUrl/$kCourseManagementUrl/$kLearnSubcategoriesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['sub_categories'] as List; learnSubcategories = decodedData.map( (e) { return CourseCatalog.fromJson(e); }, ).toList(); return learnSubcategories; } return []; } catch (e) { return []; } } // Get courses Future> getCourses(int id) async { try { List courses = []; final Response response = await _service.dio.get( '$kBaseUrl/api/$kApiVersionUrl/$kCourseManagementUrl/$kSubcategoriesUrl/$id/$kCoursesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['courses'] as List; courses = decodedData.map( (e) { return Course.fromJson(e); }, ).toList(); return courses; } return []; } catch (e) { return []; } } // Get levels Future> getLevels(int id) async { try { List levels = []; final Response response = await _service.dio.get( '$kBaseUrl/api/$kApiVersionUrl/$kCourseManagementUrl/$kCoursesUrl/$id/$kLevelsUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['levels'] as List; levels = decodedData.map( (e) { return Level.fromJson(e); }, ).toList(); return levels; } return []; } catch (e) { return []; } } // Get modules Future> getModules(int id) async { try { List modules = []; final Response response = await _service.dio.get( '$kBaseUrl/api/$kApiVersionUrl/$kCourseManagementUrl/$kLevelsUrl/$id/$kModulesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['modules'] as List; modules = decodedData.map( (e) { return Module.fromJson(e); }, ).toList(); return modules; } return []; } catch (e) { return []; } } // Get submodules Future> getSubmodules(int id) async { try { List submodules = []; final Response response = await _service.dio.get( '$kBaseUrl/api/$kApiVersionUrl/$kCourseManagementUrl/$kModulesUrl/$id/$kSubmodulesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['sub_modules'] as List; submodules = decodedData.map( (e) { return Submodule.fromJson(e); }, ).toList(); return submodules; } return []; } catch (e) { return []; } } // Get lessons Future> getLessons(int id) async { try { List lessons = []; final Response response = await _service.dio.get( '$kBaseUrl/api/$kApiVersionUrl/$kCourseManagementUrl/$kSubmodulesUrl/$id/$kLessonsUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; lessons = decodedData.map( (e) { return Lesson.fromJson(e); }, ).toList(); return lessons; } return []; } catch (e) { return []; } } // Practices Future> getPractices(int id) async { try { List coursePractices = []; final Response response = await _service.dio.get( '$kBaseUrl/$kPracticeBaseUrl/$kCoursePractice?owner_type=SUB_MODULE&owner_id=$id'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; coursePractices = decodedData.map( (e) { return Practice.fromJson(e); }, ).toList(); return coursePractices; } return []; } catch (e) { return []; } } // Questions Future> getQuestions(int id) async { try { List questions = []; final Response response = await _service.dio.get( '$kBaseUrl/api/$kApiVersionUrl/$kQuestionSetsUrl/$id/$kQuestionsUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; questions = decodedData.map( (e) { return AssessmentQuestion.fromJson(e); }, ).toList(); return questions; } return []; } catch (e) { return []; } } }