From e348ad1eb14b80e9e3e8888065bdec4bdab36ba4 Mon Sep 17 00:00:00 2001 From: Rodrigo Pedroso <> Date: Thu, 27 Jun 2019 00:23:14 -0400 Subject: [PATCH] Network layer (ongoing) --- repo-browser.xcodeproj/project.pbxproj | 16 +++++ repo-browser/Base.lproj/Main.storyboard | 20 ++++-- .../Helpers/RBRNetworkController.swift | 60 ++++++++++++++++++ repo-browser/RepoBrowser.plist | 13 ++++ repo-browser/ViewController.swift | 61 ++++++++++++++++++- 5 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 repo-browser/Helpers/RBRNetworkController.swift create mode 100644 repo-browser/RepoBrowser.plist diff --git a/repo-browser.xcodeproj/project.pbxproj b/repo-browser.xcodeproj/project.pbxproj index 78165cd..eb73e3a 100644 --- a/repo-browser.xcodeproj/project.pbxproj +++ b/repo-browser.xcodeproj/project.pbxproj @@ -15,6 +15,8 @@ C10733CA22C468A40095EEDD /* repo_browserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C10733C922C468A40095EEDD /* repo_browserTests.swift */; }; C10733D722C468F90095EEDD /* RepoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C10733D522C468F90095EEDD /* RepoCell.swift */; }; C10733D822C468F90095EEDD /* RepoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C10733D622C468F90095EEDD /* RepoCell.xib */; }; + C10733DA22C46A370095EEDD /* RepoBrowser.plist in Resources */ = {isa = PBXBuildFile; fileRef = C10733D922C46A370095EEDD /* RepoBrowser.plist */; }; + C10733DD22C46B3C0095EEDD /* RBRNetworkController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C10733DC22C46B3C0095EEDD /* RBRNetworkController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -40,6 +42,8 @@ C10733CB22C468A40095EEDD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C10733D522C468F90095EEDD /* RepoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RepoCell.swift; sourceTree = ""; }; C10733D622C468F90095EEDD /* RepoCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RepoCell.xib; sourceTree = ""; }; + C10733D922C46A370095EEDD /* RepoBrowser.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = RepoBrowser.plist; sourceTree = ""; }; + C10733DC22C46B3C0095EEDD /* RBRNetworkController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RBRNetworkController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -81,6 +85,7 @@ C10733B322C468A30095EEDD /* repo-browser */ = { isa = PBXGroup; children = ( + C10733DB22C46AF80095EEDD /* Helpers */, C10733D422C468E10095EEDD /* Cells */, C10733B422C468A30095EEDD /* AppDelegate.swift */, C10733B622C468A30095EEDD /* ViewController.swift */, @@ -88,6 +93,7 @@ C10733BB22C468A40095EEDD /* Assets.xcassets */, C10733BD22C468A40095EEDD /* LaunchScreen.storyboard */, C10733C022C468A40095EEDD /* Info.plist */, + C10733D922C46A370095EEDD /* RepoBrowser.plist */, ); path = "repo-browser"; sourceTree = ""; @@ -110,6 +116,14 @@ path = Cells; sourceTree = ""; }; + C10733DB22C46AF80095EEDD /* Helpers */ = { + isa = PBXGroup; + children = ( + C10733DC22C46B3C0095EEDD /* RBRNetworkController.swift */, + ); + path = Helpers; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -192,6 +206,7 @@ buildActionMask = 2147483647; files = ( C10733BF22C468A40095EEDD /* LaunchScreen.storyboard in Resources */, + C10733DA22C46A370095EEDD /* RepoBrowser.plist in Resources */, C10733BC22C468A40095EEDD /* Assets.xcassets in Resources */, C10733BA22C468A30095EEDD /* Main.storyboard in Resources */, C10733D822C468F90095EEDD /* RepoCell.xib in Resources */, @@ -213,6 +228,7 @@ buildActionMask = 2147483647; files = ( C10733B722C468A30095EEDD /* ViewController.swift in Sources */, + C10733DD22C46B3C0095EEDD /* RBRNetworkController.swift in Sources */, C10733B522C468A30095EEDD /* AppDelegate.swift in Sources */, C10733D722C468F90095EEDD /* RepoCell.swift in Sources */, ); diff --git a/repo-browser/Base.lproj/Main.storyboard b/repo-browser/Base.lproj/Main.storyboard index f96b505..cf93dd3 100644 --- a/repo-browser/Base.lproj/Main.storyboard +++ b/repo-browser/Base.lproj/Main.storyboard @@ -13,7 +13,7 @@ - + @@ -32,7 +32,7 @@ - + @@ -45,13 +45,25 @@ + - - + + + diff --git a/repo-browser/Helpers/RBRNetworkController.swift b/repo-browser/Helpers/RBRNetworkController.swift new file mode 100644 index 0000000..e7a53bc --- /dev/null +++ b/repo-browser/Helpers/RBRNetworkController.swift @@ -0,0 +1,60 @@ +// +// RBRNetworkController.swift +// repo-browser +// +// Created by Rodrigo Pedroso on 2019-06-26. +// Copyright © 2019 Rodrigo Pedroso Leite Pinto. All rights reserved. +// + +import UIKit + +protocol RBRNetworkControllerDelegate: class { + func messageServerDown() +} + +class RBRNetworkController: NSObject { + + var network: Dictionary = [:] + var api: String = "" + var token: String = "" + let timeOut: TimeInterval = 6.0 + weak var delegate: RBRNetworkControllerDelegate? + + // MARK: - Initialization + + override init() { + // Storing server URL into 'api' + if let path = Bundle.main.path(forResource: "RepoBrowser", ofType: "plist"), let dict = NSDictionary(contentsOfFile: path) { + token = dict["token"] as! String + network = (dict["Network"] as? Dictionary)! + api = network["api" as NSString] as! String + } + } + + // MARKL - Network calls + + func getRepos(owner: String, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void) { + let urlString: String = api + owner + let targetURL = URL(string: urlString) + var request = URLRequest(url: targetURL!) + request.addValue("application/vnd.github.v3+json", forHTTPHeaderField: "Accept") + request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization") + + request.httpMethod = "GET" + request.timeoutInterval = timeOut + let session = URLSession.shared + + session.dataTask(with: request) { + data, response, err in DispatchQueue.main.async(execute: { + () -> Void in + if (response as? HTTPURLResponse) != nil { + completion(data, (response as! HTTPURLResponse).statusCode, err as NSError?) + } + else { + print("No response: \(String(describing: err))") + self.delegate?.messageServerDown() + } + }) + }.resume() + } +} diff --git a/repo-browser/RepoBrowser.plist b/repo-browser/RepoBrowser.plist new file mode 100644 index 0000000..a5fb8d7 --- /dev/null +++ b/repo-browser/RepoBrowser.plist @@ -0,0 +1,13 @@ + + + + + token + c250629cdcb2d4b36fe85274dcab73917c09d2c4 + Network + + api + https://api.github.com/repos/ + + + diff --git a/repo-browser/ViewController.swift b/repo-browser/ViewController.swift index d1ca180..467a9c5 100644 --- a/repo-browser/ViewController.swift +++ b/repo-browser/ViewController.swift @@ -8,7 +8,7 @@ import UIKit -class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { +class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, RBRNetworkControllerDelegate { @IBOutlet var txfRepoOwner: UITextField! @IBOutlet var tblRepoTable: UITableView! @@ -16,6 +16,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour let cellIdentifier = "RepoCell" var dataSource: Array> = [] var selectedIndex: Int! + let netController = RBRNetworkController() override func viewDidLoad() { super.viewDidLoad() @@ -64,4 +65,62 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour selectedIndex = indexPath.row performSegue(withIdentifier: "sortedDetailSegue", sender: self) } + + // MARK: - Network calls + + /** + Get all repositories of a user + */ + func getRepos() { + if let owner = txfRepoOwner.text { + weak var weakSelf = self + DispatchQueue.global(qos: .userInitiated).async { + weakSelf?.netController.getRepos(owner: owner, completion: { (data, HTTPStatusCode, error) in + if HTTPStatusCode == 200 && error == nil { + do { + let result = try JSONSerialization.jsonObject(with: data!, options: []) as! Array> + print(result) +// weakSelf?.btnConfigUsers.isHidden = self.appChildren.count > 0 ? false : true +// weakSelf?.cltChildrenCollection.reloadData() + } + catch { + print("Post request try/catch error: \(error)") + } + } + else { + print("Error retrieving repo") + } + }) + } + } + else { + self.warnMessage(msg: "Please fill repository owner field") + } + } + + // MARK: - Action + + @IBAction func loadRepo(_ sender: UIButton) { + self.getRepos() + } + + + // MARK: - Helpers + + func warnMessage(msg: String) { + let alert = UIAlertController(title: "Error", message: msg, preferredStyle: UIAlertController.Style.alert) + alert.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil)) + + self.present(alert, animated: true, completion: nil) + } + + // MARK: - Delegates + + func messageServerDown() { + let msg: String = "The server is not responding. Please try again later." + let alert = UIAlertController(title: "Error", message: msg, preferredStyle: UIAlertController.Style.alert) + alert.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil)) + + self.present(alert, animated: true, completion: nil) + } }