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.

335 lines
12KB

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