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.

369 lines
13KB

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