Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

442 Zeilen
13 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. // delete meeting
  195. Future<Result> deleteMeetingApi({
  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 != null && dataToken.isNotEmpty) {
  202. headers['Authorization'] = "Bearer $dataToken";
  203. }
  204. String url = "${config.network.baseUrl}admin/meetings/$id";
  205. final res = await Dio().delete(
  206. url,
  207. options: Options(headers: headers),
  208. );
  209. if (res.statusCode == 200 || res.statusCode == 201) {
  210. return Result(isOk: true, message: res.data['message']);
  211. }
  212. } on DioException catch (e) {
  213. if (e.response != null) {
  214. return Result(
  215. isOk: false,
  216. errors: e.response?.data['errors'],
  217. message: e.response?.data['message'],
  218. );
  219. }
  220. }
  221. return const Result(isOk: false);
  222. }
  223. // accept meeting
  224. Future<Result> acceptMeetingApi({
  225. required int id,
  226. }) async {
  227. try {
  228. Map<String, String> headers = {"Accept": "application/json"};
  229. String dataToken = setting.userLocalDb.getUser().token!;
  230. if (dataToken != '') {
  231. headers['Authorization'] = "Bearer $dataToken";
  232. }
  233. FormData? formData;
  234. formData = FormData.fromMap({
  235. 'meeting_id': id,
  236. });
  237. final res = await Dio().post(
  238. "${config.network.baseUrl}admin/accept-meeting",
  239. data: formData,
  240. options: Options(headers: headers));
  241. if (res.statusCode == 200 || res.statusCode == 201) {
  242. return Result(isOk: true, message: res.data['message']);
  243. }
  244. } on DioException catch (e) {
  245. return Result(
  246. isOk: false,
  247. errors: e.response!.data['errors'],
  248. message: e.response!.data['message']);
  249. }
  250. return const Result(isOk: false);
  251. }
  252. // add meeting minutes
  253. Future<Result> addMeetingMinuteApi({
  254. required int id,
  255. required String description,
  256. required List<PlatformFile> meetingFiles, // List of PlatformFile
  257. }) async {
  258. try {
  259. Map<String, String> headers = {"Accept": "application/json"};
  260. String dataToken = setting.userLocalDb.getUser().token!;
  261. if (dataToken.isNotEmpty) {
  262. headers['Authorization'] = "Bearer $dataToken";
  263. }
  264. // Create FormData
  265. FormData formData = FormData();
  266. // Add id and description fields
  267. formData.fields.add(MapEntry('id', id.toString()));
  268. formData.fields.add(MapEntry('description', description));
  269. // Check if meetingFiles is not empty and add files to FormData
  270. if (meetingFiles.isNotEmpty) {
  271. for (var file in meetingFiles) {
  272. if (file.path != null) {
  273. // Ensure that the file path is not null
  274. formData.files.add(
  275. MapEntry(
  276. 'meeting_files[]', await MultipartFile.fromFile(file.path!)),
  277. );
  278. }
  279. }
  280. }
  281. // Send request
  282. final res = await Dio().post(
  283. "${config.network.baseUrl}admin/add-meeting-minutes",
  284. data: formData,
  285. options: Options(headers: headers),
  286. );
  287. // Check response status
  288. if (res.statusCode == 200 || res.statusCode == 201) {
  289. return Result(isOk: true, message: res.data['message']);
  290. }
  291. } on DioException catch (e) {
  292. return Result(
  293. isOk: false,
  294. errors: e.response?.data['errors'],
  295. message: e.response?.data['message'],
  296. );
  297. }
  298. return const Result(isOk: false);
  299. }
  300. // download meeting summary
  301. Future<Result?> downloadSummary(
  302. {required int id, String? format = 'zip'}) async {
  303. try {
  304. final Map<String, String> headers = {"Accept": "application/json"};
  305. String dataToken = setting.userLocalDb.getUser().token!;
  306. if (dataToken != '') {
  307. headers['Authorization'] = "Bearer $dataToken";
  308. }
  309. final Directory tempDir = await getApplicationDocumentsDirectory();
  310. final String tempPath = tempDir.path;
  311. final String savePath = '$tempPath/sammary_$id.$format';
  312. final res = await Dio().download(
  313. '${config.network.baseUrl}download-minutes/$id',
  314. savePath,
  315. options: Options(headers: headers),
  316. );
  317. if (res.statusCode == 200 || res.statusCode == 201) {
  318. return Result(isOk: true, message: savePath);
  319. } else {
  320. return Result(
  321. isOk: false, message: 'Failed with status code: ${res.statusCode}');
  322. }
  323. } on DioException catch (e) {
  324. return Result(
  325. isOk: false,
  326. errors: e.response?.data['errors'],
  327. message:
  328. e.response?.data['message'] ?? 'An error occurred during download.',
  329. );
  330. }
  331. }
  332. // get String file of summary
  333. Future<List<String>> getListStringFils({required int id}) async {
  334. Map<String, String> headers = {
  335. 'Accept': 'application/json',
  336. };
  337. String dataToken = setting.userLocalDb.getUser().token!;
  338. if (dataToken.isNotEmpty) {
  339. headers['Authorization'] = "Bearer $dataToken";
  340. }
  341. // ساخت لینک API
  342. final String link =
  343. "${config.network.baseUrl}admin/all-meeting-minutes/$id";
  344. // فراخوانی API
  345. final response = await Dio().get(
  346. link,
  347. options: Options(
  348. headers: headers,
  349. ),
  350. );
  351. // print('${response.data} response.data');
  352. // بررسی ساختار پاسخ و تبدیل داده‌ها
  353. if (response.data is List) {
  354. return List<String>.from(response.data);
  355. } else {
  356. return [];
  357. }
  358. }
  359. // delete file of summary
  360. Future<Result> deleteFileSummary({
  361. required int id,
  362. required String text,
  363. }) async {
  364. try {
  365. Map<String, String> headers = {"Accept": "application/json"};
  366. String dataToken = setting.userLocalDb.getUser().token!;
  367. if (dataToken.isNotEmpty) {
  368. headers['Authorization'] = "Bearer $dataToken";
  369. }
  370. // Create FormData
  371. FormData formData = FormData();
  372. // Send request
  373. final link =
  374. "${config.network.baseUrl}admin/delete-meeting-minutes/$id/$text";
  375. // print('${link}');
  376. final res = await Dio().get(
  377. link,
  378. data: formData,
  379. options: Options(headers: headers),
  380. );
  381. // Check response status
  382. if (res.statusCode == 200 || res.statusCode == 201) {
  383. return Result(isOk: true, message: res.data['message']);
  384. }
  385. } on DioException catch (e) {
  386. // print(e);
  387. return Result(
  388. isOk: false,
  389. errors: e.response?.data['errors'],
  390. message: e.response?.data['message'],
  391. );
  392. }
  393. return const Result(isOk: false);
  394. }
  395. }