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.

411 lines
14KB

  1. import 'package:dio/dio.dart';
  2. import 'package:dio_http_cache/dio_http_cache.dart';
  3. import 'package:farm_tpf/custom_model/ActionType.dart';
  4. import 'package:farm_tpf/custom_model/CropPlot.dart';
  5. import 'package:farm_tpf/custom_model/Device.dart';
  6. import 'package:farm_tpf/custom_model/EnvironmentParameter.dart';
  7. import 'package:farm_tpf/custom_model/Harvest.dart';
  8. import 'package:farm_tpf/custom_model/LocationUnit.dart';
  9. import 'package:farm_tpf/custom_model/NotificationObjectDTO.dart';
  10. import 'package:farm_tpf/custom_model/Supply.dart';
  11. import 'package:farm_tpf/custom_model/TbCropDTO.dart';
  12. import 'package:farm_tpf/custom_model/UpdateNoti.dart';
  13. import 'package:farm_tpf/custom_model/WaterType.dart';
  14. import 'package:farm_tpf/custom_model/action_form/ActionUIForm.dart';
  15. import 'package:farm_tpf/custom_model/action_form/CommonData.dart';
  16. import 'package:farm_tpf/custom_model/action_form/RequestActivity.dart';
  17. import 'package:farm_tpf/custom_model/user.dart';
  18. import 'package:farm_tpf/custom_model/user_request.dart';
  19. import 'package:farm_tpf/data/api/dio_provider.dart';
  20. import 'package:farm_tpf/data/api/rest_client.dart';
  21. import 'package:farm_tpf/models/PagedResult.dart';
  22. import 'package:farm_tpf/presentation/screens/codes/models/activity_request.dart';
  23. import 'package:farm_tpf/presentation/screens/codes/models/activity_type.dart';
  24. import 'package:farm_tpf/presentation/screens/codes/models/stamp.dart';
  25. import 'package:farm_tpf/presentation/screens/codes/models/stamp_request.dart';
  26. import 'package:farm_tpf/presentation/screens/codes/models/stamp_timeline.dart';
  27. import 'package:farm_tpf/utils/const_common.dart';
  28. import 'package:flutter/material.dart';
  29. import '../../presentation/screens/codes/models/stamp_type.dart';
  30. import '../../presentation/screens/login/models/request_user.dart';
  31. import '../../presentation/screens/login/models/response_user.dart';
  32. import '../api/app_exception.dart';
  33. class Repository {
  34. final dio = DioProvider();
  35. Future<void> login(
  36. Function(ResponseUser) onSuccess,
  37. Function(String) onError, {
  38. required RequestUser requestUser,
  39. }) async {
  40. try {
  41. var url = ConstCommon.baseUrl + '/api/authenticate';
  42. await dio.post(
  43. url,
  44. data: {
  45. 'username': requestUser.username ?? '',
  46. 'password': requestUser.password ?? '',
  47. },
  48. ).then(
  49. (value) {
  50. var res = ResponseUser.fromJson(value.data);
  51. onSuccess(res);
  52. },
  53. ).catchError((error) {
  54. var dioError = error as DioError;
  55. var message = dioError.response?.data['Error'];
  56. onError(message);
  57. });
  58. } catch (e) {
  59. onError('Đã có lỗi xảy ra');
  60. }
  61. }
  62. Future<List<ActionType>> getActionTypes() {
  63. final client = RestClient(dio);
  64. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  65. return client.getActionTypes(options: op);
  66. }
  67. Future<List<Harvest>> getHarvests() {
  68. final client = RestClient(dio);
  69. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  70. return client.getHarvests(options: op);
  71. }
  72. Future<List<WaterType>> getWaterTypes() {
  73. final client = RestClient(dio);
  74. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  75. return client.getWaterTypes(options: op);
  76. }
  77. Future<CropPlot> getPlotDetail(int cropId, {int page = 0, int size = 20}) {
  78. final client = RestClient(dio);
  79. return client.getCropDetail(cropId, page: page, size: size);
  80. }
  81. Future<CropPlot> getPlotDetailByCode(String cropCode) {
  82. final client = RestClient(dio);
  83. return client.getCropDetailByCode(cropCode);
  84. }
  85. Future<List<TbCropDTO>> getPlots({int page = 0, int size = 20, String searchString = ''}) {
  86. final client = RestClient(dio);
  87. return client.getPlots(page: page, size: size, query: searchString);
  88. }
  89. Future<void> updatePlot(TbCropDTO tbCropDTO) {
  90. final client = RestClient(dio);
  91. return client.updateCrop(tbCropDTO);
  92. }
  93. Future<User> signInWithCredentials(String username, String password) {
  94. final client = RestClient(dio);
  95. return client.login(UserRequest(username: username, password: password));
  96. }
  97. Future<PagedResult<T>> getInfinityList<T>(String url, {int page = 0, int size = 20}) async {
  98. var initUrl = "/api/activities/latest-env-by-activity-type/1/2";
  99. var url = ConstCommon.baseUrl + initUrl + "?page=$page&paged=true&size=$size";
  100. var response = await dio.get(url);
  101. final value = PagedResult<T>.fromJson(response.data, getInstanceClass());
  102. return value;
  103. }
  104. Future<List<Supply>> getSupplies(String type, {String query = ""}) async {
  105. final client = RestClient(dio);
  106. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  107. return client.getSupplies(type, query: query, options: op);
  108. }
  109. Future<List<Device>> getDeviceForActivity() async {
  110. final client = RestClient(dio);
  111. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  112. return client.getDeviceForActivity(options: op);
  113. }
  114. Future<void> updateAllNotification(String status) {
  115. final client = RestClient(dio);
  116. return client.updateAllNotification(status);
  117. }
  118. Future<void> updateNoti(UpdateNoti updateNoti) {
  119. final client = RestClient(dio);
  120. return client.updateNoti(updateNoti);
  121. }
  122. Future<NotificationObjectDTO> getNotifications({int page = 0, int size = 20}) async {
  123. var url = ConstCommon.baseUrl + "/api/notifications-current-user?page=$page&size=$size&sort=sendDate,DESC";
  124. var response = await dio.get(url);
  125. final value = NotificationObjectDTO.fromJson(response.data);
  126. return value;
  127. }
  128. Future<List<LocationUnit>> getLocationUnits(
  129. {required LocationType locationType, int filterId = -1, int page = 0, int size = 500, String query = ''}) {
  130. final client = RestClient(dio);
  131. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  132. var response;
  133. switch (locationType) {
  134. case LocationType.province:
  135. response = client.getProvinces(filterId, options: op, page: page, size: size, query: query);
  136. break;
  137. case LocationType.district:
  138. response = client.getDistricts(filterId, options: op, page: page, size: size, query: query);
  139. break;
  140. case LocationType.ward:
  141. response = client.getWards(filterId, options: op, page: page, size: size, query: query);
  142. break;
  143. default:
  144. response = client.getCountries(query: query);
  145. }
  146. return response;
  147. }
  148. Object getInstanceClass() {
  149. var instanceClass;
  150. if (1 == 1) {
  151. instanceClass = new TbCropDTO();
  152. }
  153. return instanceClass;
  154. }
  155. //Action
  156. Future<void> createAction(Function(dynamic) onSuccess, Function(dynamic) onError,
  157. {String? apiAddAction, String? paramActivity, String? activityAction, List<String>? filePaths}) async {
  158. var formData = FormData();
  159. filePaths?.forEach((f) {
  160. formData.files.add(MapEntry("images", MultipartFile.fromFileSync(f)));
  161. });
  162. formData.fields.add(MapEntry(paramActivity ?? '', activityAction ?? ''));
  163. try {
  164. await dio.post("${ConstCommon.baseUrl}/$apiAddAction", data: formData).then((value) {
  165. onSuccess(value.data);
  166. });
  167. } on DioError catch (e) {
  168. onError(e);
  169. }
  170. }
  171. Future<void> updateAction(Function(dynamic) onSuccess, Function(dynamic) onError,
  172. {String? apiUpdateAction, String? paramActivity, String? activityAction, List<String>? filePaths}) async {
  173. var formData = FormData();
  174. if (filePaths != null) {
  175. filePaths.forEach((f) {
  176. formData.files.add(MapEntry("images", MultipartFile.fromFileSync(f)));
  177. });
  178. }
  179. formData.fields.add(MapEntry(paramActivity ?? '', activityAction ?? ''));
  180. try {
  181. await dio.post("${ConstCommon.baseUrl}/$apiUpdateAction", data: formData).then((value) {
  182. onSuccess(value.data);
  183. });
  184. } on DioError catch (e) {
  185. onError(e);
  186. }
  187. }
  188. //Device
  189. Future<List<Device>> getDevices(String query) {
  190. final client = RestClient(dio);
  191. return client.getDevices(query);
  192. }
  193. //Environment Parameter
  194. Future<List<EnvironmentParameter>> getEnvironmentParameters({required int cropId, int page = 0, int size = 20}) {
  195. final client = RestClient(dio);
  196. return client.getEnvironmentParameters(cropId, page: page, size: size);
  197. }
  198. //NEW IMPLEMENT
  199. Future<void> allActionTypes(int cropTypeId, Function(List<ActionType>) onSuccess, Function(dynamic) onError) async {
  200. try {
  201. var url = '${ConstCommon.baseUrl}/api/listActivityTypesCulture/$cropTypeId';
  202. final Response<List<dynamic>> _result = await dio.get(url);
  203. var value = _result.data?.map((dynamic i) => ActionType.fromJson(i as Map<String, dynamic>)).toList();
  204. onSuccess(value ?? []);
  205. } on DioError catch (e) {
  206. onError(e);
  207. }
  208. }
  209. Future<ActionUIForm> getActionUIForm({required int idAction}) {
  210. final client = RestClient(dio);
  211. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  212. return client.getActionUIForm(idAction, op);
  213. }
  214. Future<List<CommonData>> getCommonData({required String tableSupply, required String condition}) async {
  215. var url = '${ConstCommon.baseUrl}/api/get-data-from-table-common?tableName=$tableSupply&condition=$condition';
  216. final Response<List<dynamic>> _result = await dio.get(url);
  217. var value = _result.data?.map((dynamic i) => CommonData.fromJson(i as Map<String, dynamic>)).toList();
  218. return value ?? [];
  219. }
  220. Future<void> createActionCommon(Function(dynamic) onSuccess, Function(dynamic) onError,
  221. {required String activityType, required String activityData, List<String>? filePaths}) async {
  222. var formData = FormData();
  223. if (filePaths != null) {
  224. filePaths.forEach((f) {
  225. formData.files.add(MapEntry('images', MultipartFile.fromFileSync(f)));
  226. });
  227. }
  228. formData.fields.add(MapEntry('tbCommonActivityDTO', activityData));
  229. try {
  230. await dio.post("${ConstCommon.baseUrl}/api/create-common-activity/$activityType", data: formData).then((value) {
  231. onSuccess(value.data);
  232. });
  233. } on DioError catch (e) {
  234. onError(e);
  235. }
  236. }
  237. Future<void> updateActionCommon(Function(dynamic) onSuccess, Function(dynamic) onError,
  238. {required String activityType, required String activityData, List<String>? filePaths}) async {
  239. var formData = FormData();
  240. if (filePaths != null) {
  241. filePaths.forEach((f) {
  242. formData.files.add(MapEntry('images', MultipartFile.fromFileSync(f)));
  243. });
  244. }
  245. formData.fields.add(MapEntry('tbCommonActivityDTO', activityData));
  246. try {
  247. await dio.post("${ConstCommon.baseUrl}/api/update-common-activity/$activityType", data: formData).then((value) {
  248. onSuccess(value.data);
  249. });
  250. } on DioError catch (e) {
  251. onError(e);
  252. }
  253. }
  254. Future<RequestActivity> detailCommonAction({required int activityId, required String activityType}) async {
  255. final client = RestClient(dio);
  256. return client.getDetailActivityCommon(activityType, activityId);
  257. }
  258. // Stamp
  259. Future<List<Stamp>> stamps({int page = 0, int size = 20}) async {
  260. try {
  261. var url = '${ConstCommon.baseUrl}/api/tb-codes/list?page=$page&size=$size&sort=id,desc';
  262. var res = await dio.post(url, data: {});
  263. return (res.data as List).map((e) => Stamp.fromJson(e)).toList();
  264. } catch (e) {
  265. rethrow;
  266. }
  267. }
  268. Future<List<StampType>> stampTypes() async {
  269. try {
  270. var url = '${ConstCommon.baseUrl}/api/tb-example-stamp/dropdown-list';
  271. var res = await dio.get(
  272. url,
  273. );
  274. return (res.data as List).map((e) => StampType.fromJson(e)).toList();
  275. } catch (e) {
  276. rethrow;
  277. }
  278. }
  279. Future<void> createStamp(
  280. Function(dynamic) onSuccess,
  281. Function(String) onError, {
  282. required RequestStamp item,
  283. }) async {
  284. try {
  285. var url = '${ConstCommon.baseUrl}/api/tb-codes';
  286. await dio.post(url, data: item).then(
  287. (value) {
  288. onSuccess(value);
  289. },
  290. ).catchError((e) {
  291. onError(AppException.handleError(e));
  292. });
  293. } catch (e) {
  294. onError(AppException.handleError(e));
  295. }
  296. }
  297. Future<List<ActivityType>> activityTypes() async {
  298. try {
  299. var url = '${ConstCommon.baseUrl}/api/tb-activity-types-dropdown-list-after-harvest';
  300. var res = await dio.get(
  301. url,
  302. );
  303. return (res.data as List).map((e) => ActivityType.fromJson(e)).toList();
  304. } catch (e) {
  305. rethrow;
  306. }
  307. }
  308. Future<void> updateActivity(
  309. Function(dynamic) onSuccess,
  310. Function(String) onError, {
  311. required ActivityRequest item,
  312. }) async {
  313. try {
  314. var url = '${ConstCommon.baseUrl}/api/tb-codes/create/activity';
  315. await dio.post(url, data: item).then(
  316. (value) {
  317. onSuccess(value);
  318. },
  319. ).catchError((e) {
  320. onError(AppException.handleError(e));
  321. });
  322. } catch (e) {
  323. onError(AppException.handleError(e));
  324. }
  325. }
  326. Future<Stamp> getStampDetail({required int id}) async {
  327. try {
  328. var url = '${ConstCommon.baseUrl}/api/tb-codes/$id';
  329. var res = await dio.get(url);
  330. return Stamp.fromJson(res.data);
  331. } catch (e) {
  332. rethrow;
  333. }
  334. }
  335. Future<StampTimeline> getStampTimeline({required int stampId}) async {
  336. try {
  337. var url = '${ConstCommon.baseUrl}/api/tb-codes-timeline/$stampId';
  338. var res = await dio.get(url);
  339. return StampTimeline.fromJson(res.data);
  340. } catch (e) {
  341. rethrow;
  342. }
  343. }
  344. Future<void> updateStampStatus(
  345. Function(dynamic) onSuccess,
  346. Function(String) onError, {
  347. required int stampId,
  348. required String status,
  349. }) async {
  350. try {
  351. var url = '${ConstCommon.baseUrl}/api/tb-codes/update/$stampId/status/$status';
  352. await dio.put(url).then(
  353. (value) {
  354. onSuccess(value);
  355. },
  356. ).catchError((e) {
  357. onError(AppException.handleError(e));
  358. });
  359. } catch (e) {
  360. onError(AppException.handleError(e));
  361. }
  362. }
  363. }