From d85d91d5c647739a6f7ac9a2b499624ae16647fd Mon Sep 17 00:00:00 2001 From: Emric Pichonnier Date: Tue, 14 Feb 2023 10:42:24 +0100 Subject: [PATCH] feat: add deployment model (#76) --- lib/api/application_api.dart | 6 + .../response_models/deployment_response.dart | 33 +++++ .../response_models/deployments_response.dart | 9 ++ lib/models/deployment_model.dart | 33 +++++ pubspec.lock | 136 +++++++++--------- 5 files changed, 149 insertions(+), 68 deletions(-) create mode 100644 lib/api/response_models/deployment_response.dart create mode 100644 lib/api/response_models/deployments_response.dart create mode 100644 lib/models/deployment_model.dart diff --git a/lib/api/application_api.dart b/lib/api/application_api.dart index 7d00952..ce01ffd 100644 --- a/lib/api/application_api.dart +++ b/lib/api/application_api.dart @@ -6,6 +6,7 @@ import 'package:client_common/api/response_models/apps_response.dart'; import 'package:client_common/api/response_models/builds_response.dart'; import 'package:client_common/api/response_models/create_app_response.dart'; import 'package:client_common/api/response_models/create_build_response.dart'; +import 'package:client_common/api/response_models/deployments_response.dart'; import 'package:client_common/api/response_models/get_main_env_response.dart'; import 'package:client_common/api/response_models/update_app_response.dart'; @@ -39,6 +40,11 @@ class ApplicationApi { responseMapper: (json, header) => CreateBuildResponse.fromJson(json), ); + static Future getDeployments(int appId) => LenraApi.instance.get( + "/apps/$appId/deployments", + responseMapper: (json, header) => DeploymentsResponse.fromJson(json), + ); + static Future getMainEnv(int appId) => LenraApi.instance.get( "/apps/$appId/main_environment", responseMapper: (json, header) => GetMainEnvResponse.fromJson(json), diff --git a/lib/api/response_models/deployment_response.dart b/lib/api/response_models/deployment_response.dart new file mode 100644 index 0000000..aff84a2 --- /dev/null +++ b/lib/api/response_models/deployment_response.dart @@ -0,0 +1,33 @@ +import 'package:client_common/api/response_models/api_response.dart'; + +enum DeploymentStatus { created, waitingForBuild, waitingForAppReady, failure, success } + +class DeploymentResponse extends ApiResponse { + int id; + int buildId; + int applicationId; + DeploymentStatus status; + DateTime insertedAt; + + DeploymentResponse.fromJson(Map json) + : id = json["id"], + status = DeploymentStatus.values.firstWhere((e) => e.toString() == 'DeploymentStatus.${json["status"]}', + orElse: () => DeploymentStatus.failure), + insertedAt = DateTime.parse(json["inserted_at"]), + buildId = json["build_id"], + applicationId = json["application_id"]; + + @override + bool operator ==(Object other) { + return other is DeploymentResponse && + other.buildId == buildId && + other.id == id && + other.status == status && + other.insertedAt == insertedAt && + other.applicationId == applicationId; + } + + @override + // ignore: unnecessary_overrides + int get hashCode => super.hashCode; +} diff --git a/lib/api/response_models/deployments_response.dart b/lib/api/response_models/deployments_response.dart new file mode 100644 index 0000000..5d6c1c0 --- /dev/null +++ b/lib/api/response_models/deployments_response.dart @@ -0,0 +1,9 @@ +import 'package:client_common/api/response_models/api_response.dart'; +import 'package:client_common/api/response_models/deployment_response.dart'; + +class DeploymentsResponse extends ApiResponse { + List deployments; + + DeploymentsResponse.fromJson(List json) + : deployments = json.map((deployment) => DeploymentResponse.fromJson(deployment)).toList(); +} diff --git a/lib/models/deployment_model.dart b/lib/models/deployment_model.dart new file mode 100644 index 0000000..547b510 --- /dev/null +++ b/lib/models/deployment_model.dart @@ -0,0 +1,33 @@ +import 'package:client_common/api/application_api.dart'; +import 'package:client_common/api/response_models/deployment_response.dart'; +import 'package:client_common/api/response_models/deployments_response.dart'; +import 'package:client_common/models/status.dart'; +import 'package:flutter/material.dart'; + +/// The model that manages the builds. +class DeploymentModel extends ChangeNotifier { + Map> fetchDeploymentsStatus = {}; + + Map> deploymentsByApp = {}; + + List deploymentsForApp(int appId) { + if (deploymentsByApp.containsKey(appId)) return deploymentsByApp[appId]!; + return []; + } + + DeploymentResponse? latestDeploymentForApp(int appId) { + if (deploymentsByApp.containsKey(appId) && deploymentsByApp[appId]!.isNotEmpty) { + return deploymentsByApp[appId]!.reduce((a, b) => a.id > b.id ? a : b); + } else { + return null; + } + } + + Future> fetchDeployments(int appId) async { + fetchDeploymentsStatus[appId] = Status(); + var res = await fetchDeploymentsStatus[appId]!.handle(() => ApplicationApi.getDeployments(appId), notifyListeners); + deploymentsByApp[appId] = res.deployments; + notifyListeners(); + return res.deployments; + } +} diff --git a/pubspec.lock b/pubspec.lock index 382cd05..b94e110 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,26 +5,26 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "3b2fe435eec193a3c31dd4fb2b28b11cf7036cc12287a20745157debd2d2c433" + sha256: "0c80aeab9bc807ab10022cd3b2f4cf2ecdf231949dc1ddd9442406a003f19201" url: "https://pub.dev" source: hosted - version: "40.0.0" + version: "52.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: f64b626238d464c38540c6798ffbf3d1abaafd8b9195b6c3eefa2cb544041843 + sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4 url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "5.4.0" args: dependency: transitive description: name: args - sha256: b003c3098049a51720352d219b0bb5f219b60fbfb68e7a4748139a06a5676515 + sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.0" async: dependency: transitive description: @@ -77,18 +77,18 @@ packages: dependency: transitive description: name: convert - sha256: "196284f26f69444b7f5c50692b55ec25da86d9e500451dc09333bf2e3ad69259" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.1.1" coverage: dependency: transitive description: name: coverage - sha256: "17cf9a839208acaed741b1f00ac87cd1fde00548198ba57205cca45c749cb379" + sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.6.3" crypto: dependency: transitive description: @@ -117,10 +117,10 @@ packages: dependency: transitive description: name: file - sha256: b69516f2c26a5bcac4eee2e32512e1a5205ab312b3536c1c1227b2b942b5f9ad + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" flutter: dependency: "direct main" description: flutter @@ -130,10 +130,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "61584248f5d79708be5924ad50acd959306c04650caddf2d7859d82464da8945" + sha256: "7b25c10de1fea883f3c4f9b8389506b54053cd00807beab69fd65c8653a2711f" url: "https://pub.dev" source: hosted - version: "0.6.10+2" + version: "0.6.14" flutter_secure_storage: dependency: "direct main" description: @@ -146,10 +146,10 @@ packages: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "736436adaf91552433823f51ce22e098c2f0551db06b6596f58597a25b8ea797" + sha256: "0912ae29a572230ad52d8a4697e5518d7f0f429052fd51df7e5a7952c7efe2a3" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.1.3" flutter_secure_storage_macos: dependency: transitive description: @@ -196,66 +196,66 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: "4f4a162323c86ffc1245765cfe138872b8f069deb42f7dbb36115fa27f31469b" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "3.2.0" glob: dependency: transitive description: name: glob - sha256: "8321dd2c0ab0683a91a51307fa844c6db4aa8e3981219b78961672aaab434658" + sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.1.1" go_router: dependency: "direct main" description: name: go_router - sha256: f611d4396469c46db1c61e934a86e2a590ce02de2a6050d01f677879ce151f4a + sha256: "5a0b2e0bc88a006c09d2b419004ffabecf83a74520b8852ea148f22e82634c27" url: "https://pub.dev" source: hosted - version: "6.0.1" + version: "6.0.6" html: dependency: transitive description: name: html - sha256: bfef906cbd4e78ef49ae511d9074aebd1d2251482ef601a280973e8b58b51bbf + sha256: d9793e10dbe0e6c364f4c59bf3e01fb33a9b2a674bc7a1081693dba0614b6269 url: "https://pub.dev" source: hosted - version: "0.15.0" + version: "0.15.1" http: dependency: "direct main" description: name: http - sha256: "2ed163531e071c2c6b7c659635112f24cb64ecbebf6af46b550d536c0b1aa112" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" url: "https://pub.dev" source: hosted - version: "0.13.4" + version: "0.13.5" http_multi_server: dependency: transitive description: name: http_multi_server - sha256: ab298ef2b2acd283bd36837df7801dcf6e6b925f8da6e09efb81111230aa9037 + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - sha256: db3060f22889f3d9d55f6a217565486737037eec3609f7f3eca4d0c67ee0d8a0 + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" io: dependency: transitive description: name: io - sha256: "0d4c73c3653ab85bf696d51a9657604c900a370549196a91f33e4c39af760852" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" js: dependency: transitive description: @@ -277,26 +277,26 @@ packages: dependency: "direct dev" description: name: lints - sha256: "5cfd6509652ff5e7fe149b6df4859e687fca9048437857cb2e65c8d780f396e3" + sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" logging: dependency: "direct main" description: name: logging - sha256: "293ae2d49fd79d4c04944c3a26dfd313382d5f52e821ec57119230ae16031ad4" + sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.1" markdown: dependency: transitive description: name: markdown - sha256: "39caf989ccc72c63e87b961851a74257141938599ed2db45fbd9403fee0db423" + sha256: "4ed544d2ce84975b2ab5cbd4268f2d31f47858553ae2295c92fdf5d6e431a927" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "7.0.0" matcher: dependency: transitive description: @@ -325,10 +325,10 @@ packages: dependency: transitive description: name: mime - sha256: dab22e92b41aa1255ea90ddc4bc2feaf35544fd0728e209638cad041a6e3928a + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.4" nested: dependency: transitive description: @@ -349,10 +349,10 @@ packages: dependency: transitive description: name: package_config - sha256: a4d5ede5ca9c3d88a2fef1147a078570c861714c806485c596b109819135bc12 + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.1.0" path: dependency: transitive description: @@ -381,58 +381,58 @@ packages: dependency: transitive description: name: pool - sha256: "05955e3de2683e1746222efd14b775df7131139e07695dc8e24650f6b4204504" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.5.1" provider: dependency: "direct main" description: name: provider - sha256: "8d7d4c2df46d6a6270a4e10404bfecb18a937e3e00f710c260d0a10415ce6b7b" + sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f url: "https://pub.dev" source: hosted - version: "6.0.3" + version: "6.0.5" pub_semver: dependency: transitive description: name: pub_semver - sha256: "816c1a640e952d213ddd223b3e7aafae08cd9f8e1f6864eed304cc13b0272b07" + sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.3" shelf: dependency: transitive description: name: shelf - sha256: "4592f6cb6c417632ebdfb63e4db42a7e3ad49d1bd52d9f93b6eb883035ddc0c3" + sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" shelf_packages_handler: dependency: transitive description: name: shelf_packages_handler - sha256: e0b44ebddec91e70a713e13adf93c1b2100821303b86a18e1ef1d082bd8bd9b8 + sha256: aef74dc9195746a384843102142ab65b6a4735bb3beea791e63527b88cc83306 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.1" shelf_static: dependency: transitive description: name: shelf_static - sha256: "4a0d12cd512aa4fc55fed5f6280f02ef183f47ba29b4b0dfd621b1c99b7e6361" + sha256: e792b76b96a36d4a41b819da593aff4bdd413576b3ba6150df5d8d9996d2e74c url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: fd84910bf7d58db109082edf7326b75322b8f186162028482f53dc892f00332d + sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.3" sky_engine: dependency: transitive description: flutter @@ -442,18 +442,18 @@ packages: dependency: transitive description: name: source_map_stack_trace - sha256: "8c463326277f68a628abab20580047b419c2ff66756fd0affd451f73f9508c11" + sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" source_maps: dependency: transitive description: name: source_maps - sha256: "52de2200bb098de739794c82d09c41ac27b2e42fd7e23cce7b9c74bf653c7296" + sha256: "490098075234dcedb83c5d949b4c93dad5e6b7702748de000be2b57b8e6b2427" url: "https://pub.dev" source: hosted - version: "0.10.10" + version: "0.10.11" source_span: dependency: transitive description: @@ -554,34 +554,34 @@ packages: dependency: transitive description: name: vm_service - sha256: e686ae49284939abc06972e25f634ccdb5007d5664c4dfa1995002e8b6aa27a9 + sha256: e7fb6c2282f7631712b69c19d1bff82f3767eea33a2321c14fa59ad67ea391c7 url: "https://pub.dev" source: hosted - version: "8.3.0" + version: "9.4.0" watcher: dependency: transitive description: name: watcher - sha256: e42dfcc48f67618344da967b10f62de57e04bae01d9d3af4c2596f3712a88c99 + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "3a969ddcc204a3e34e863d204b29c0752716f78b6f9cc8235083208d268a4ccd" + sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" webkit_inspection_protocol: dependency: transitive description: name: webkit_inspection_protocol - sha256: f66577ed748712574b076e48a300aa3d8bc7aba93e83490c679707187e135ee4 + sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" yaml: dependency: transitive description: