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/private_meeting/one_private_meeting_model.dart'; import 'package:qadirneyriz/models/private_meeting/private_meetings_model.dart'; import 'package:qadirneyriz/setting/setting.dart'; import 'package:qadirneyriz/utils/result/result.dart'; class PrivateMeetingsApi { // get all Future getPrivateMeetings({ 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}private_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, }); final PrivateMeetingsModel privateMeetingsList = PrivateMeetingsModel.fromJson(response.data); return privateMeetingsList; } // add private meeting Future addPrivateMeetingApi({ int? locationId, int? subjectId, int? managerId, required String fromHour, required String toHour, required String dateMeeting, required String visitorName, required String visitorMobile, required String visitorRole, required String visitorCompany, }) 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, 'manager_id': managerId, 'az_hour': fromHour, 'ta_hour': toHour, 'date_meeting': dateMeeting, 'visit_name': visitorName, 'visit_mobile': visitorMobile, 'visit_role': visitorRole, 'visit_company': visitorCompany }); } else { formData = FormData.fromMap({ 'locations_id': locationId, 'subject_id': subjectId, 'az_hour': fromHour, 'ta_hour': toHour, 'date_meeting': dateMeeting, 'visit_name': visitorName, 'visit_mobile': visitorMobile, 'visit_role': visitorRole, 'visit_company': visitorCompany }); } final res = await Dio().post( "${config.network.baseUrl}admin/add-private-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); } // cancel private meeting Future cancelPrivateMeetingApi({ 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}cancel-private-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 private meeting Future deletePrivateMeetingApi({ required int id, }) async { try { Map headers = {"Accept": "application/json"}; String dataToken = setting.userLocalDb.getUser().token!; if (dataToken != '') { headers['Authorization'] = "Bearer $dataToken"; } final res = await Dio().post( "${config.network.baseUrl}admin/delete-private-meeting/${id}", 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); } // accept private meeting Future acceptPrivateMeetingApi({ 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}accept-private-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); } // get one private meeting Future getOnePrivateMeeting( {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}private-meeting/$id?lang=${setting.userLocalDb.getUser().language}"; final response = await Dio().get( link, options: Options( headers: headers, ), ); final OnePrivateMeetingModel onePrivateMeet = OnePrivateMeetingModel.fromJson(response.data); return onePrivateMeet; } // edit private meeting Future editPrivateMeetingApi({ required int id, required int locationId, required int subjectId, required int managerId, required String fromHour, required String toHour, required String dateMeeting, required String visitorName, required String visitorMobile, required String visitorRole, required String visitorCompany, }) 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, 'date_meeting': dateMeeting, 'visit_name': visitorName, 'visit_mobile': visitorMobile, 'visit_role': visitorRole, 'visit_company': visitorCompany }); final res = await Dio().post( "${config.network.baseUrl}admin/edit-private-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 private 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-private-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}private-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-private-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-private-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); } }