diff --git a/lib/apis/github.dart b/lib/apis/github.dart index 4eae3cfb..8e07b6a4 100644 --- a/lib/apis/github.dart +++ b/lib/apis/github.dart @@ -7,60 +7,156 @@ import 'package:flutter/services.dart'; import 'package:url_launcher/url_launcher.dart'; -const _clientID = "aa3072cbfb02b1db14ed"; -const _clientSecret = "010d303ea99f82330f2b228977cef9ddbf7af2cd"; -const _platform = const MethodChannel('gitjournal.io/git'); +class GitHub { + static const _clientID = "aa3072cbfb02b1db14ed"; + static const _clientSecret = "010d303ea99f82330f2b228977cef9ddbf7af2cd"; -Future getAccessCode(String authCode) async { - var url = - "https://github.com/login/oauth/access_token?client_id=${_clientID}&client_secret=${_clientSecret}&code=${authCode}"; + var _platform = const MethodChannel('gitjournal.io/git'); + var _accessCode = ""; - var response = await http.post(url); - if (response.statusCode != 200) { - print("Github getAccessCode: Invalid response " + - response.statusCode.toString() + - ": " + - response.body); - return null; - } - print("GithubResponse: " + response.body); + void init(Function callback) { + Future _handleMessages(MethodCall call) async { + if (call.method != "onURL") { + print("GitHub Unknown Call: " + call.method); + return; + } - var map = Uri.splitQueryString(response.body); - return map["access_token"]; -} + print("GitHub: Called onUrl with " + call.arguments.toString()); -void initGitHub(Function callback) { - Future _handleMessages(MethodCall call) async { - if (call.method != "onURL") { - print("GitHub Unknown Call: " + call.method); - return; - } + var url = call.arguments["URL"]; + var uri = Uri.parse(url); + var authCode = uri.queryParameters['code']; + if (authCode == null) { + print("GitHub: Missing auth code. Now what?"); + callback(); + } - print("GitHub: Called onUrl with " + call.arguments.toString()); - - var url = call.arguments["URL"]; - var uri = Uri.parse(url); - var authCode = uri.queryParameters['code']; - if (authCode == null) { - print("GitHub: Missing auth code. Now what?"); + this._accessCode = await _getAccessCode(authCode); callback(); } - var acesssCode = await getAccessCode(authCode); - callback(acesssCode); + _platform.setMethodCallHandler(_handleMessages); + print("GitHub: Installed Handler"); } - _platform.setMethodCallHandler(_handleMessages); - print("GitHub: Installed Handler"); -} + Future _getAccessCode(String authCode) async { + var url = + "https://github.com/login/oauth/access_token?client_id=${_clientID}&client_secret=${_clientSecret}&code=${authCode}"; -Future launchOAuthScreen() async { - // FIXME: Add some 'state' over here! + var response = await http.post(url); + if (response.statusCode != 200) { + print("Github getAccessCode: Invalid response " + + response.statusCode.toString() + + ": " + + response.body); + return null; + } + print("GithubResponse: " + response.body); - var url = "https://github.com/login/oauth/authorize?client_id=" + - _clientID + - "&scope=repo"; - return launch(url); + var map = Uri.splitQueryString(response.body); + return map["access_token"]; + } + + Future launchOAuthScreen() async { + // FIXME: Add some 'state' over here! + + var url = "https://github.com/login/oauth/authorize?client_id=" + + _clientID + + "&scope=repo"; + return launch(url); + } + + Future> listRepos() async { + if (_accessCode.isEmpty) { + throw "GitHub Access Code Missing"; + } + + var url = + "https://api.github.com/user/repos?page=1&per_page=100&access_token=${_accessCode}"; + + var response = await http.get(url); + if (response.statusCode != 200) { + print("Github listRepos: Invalid response " + + response.statusCode.toString() + + ": " + + response.body); + return null; + } + + List list = jsonDecode(response.body); + List repos = new List(); + list.forEach((dynamic d) { + var map = Map.from(d); + var repo = Repo.fromJson(map); + repos.add(repo); + }); + + // FIXME: Sort these based on some criteria + return repos; + } + +// FIXME: Proper error when the repo exists! + Future createRepo(String name) async { + if (_accessCode.isEmpty) { + throw "GitHub Access Code Missing"; + } + + var url = "https://api.github.com/user/repos?access_token=${_accessCode}"; + Map data = { + 'name': name, + 'private': true, + }; + + var headers = { + HttpHeaders.contentTypeHeader: "application/json", + }; + + var response = + await http.post(url, headers: headers, body: json.encode(data)); + if (response.statusCode != 201) { + print("Github createRepo: Invalid response " + + response.statusCode.toString() + + ": " + + response.body); + return null; + } + + print("GitHub createRepo: " + response.body); + var map = json.decode(response.body); + return Repo.fromJson(map); + } + + Future addDeployKey(String sshPublicKey, String repo) async { + if (_accessCode.isEmpty) { + throw "GitHub Access Code Missing"; + } + + var url = + "https://api.github.com/repos/$repo/keys?access_token=${_accessCode}"; + + Map data = { + 'title': "GitJournal", + 'key': sshPublicKey, + 'read_only': false, + }; + + var headers = { + HttpHeaders.contentTypeHeader: "application/json", + }; + + var response = + await http.post(url, headers: headers, body: json.encode(data)); + if (response.statusCode != 201) { + print("Github addDeployKey: Invalid response " + + response.statusCode.toString() + + ": " + + response.body); + return null; + } + + print("GitHub addDeployKey: " + response.body); + return json.decode(response.body); + } } class Repo { @@ -76,81 +172,3 @@ class Repo { return 'Repo{fulleName: $fullName}'; } } - -Future> listRepos(String accessCode) async { - var url = - "https://api.github.com/user/repos?page=1&per_page=100&access_token=${accessCode}"; - - var response = await http.get(url); - if (response.statusCode != 200) { - print("Github listRepos: Invalid response " + - response.statusCode.toString() + - ": " + - response.body); - return null; - } - - List list = jsonDecode(response.body); - List repos = new List(); - list.forEach((dynamic d) { - var map = Map.from(d); - var repo = Repo.fromJson(map); - repos.add(repo); - }); - - // FIXME: Sort these based on some criteria - return repos; -} - -Future createRepo(String accessCode, String name) async { - var url = "https://api.github.com/user/repos?access_token=${accessCode}"; - Map data = { - 'name': name, - 'private': true, - }; - - var headers = { - HttpHeaders.contentTypeHeader: "application/json", - }; - - var response = - await http.post(url, headers: headers, body: json.encode(data)); - if (response.statusCode != 201) { - print("Github createRepo: Invalid response " + - response.statusCode.toString() + - ": " + - response.body); - return null; - } - - print("GitHub createRepo: " + response.body); - return json.decode(response.body); -} - -Future addDeployKey(String accessCode, String sshPublicKey, String repo) async { - var url = - "https://api.github.com/repos/$repo/keys?access_token=${accessCode}"; - - Map data = { - 'title': "GitJournal", - 'key': sshPublicKey, - 'read_only': false, - }; - - var headers = { - HttpHeaders.contentTypeHeader: "application/json", - }; - - var response = - await http.post(url, headers: headers, body: json.encode(data)); - if (response.statusCode != 201) { - print("Github addDeployKey: Invalid response " + - response.statusCode.toString() + - ": " + - response.body); - return null; - } - - print("GitHub addDeployKey: " + response.body); - return json.decode(response.body); -} diff --git a/lib/oauthapp.dart b/lib/oauthapp.dart index f2bbf0e9..784a51d7 100644 --- a/lib/oauthapp.dart +++ b/lib/oauthapp.dart @@ -13,13 +13,13 @@ var key = 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+VAh8r+vn0c+M+DacOo/szXcdMpxO1kIO3USkzgE5XdO83kQdDwh4Xc4P3dcc+FFSfVcEl3mSXGKbYC3G0ZoVcWd4ed40Gt3sLHSfNRQlRv+obnqKbzDLuOGfq65EkaJ90vrWBo/k7K8tBC2j1FZ/PUYy3DxeQkPEZXCMZDSG5P/+XoHn5IPcaxDpvlZjtOrx4H3pQ/YVI+XmyFAsZe+/Shy5sg4ilsdo4BQN2nODuBLwmgYu/hHmCcd8t4OxgBANVN8TMqHnZfRLixRSuXn0DbV4YOa/b2lBFQNvjkoBF6KhXOxZ+awyjyTpNp4AgF5c+3xptkNwUlwiQDCzcUmH your_email@example.com'; class OAuthAppState extends State { + var github = new GitHub(); String githubAccessCode = ""; void initState() { super.initState(); - initGitHub((String accessCode) { - print("Got accessCode " + accessCode); - githubAccessCode = accessCode; + github.init(() { + print("GitHub initialized and has access code"); }); } @@ -35,13 +35,13 @@ class OAuthAppState extends State { RaisedButton( child: Text("Open OAuth URL"), onPressed: () { - launchOAuthScreen(); + github.launchOAuthScreen(); }, ), RaisedButton( child: Text("List Repos"), onPressed: () async { - var repos = await listRepos(githubAccessCode); + var repos = await github.listRepos(); for (var repo in repos) { print(repo.fullName); } @@ -51,7 +51,7 @@ class OAuthAppState extends State { child: Text("Create Repo"), onPressed: () async { try { - await createRepo(githubAccessCode, "journal_test2"); + await github.createRepo("journal_test2"); } catch (err) { print("Create Repo: " + err.toString()); } @@ -61,8 +61,7 @@ class OAuthAppState extends State { child: Text("Add Deploy Key"), onPressed: () async { try { - await addDeployKey( - githubAccessCode, key, "vhanda/journal_test2"); + await github.addDeployKey(key, "vhanda/journal_test2"); } catch (err) { print("Deploy Key: " + err.toString()); }