You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

407 regels
12 KiB

  1. import 'dart:io';
  2. import 'package:path_provider/path_provider.dart';
  3. import 'package:dio/dio.dart';
  4. import 'package:file_picker/file_picker.dart';
  5. import 'package:qadirneyriz/config/config.dart';
  6. import 'package:qadirneyriz/models/meetings/meetings_model.dart';
  7. import 'package:qadirneyriz/models/meetings/one_meeting_model.dart';
  8. import 'package:qadirneyriz/setting/setting.dart';
  9. import 'package:qadirneyriz/utils/result/result.dart';
  10. class MeetingsApi {
  11. Future<MeetingsModel> getMeetings({
  12. required int count,
  13. required int page,
  14. String? fromDate,
  15. String? toDate,
  16. int? location,
  17. int? subject,
  18. int? meetingManager,
  19. int? status,
  20. }) async {
  21. Map<String, String> headers = {
  22. 'Accept': 'application/json',
  23. };
  24. String dataToken = setting.userLocalDb.getUser().token!;
  25. if (dataToken != '') {
  26. headers['Authorization'] = "Bearer $dataToken";
  27. }
  28. final String link =
  29. "${config.network.baseUrl}meetings?lang=${setting.userLocalDb.getUser().language}";
  30. // print(
  31. // 'Parameters: count: $count, page: $page, fromDate: $fromDate, toDate: $toDate, location: $location, subject: $subject, meetingManager: $meetingManager, status: $status');
  32. final response = await Dio().get(link,
  33. options: Options(
  34. headers: headers,
  35. ),
  36. queryParameters: {
  37. 'count': count,
  38. 'page': page,
  39. 'date_meeting_az': fromDate,
  40. 'date_meeting_ta': toDate,
  41. 'location': location,
  42. 'subject': subject,
  43. 'meeting_manager': meetingManager,
  44. 'status': status,
  45. });
  46. // print('${response.data} response.data');
  47. final MeetingsModel meetingsList = MeetingsModel.fromJson(response.data);
  48. return meetingsList;
  49. }
  50. // one meeting
  51. Future<OneMeetingModel> getOneMeeting({required final int id}) async {
  52. Map<String, String> headers = {
  53. 'Accept': 'application/json',
  54. };
  55. String dataToken = setting.userLocalDb.getUser().token!;
  56. if (dataToken != '') {
  57. headers['Authorization'] = "Bearer $dataToken";
  58. }
  59. final String link =
  60. "${config.network.baseUrl}meeting/$id?lang=${setting.userLocalDb.getUser().language}";
  61. final response = await Dio().get(
  62. link,
  63. options: Options(
  64. headers: headers,
  65. ),
  66. );
  67. final OneMeetingModel oneMeet = OneMeetingModel.fromJson(response.data);
  68. return oneMeet;
  69. }
  70. // add meeting
  71. Future<Result> addMeetingApi(
  72. {int? locationId,
  73. int? subjectId,
  74. int? managerId,
  75. required String fromHour,
  76. required String toHour,
  77. required String dateMeeting,
  78. required List<int> members}) async {
  79. try {
  80. Map<String, String> headers = {"Accept": "application/json"};
  81. String dataToken = setting.userLocalDb.getUser().token!;
  82. if (dataToken != '') {
  83. headers['Authorization'] = "Bearer $dataToken";
  84. }
  85. FormData? formData;
  86. if (managerId != null) {
  87. formData = FormData.fromMap({
  88. 'locations_id': locationId,
  89. 'subject_id': subjectId,
  90. 'az_hour': fromHour,
  91. 'ta_hour': toHour,
  92. 'members[]': members,
  93. 'date_meeting': dateMeeting,
  94. });
  95. } else {
  96. formData = FormData.fromMap({
  97. 'locations_id': locationId,
  98. 'subject_id': subjectId,
  99. 'manager_id': managerId,
  100. 'az_hour': fromHour,
  101. 'ta_hour': toHour,
  102. 'members[]': members,
  103. 'date_meeting': dateMeeting,
  104. });
  105. }
  106. print('${formData.fields} saggggggggg');
  107. final res = await Dio().post("${config.network.baseUrl}admin/add-meeting",
  108. data: formData, options: Options(headers: headers));
  109. if (res.statusCode == 200 || res.statusCode == 201) {
  110. return Result(isOk: true, message: res.data['message']);
  111. }
  112. } on DioException catch (e) {
  113. print('${e.message}');
  114. return Result(
  115. isOk: false,
  116. errors: e.response!.data['errors'],
  117. message: e.response!.data['message']);
  118. }
  119. return const Result(isOk: false);
  120. }
  121. // edit meeting
  122. Future<Result> editMeetingApi(
  123. {required int id,
  124. required int locationId,
  125. required int subjectId,
  126. required int managerId,
  127. required String fromHour,
  128. required String toHour,
  129. required String dateMeeting,
  130. required List<int> members}) async {
  131. try {
  132. Map<String, String> headers = {"Accept": "application/json"};
  133. String dataToken = setting.userLocalDb.getUser().token!;
  134. if (dataToken != '') {
  135. headers['Authorization'] = "Bearer $dataToken";
  136. }
  137. FormData? formData;
  138. formData = FormData.fromMap({
  139. 'id': id,
  140. 'locations_id': locationId,
  141. 'subject_id': subjectId,
  142. 'manager_id': managerId,
  143. 'az_hour': fromHour,
  144. 'ta_hour': toHour,
  145. 'members[]': members,
  146. 'date_meeting': dateMeeting,
  147. });
  148. // print('${formData.fields} things to send');
  149. final res = await Dio().post(
  150. "${config.network.baseUrl}admin/edit-meeting",
  151. data: formData,
  152. options: Options(headers: headers));
  153. if (res.statusCode == 200 || res.statusCode == 201) {
  154. return Result(isOk: true, message: res.data['message']);
  155. }
  156. } on DioException catch (e) {
  157. // print(e);
  158. return Result(
  159. isOk: false,
  160. errors: e.response!.data['errors'],
  161. message: e.response!.data['message']);
  162. }
  163. return const Result(isOk: false);
  164. }
  165. // cancel meeting
  166. Future<Result> cancelMeetingApi({
  167. required int id,
  168. }) async {
  169. try {
  170. Map<String, String> headers = {"Accept": "application/json"};
  171. String dataToken = setting.userLocalDb.getUser().token!;
  172. if (dataToken != '') {
  173. headers['Authorization'] = "Bearer $dataToken";
  174. }
  175. FormData? formData;
  176. formData = FormData.fromMap({
  177. 'meeting_id': id,
  178. });
  179. final res = await Dio().post(
  180. "${config.network.baseUrl}admin/cancel-meeting",
  181. data: formData,
  182. options: Options(headers: headers));
  183. if (res.statusCode == 200 || res.statusCode == 201) {
  184. return Result(isOk: true, message: res.data['message']);
  185. }
  186. } on DioException catch (e) {
  187. return Result(
  188. isOk: false,
  189. errors: e.response!.data['errors'],
  190. message: e.response!.data['message']);
  191. }
  192. return const Result(isOk: false);
  193. }
  194. // accept meeting
  195. Future<Result> acceptMeetingApi({
  196. required int id,
  197. }) async {
  198. try {
  199. Map<String, String> headers = {"Accept": "application/json"};
  200. String dataToken = setting.userLocalDb.getUser().token!;
  201. if (dataToken != '') {
  202. headers['Authorization'] = "Bearer $dataToken";
  203. }
  204. FormData? formData;
  205. formData = FormData.fromMap({
  206. 'meeting_id': id,
  207. });
  208. final res = await Dio().post(
  209. "${config.network.baseUrl}admin/accept-meeting",
  210. data: formData,
  211. options: Options(headers: headers));
  212. if (res.statusCode == 200 || res.statusCode == 201) {
  213. return Result(isOk: true, message: res.data['message']);
  214. }
  215. } on DioException catch (e) {
  216. return Result(
  217. isOk: false,
  218. errors: e.response!.data['errors'],
  219. message: e.response!.data['message']);
  220. }
  221. return const Result(isOk: false);
  222. }
  223. // add meeting minutes
  224. Future<Result> addMeetingMinuteApi({
  225. required int id,
  226. required String description,
  227. required List<PlatformFile> meetingFiles, // List of PlatformFile
  228. }) async {
  229. try {
  230. Map<String, String> headers = {"Accept": "application/json"};
  231. String dataToken = setting.userLocalDb.getUser().token!;
  232. if (dataToken.isNotEmpty) {
  233. headers['Authorization'] = "Bearer $dataToken";
  234. }
  235. // Create FormData
  236. FormData formData = FormData();
  237. // Add id and description fields
  238. formData.fields.add(MapEntry('id', id.toString()));
  239. formData.fields.add(MapEntry('description', description));
  240. // Check if meetingFiles is not empty and add files to FormData
  241. if (meetingFiles.isNotEmpty) {
  242. for (var file in meetingFiles) {
  243. if (file.path != null) {
  244. // Ensure that the file path is not null
  245. formData.files.add(
  246. MapEntry(
  247. 'meeting_files[]', await MultipartFile.fromFile(file.path!)),
  248. );
  249. }
  250. }
  251. }
  252. // Send request
  253. final res = await Dio().post(
  254. "${config.network.baseUrl}admin/add-meeting-minutes",
  255. data: formData,
  256. options: Options(headers: headers),
  257. );
  258. // Check response status
  259. if (res.statusCode == 200 || res.statusCode == 201) {
  260. return Result(isOk: true, message: res.data['message']);
  261. }
  262. } on DioException catch (e) {
  263. return Result(
  264. isOk: false,
  265. errors: e.response?.data['errors'],
  266. message: e.response?.data['message'],
  267. );
  268. }
  269. return const Result(isOk: false);
  270. }
  271. // download meeting summary
  272. Future<Result?> downloadSummary(
  273. {required int id, String? format = 'zip'}) async {
  274. try {
  275. final Map<String, String> headers = {"Accept": "application/json"};
  276. String dataToken = setting.userLocalDb.getUser().token!;
  277. if (dataToken != '') {
  278. headers['Authorization'] = "Bearer $dataToken";
  279. }
  280. final Directory tempDir = await getApplicationDocumentsDirectory();
  281. final String tempPath = tempDir.path;
  282. final String savePath = '$tempPath/sammary_$id.$format';
  283. final res = await Dio().download(
  284. '${config.network.baseUrl}download-minutes/$id',
  285. savePath,
  286. options: Options(headers: headers),
  287. );
  288. if (res.statusCode == 200 || res.statusCode == 201) {
  289. return Result(isOk: true, message: savePath);
  290. } else {
  291. return Result(
  292. isOk: false, message: 'Failed with status code: ${res.statusCode}');
  293. }
  294. } on DioException catch (e) {
  295. return Result(
  296. isOk: false,
  297. errors: e.response?.data['errors'],
  298. message:
  299. e.response?.data['message'] ?? 'An error occurred during download.',
  300. );
  301. }
  302. }
  303. // get String file of summary
  304. Future<List<String>> getListStringFils({required int id}) async {
  305. Map<String, String> headers = {
  306. 'Accept': 'application/json',
  307. };
  308. String dataToken = setting.userLocalDb.getUser().token!;
  309. if (dataToken.isNotEmpty) {
  310. headers['Authorization'] = "Bearer $dataToken";
  311. }
  312. // ساخت لینک API
  313. final String link =
  314. "${config.network.baseUrl}admin/all-meeting-minutes/$id";
  315. // فراخوانی API
  316. final response = await Dio().get(
  317. link,
  318. options: Options(
  319. headers: headers,
  320. ),
  321. );
  322. print('${response.data} response.data');
  323. // بررسی ساختار پاسخ و تبدیل داده‌ها
  324. if (response.data is List) {
  325. return List<String>.from(response.data);
  326. } else {
  327. return [];
  328. }
  329. }
  330. // delete file of summary
  331. Future<Result> deleteFileSummary({
  332. required int id,
  333. required String text,
  334. }) async {
  335. try {
  336. Map<String, String> headers = {"Accept": "application/json"};
  337. String dataToken = setting.userLocalDb.getUser().token!;
  338. if (dataToken.isNotEmpty) {
  339. headers['Authorization'] = "Bearer $dataToken";
  340. }
  341. // Create FormData
  342. FormData formData = FormData();
  343. // Send request
  344. final link =
  345. "${config.network.baseUrl}admin/delete-meeting-minutes/$id/$text";
  346. print('${link}');
  347. final res = await Dio().get(
  348. link,
  349. data: formData,
  350. options: Options(headers: headers),
  351. );
  352. // Check response status
  353. if (res.statusCode == 200 || res.statusCode == 201) {
  354. return Result(isOk: true, message: res.data['message']);
  355. }
  356. } on DioException catch (e) {
  357. print(e);
  358. return Result(
  359. isOk: false,
  360. errors: e.response?.data['errors'],
  361. message: e.response?.data['message'],
  362. );
  363. }
  364. return const Result(isOk: false);
  365. }
  366. }