From 86f01ab7d167d31fe99be59aef51a401de586891 Mon Sep 17 00:00:00 2001
From: Vishesh Handa <me@vhanda.in>
Date: Fri, 25 Jan 2019 15:03:42 +0100
Subject: [PATCH] GitHosts: Improve error handling

---
 lib/apis/githost.dart |  3 +++
 lib/apis/github.dart  | 11 ++++++-----
 lib/apis/gitlab.dart  | 18 +++++++++++++-----
 3 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/lib/apis/githost.dart b/lib/apis/githost.dart
index b3a58fb0..c8ffddb0 100644
--- a/lib/apis/githost.dart
+++ b/lib/apis/githost.dart
@@ -23,7 +23,10 @@ class GitRepo {
 
 class GitHostException implements Exception {
   static const OAuthFailed = const GitHostException("OAuthFailed");
+  static const MissingAccessCode = const GitHostException("MissingAccessCode");
   static const RepoExists = const GitHostException("RepoExists");
+  static const CreateRepoFailed = const GitHostException("CreateRepoFailed");
+  static const DeployKeyFailed = const GitHostException("DeployKeyFailed");
 
   final String cause;
   const GitHostException(this.cause);
diff --git a/lib/apis/github.dart b/lib/apis/github.dart
index 2efa61fd..b1684675 100644
--- a/lib/apis/github.dart
+++ b/lib/apis/github.dart
@@ -72,7 +72,7 @@ class GitHub implements GitHost {
   @override
   Future<List<GitRepo>> listRepos() async {
     if (_accessCode.isEmpty) {
-      throw "GitHub Access Code Missing";
+      throw GitHostException.MissingAccessCode;
     }
 
     var url =
@@ -103,7 +103,7 @@ class GitHub implements GitHost {
   Future<GitRepo> createRepo(String name) async {
     // FIXME: Proper error when the repo exists!
     if (_accessCode.isEmpty) {
-      throw "GitHub Access Code Missing";
+      throw GitHostException.MissingAccessCode;
     }
 
     var url = "https://api.github.com/user/repos?access_token=$_accessCode";
@@ -123,7 +123,8 @@ class GitHub implements GitHost {
           response.statusCode.toString() +
           ": " +
           response.body);
-      return null;
+
+      throw GitHostException.CreateRepoFailed;
     }
 
     print("GitHub createRepo: " + response.body);
@@ -134,7 +135,7 @@ class GitHub implements GitHost {
   // FIXME: Proper error when the repo exists!
   Future addDeployKey(String sshPublicKey, String repo) async {
     if (_accessCode.isEmpty) {
-      throw "GitHub Access Code Missing";
+      throw GitHostException.MissingAccessCode;
     }
 
     var url =
@@ -157,7 +158,7 @@ class GitHub implements GitHost {
           response.statusCode.toString() +
           ": " +
           response.body);
-      return null;
+      throw GitHostException.DeployKeyFailed;
     }
 
     print("GitHub addDeployKey: " + response.body);
diff --git a/lib/apis/gitlab.dart b/lib/apis/gitlab.dart
index 6fff6d5f..fee11e83 100644
--- a/lib/apis/gitlab.dart
+++ b/lib/apis/gitlab.dart
@@ -63,7 +63,7 @@ class GitLab implements GitHost {
   @override
   Future<List<GitRepo>> listRepos() async {
     if (_accessCode.isEmpty) {
-      throw "GitHub Access Code Missing";
+      throw GitHostException.MissingAccessCode;
     }
 
     // FIXME: pagination!
@@ -95,7 +95,7 @@ class GitLab implements GitHost {
   Future<GitRepo> createRepo(String name) async {
     // FIXME: Proper error when the repo exists!
     if (_accessCode.isEmpty) {
-      throw "GitLab Access Code Missing";
+      throw GitHostException.MissingAccessCode;
     }
 
     var url = "https://gitlab.com/api/v4/projects?access_token=$_accessCode";
@@ -115,7 +115,15 @@ class GitLab implements GitHost {
           response.statusCode.toString() +
           ": " +
           response.body);
-      return null;
+
+      if (response.statusCode == 400) {
+        Map<String, dynamic> data = json.decode(response.body);
+        Map<String, dynamic> message = data['message'];
+        var name = message['name'];
+        print(name);
+      }
+
+      throw GitHostException.CreateRepoFailed;
     }
 
     print("GitLab createRepo: " + response.body);
@@ -126,7 +134,7 @@ class GitLab implements GitHost {
   @override
   Future addDeployKey(String sshPublicKey, String repo) async {
     if (_accessCode.isEmpty) {
-      throw "GitLab Access Code Missing";
+      throw GitHostException.MissingAccessCode;
     }
 
     repo = repo.replaceAll('/', '%2F');
@@ -150,7 +158,7 @@ class GitLab implements GitHost {
           response.statusCode.toString() +
           ": " +
           response.body);
-      return null;
+      throw GitHostException.DeployKeyFailed;
     }
 
     print("GitLab addDeployKey: " + response.body);