import 'dart:io'; import 'package:path_provider/path_provider.dart'; import 'package:dio/dio.dart'; import 'package:file_picker/file_picker.dart'; import 'package:qadirneyriz/config/config.dart'; import 'package:qadirneyriz/models/meetings/meetings_model.dart'; import 'package:qadirneyriz/models/meetings/one_meeting_model.dart'; import 'package:qadirneyriz/setting/setting.dart'; import 'package:qadirneyriz/utils/result/result.dart'; class MeetingsApi { Future getMeetings({ required int count, required int page, String? fromDate, String? toDate, int? location, int? subject, int? meetingManager, int? status, }) async { Map headers = { 'Accept': 'application/json', }; String dataToken = setting.userLocalDb.getUser().token!; if (dataToken != '') { headers['Authorization'] = "Bearer $dataToken"; } final String link = "${config.network.baseUrl}meetings?lang=${setting.userLocalDb.getUser().language}"; // print( // 'Parameters: count: $count, page: $page, fromDate: $fromDate, toDate: $toDate, location: $location, subject: $subject, meetingManager: $meetingManager, status: $status'); final response = await Dio().get(link, options: Options( headers: headers, ), queryParameters: { 'count': count, 'page': page, 'date_meeting_az': fromDate, 'date_meeting_ta': toDate, 'location': location, 'subject': subject, 'meeting_manager': meetingManager, 'status': status, }); // print('${response.data} response.data'); final MeetingsModel meetingsList = MeetingsModel.fromJson(response.data); return meetingsList; } // one meeting Future getOneMeeting({required final int id}) async { Map headers = { 'Accept': 'application/json', }; String dataToken = setting.userLocalDb.getUser().token!; if (dataToken != '') { headers['Authorization'] = "Bearer $dataToken"; } final String link = "${config.network.baseUrl}meeting/$id?lang=${setting.userLocalDb.getUser().language}"; final response = await Dio().get( link, options: Options( headers: headers, ), ); final OneMeetingModel oneMeet = OneMeetingModel.fromJson(response.data); return oneMeet; } // add meeting Future addMeetingApi( {int? locationId, int? subjectId, int? managerId, required String fromHour, required String toHour, required String dateMeeting, required List members}) async { try { Map headers = {"Accept": "application/json"}; String dataToken = setting.userLocalDb.getUser().token!; if (dataToken != '') { headers['Authorization'] = "Bearer $dataToken"; } FormData? formData; if (managerId == null) { formData = FormData.fromMap({ 'locations_id': locationId, 'subject_id': subjectId, 'az_hour': fromHour, 'ta_hour': toHour, 'members[]': members, 'date_meeting': dateMeeting, }); } else { formData = FormData.fromMap({ 'locations_id': locationId, 'subject_id': subjectId, 'manager_id': managerId, 'az_hour': fromHour, 'ta_hour': toHour, 'members[]': members, 'date_meeting': dateMeeting, }); } // print('${formData.fields} saggggggggg'); final res = await Dio().post("${config.network.baseUrl}admin/add-meeting", data: formData, options: Options(headers: headers)); if (res.statusCode == 200 || res.statusCode == 201) { return Result(isOk: true, message: res.data['message']); } } on DioException catch (e) { // print('${e.message}'); return Result( isOk: false, errors: e.response!.data['errors'], message: e.response!.data['message']); } return const Result(isOk: false); } // edit meeting Future editMeetingApi( {required int id, required int locationId, required int subjectId, required int managerId, required String fromHour, required String toHour, required String dateMeeting, required List members}) async { try { Map headers = {"Accept": "application/json"}; String dataToken = setting.userLocalDb.getUser().token!; if (dataToken != '') { headers['Authorization'] = "Bearer $dataToken"; } FormData? formData; formData = FormData.fromMap({ 'id': id, 'locations_id': locationId, 'subject_id': subjectId, 'manager_id': managerId, 'az_hour': fromHour, 'ta_hour': toHour, 'members[]': members, 'date_meeting': dateMeeting, }); // print('${formData.fields} things to send'); final res = await Dio().post( "${config.network.baseUrl}admin/edit-meeting", data: formData, options: Options(headers: headers)); if (res.statusCode == 200 || res.statusCode == 201) { return Result(isOk: true, message: res.data['message']); } } on DioException catch (e) { // print(e); return Result( isOk: false, errors: e.response!.data['errors'], message: e.response!.data['message']); } return const Result(isOk: false); } // cancel meeting Future cancelMeetingApi({ required int id, }) async { try { Map headers = {"Accept": "application/json"}; String dataToken = setting.userLocalDb.getUser().token!; if (dataToken != '') { headers['Authorization'] = "Bearer $dataToken"; } FormData? formData; formData = FormData.fromMap({ 'meeting_id': id, }); final res = await Dio().post( "${config.network.baseUrl}admin/cancel-meeting", data: formData, options: Options(headers: headers)); if (res.statusCode == 200 || res.statusCode == 201) { return Result(isOk: true, message: res.data['message']); } } on DioException catch (e) { return Result( isOk: false, errors: e.response!.data['errors'], message: e.response!.data['message']); } return const Result(isOk: false); } // delete meeting Future deleteMeetingApi({ required int id, }) async { try { Map headers = {"Accept": "application/json"}; String? dataToken = setting.userLocalDb.getUser().token; if (dataToken != null && dataToken.isNotEmpty) { headers['Authorization'] = "Bearer $dataToken"; } String url = "${config.network.baseUrl}admin/meetings/$id"; final res = await Dio().delete( url, options: Options(headers: headers), ); if (res.statusCode == 200 || res.statusCode == 201) { return Result(isOk: true, message: res.data['message']); } } on DioException catch (e) { if (e.response != null) { return Result( isOk: false, errors: e.response?.data['errors'], message: e.response?.data['message'], ); } } return const Result(isOk: false); } // accept meeting Future acceptMeetingApi({ required int id, }) async { try { Map headers = {"Accept": "application/json"}; String dataToken = setting.userLocalDb.getUser().token!; if (dataToken != '') { headers['Authorization'] = "Bearer $dataToken"; } FormData? formData; formData = FormData.fromMap({ 'meeting_id': id, }); final res = await Dio().post( "${config.network.baseUrl}admin/accept-meeting", data: formData, options: Options(headers: headers)); if (res.statusCode == 200 || res.statusCode == 201) { return Result(isOk: true, message: res.data['message']); } } on DioException catch (e) { return Result( isOk: false, errors: e.response!.data['errors'], message: e.response!.data['message']); } return const Result(isOk: false); } // add meeting minutes Future addMeetingMinuteApi({ required int id, required String description, required List meetingFiles, // List of PlatformFile }) async { try { Map headers = {"Accept": "application/json"}; String dataToken = setting.userLocalDb.getUser().token!; if (dataToken.isNotEmpty) { headers['Authorization'] = "Bearer $dataToken"; } // Create FormData FormData formData = FormData(); // Add id and description fields formData.fields.add(MapEntry('id', id.toString())); formData.fields.add(MapEntry('description', description)); // Check if meetingFiles is not empty and add files to FormData if (meetingFiles.isNotEmpty) { for (var file in meetingFiles) { if (file.path != null) { // Ensure that the file path is not null formData.files.add( MapEntry( 'meeting_files[]', await MultipartFile.fromFile(file.path!)), ); } } } // Send request final res = await Dio().post( "${config.network.baseUrl}admin/add-meeting-minutes", data: formData, options: Options(headers: headers), ); // Check response status if (res.statusCode == 200 || res.statusCode == 201) { return Result(isOk: true, message: res.data['message']); } } on DioException catch (e) { return Result( isOk: false, errors: e.response?.data['errors'], message: e.response?.data['message'], ); } return const Result(isOk: false); } // download meeting summary Future downloadSummary( {required int id, String? format = 'zip'}) async { try { final Map headers = {"Accept": "application/json"}; String dataToken = setting.userLocalDb.getUser().token!; if (dataToken != '') { headers['Authorization'] = "Bearer $dataToken"; } final Directory tempDir = await getApplicationDocumentsDirectory(); final String tempPath = tempDir.path; final String savePath = '$tempPath/sammary_$id.$format'; final res = await Dio().download( '${config.network.baseUrl}download-minutes/$id', savePath, options: Options(headers: headers), ); if (res.statusCode == 200 || res.statusCode == 201) { return Result(isOk: true, message: savePath); } else { return Result( isOk: false, message: 'Failed with status code: ${res.statusCode}'); } } on DioException catch (e) { return Result( isOk: false, errors: e.response?.data['errors'], message: e.response?.data['message'] ?? 'An error occurred during download.', ); } } // get String file of summary Future> getListStringFils({required int id}) async { Map headers = { 'Accept': 'application/json', }; String dataToken = setting.userLocalDb.getUser().token!; if (dataToken.isNotEmpty) { headers['Authorization'] = "Bearer $dataToken"; } // ساخت لینک API final String link = "${config.network.baseUrl}admin/all-meeting-minutes/$id"; // فراخوانی API final response = await Dio().get( link, options: Options( headers: headers, ), ); // print('${response.data} response.data'); // بررسی ساختار پاسخ و تبدیل داده‌ها if (response.data is List) { return List.from(response.data); } else { return []; } } // delete file of summary Future deleteFileSummary({ required int id, required String text, }) async { try { Map headers = {"Accept": "application/json"}; String dataToken = setting.userLocalDb.getUser().token!; if (dataToken.isNotEmpty) { headers['Authorization'] = "Bearer $dataToken"; } // Create FormData FormData formData = FormData(); // Send request final link = "${config.network.baseUrl}admin/delete-meeting-minutes/$id/$text"; // print('${link}'); final res = await Dio().get( link, data: formData, options: Options(headers: headers), ); // Check response status if (res.statusCode == 200 || res.statusCode == 201) { return Result(isOk: true, message: res.data['message']); } } on DioException catch (e) { // print(e); return Result( isOk: false, errors: e.response?.data['errors'], message: e.response?.data['message'], ); } return const Result(isOk: false); } }