Skip to content

Commit

Permalink
feat: add deployment model (#76)
Browse files Browse the repository at this point in the history
  • Loading branch information
pichoemr authored Feb 14, 2023
1 parent 808b999 commit d85d91d
Show file tree
Hide file tree
Showing 5 changed files with 149 additions and 68 deletions.
6 changes: 6 additions & 0 deletions lib/api/application_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -39,6 +40,11 @@ class ApplicationApi {
responseMapper: (json, header) => CreateBuildResponse.fromJson(json),
);

static Future<DeploymentsResponse> getDeployments(int appId) => LenraApi.instance.get(
"/apps/$appId/deployments",
responseMapper: (json, header) => DeploymentsResponse.fromJson(json),
);

static Future<GetMainEnvResponse> getMainEnv(int appId) => LenraApi.instance.get(
"/apps/$appId/main_environment",
responseMapper: (json, header) => GetMainEnvResponse.fromJson(json),
Expand Down
33 changes: 33 additions & 0 deletions lib/api/response_models/deployment_response.dart
Original file line number Diff line number Diff line change
@@ -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<String, dynamic> 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;
}
9 changes: 9 additions & 0 deletions lib/api/response_models/deployments_response.dart
Original file line number Diff line number Diff line change
@@ -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<DeploymentResponse> deployments;

DeploymentsResponse.fromJson(List<dynamic> json)
: deployments = json.map<DeploymentResponse>((deployment) => DeploymentResponse.fromJson(deployment)).toList();
}
33 changes: 33 additions & 0 deletions lib/models/deployment_model.dart
Original file line number Diff line number Diff line change
@@ -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<int, Status<DeploymentsResponse>> fetchDeploymentsStatus = {};

Map<int, List<DeploymentResponse>> deploymentsByApp = {};

List<DeploymentResponse> 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<List<DeploymentResponse>> 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;
}
}
Loading

0 comments on commit d85d91d

Please sign in to comment.