// // EtsyRESTConnectionManager.swift // Vendoo // // Created by Okechi Onyeje on 5/25/16. // Copyright © 2016 Okechi Onyeje. All rights reserved. // //NOT ABLE TO CAPTURE NEEDED DATA FROM RESPONSE IN OAUTH PROCESS FOR ETSY import Foundation import SwiftyJSON import OAuthSwift import Locksmith typealias ServiceResponse = (JSON, NSError?) -> Void class EtsyRESTAPIManager: NSObject { //API Manager class variables //----------------------------------------------// static let sharedInstance = EtsyRESTAPIManager() let baseURL = "https://openapi.etsy.com/v2/private" private var apiKey: String! private var apiSecret: String! private var userEmail:String = (NSUserDefaults.standardUserDefaults().objectForKey("email") as? String)! var isAuthorized: Bool = NSUserDefaults.standardUserDefaults().boolForKey("etsyAuthorized") //---------------------------------------------// //User specific class variables private var etsyUser: String! private var oauth_token: String! private var oauth_secret: String! //private let oauthswift = OAuth1Swift(parameters: ["consumerKey":"snbs78qkfy3yqq6yhe6yv49b","consumerSecret":"4sbva4oqb6", "requestTokenUrl": "https://openapi.etsy.com/v2/oauth/request_token?scope=listings_w%20listings_r%20listings_d%20transactions_r%20transactions_w%20"]) override init(){ if let path = NSBundle.mainBundle().pathForResource("Services", ofType: "plist"), dict = NSDictionary(contentsOfFile: path) as? [String: AnyObject] { // use swift dictionary as normal self.apiKey = ((dict["Etsy"] as! Dictionary)["consumerKey"] as! String) self.apiSecret = ((dict["Etsy"] as! Dictionary)["consumerSecret"] as! String) if(self.isAuthorized){ let dictionary = Locksmith.loadDataForUserAccount(self.userEmail) let oauthDictionary = dictionary?["etsy_oauth"] as? Dictionary self.oauth_token = oauthDictionary?["token"] as? String! self.oauth_secret = oauthDictionary?["secret"] as? String! } } } } //Mark: - OAuth Methods extension EtsyRESTAPIManager { //makes application ready for use with users etsy account func authorizeApp(viewcontroller: UIViewController){ if(!isAuthorized){ let oauthswift = OAuth1Swift(parameters: ["consumerKey":self.apiKey,"consumerSecret":self.apiSecret, "requestTokenUrl" : "https://openapi.etsy.com/v2/oauth/request_token?scope=listings_w%20listings_r%20listings_d%20transactions_r%20transactions_w", "authorizeUrl": "https://www.etsy.com/oauth/signin?", "accessTokenUrl": "https://openapi.etsy.com/v2/oauth/access_token?"]) oauthswift!.authorize_url_handler = SafariURLHandler(viewController: viewcontroller) oauthswift!.client.get("https://openapi.etsy.com/v2/oauth/request_token?scope=listings_w%20listings_r%20listings_d%20transactions_r%20transactions_w", success: { data, response in let dataString = NSString(data: data, encoding: NSUTF8StringEncoding) print(dataString!) print(response) //getting error here when trying to retrieve the login url from the response //var dataDictionary = self.convertStringToDictionary(dataString! as String) //print(dataDictionary!["login_url"]) } , failure: { error in print(error) } ) dispatch_async(dispatch_get_main_queue(), {() -> Void in oauthswift!.authorizeWithCallbackURL( NSURL(string: "vendoo://oauth-callback/etsy")!, success: { credential, response, parameters in print(credential.oauth_token) print(credential.oauth_token_secret) print(response) }, failure: { error in print(error) dispatch_async(dispatch_get_main_queue(), {() -> Void in print(oauthswift!.client.credential.oauth_token) print(oauthswift!.client.credential.oauth_token_secret) //save data to keychain let creds = oauthswift?.client.credential let oauth: Dictionary? = [ "token" : creds!.oauth_token, "secret" : creds!.oauth_token_secret ] do{ try Locksmith.saveData(["etsy_oauth" : oauth!], forUserAccount: self.userEmail) print("account credentials saved") NSUserDefaults.standardUserDefaults().setBool(true, forKey: "etsyAuthorized") self.isAuthorized = true } catch{ (error) print(error) //could not save data to keychain print("account credentials could not be saved") } oauthswift!.client.get(self.baseURL, success: { data, response in let dataString = NSString(data: data, encoding: NSUTF8StringEncoding) print(dataString) } , failure: { error in print(error) } ) }) }) }) } //once everything is authorized save true value to the authorization boolean /* NSUserDefaults.standardUserDefaults().setBool(true, forKey: "etsyAuthorized") self.isAuthorized = NSUserDefaults.standardUserDefaults().boolForKey("etsyAuthorized") */ } func deAuthorizeApp(viewcontroller: UIViewController) -> Bool { return true } } //MARK: - Request Methods extension EtsyRESTAPIManager { func generateUserRequest(etsyName: String!, etsyOptions: [String]!) -> String { //starting url for user request to api var userRequest: String! if(etsyName == nil || etsyName == ""){ userRequest = (baseURL + "/users/etsystore?") } else{ userRequest = (baseURL + "/users/" + etsyName + "?") } //final api request return userRequest + "api_key=" + self.apiKey } func generateListingRequest(etsyListing: String!){ //starting url for listing request } //sends the pregenerated url as a request to api service func sendGETRequest(request: String, onCompletion: ServiceResponse) { let request = NSMutableURLRequest(URL: NSURL(string: request)!) let session = NSURLSession.sharedSession() let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in if let jsonData = data { let json:JSON = JSON(data: jsonData) onCompletion(json, error) } else { onCompletion(nil, error) } }) task.resume() } //sends the pregenerated url as a request to api service func sendPOSTRequest(request: String, body: [String: AnyObject], onCompletion: ServiceResponse) { let request = NSMutableURLRequest(URL: NSURL(string: request)!) // Set the method to POST request.HTTPMethod = "POST" do { // Set the POST body for the request let jsonBody = try NSJSONSerialization.dataWithJSONObject(body, options: .PrettyPrinted) request.HTTPBody = jsonBody let session = NSURLSession.sharedSession() let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in if let jsonData = data { let json:JSON = JSON(data: jsonData) onCompletion(json, nil) } else { onCompletion(nil, error) } }) task.resume() } catch { // Create your personal error onCompletion(nil, nil) } } } //MARK: - JSON Methods extension EtsyRESTAPIManager { func convertStringToDictionary(text: String) -> [String:AnyObject]? { if let data = text.dataUsingEncoding(NSUTF8StringEncoding) { do { return try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as? [String:AnyObject] } catch let error as NSError { print(error) } } return nil } }