source/UberCore/Authentication/UberScope.swift (129 lines of code) (raw):
//
// UberScope.swift
// UberRides
//
// Copyright © 2015 Uber Technologies, Inc. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
/**
Category of scope that describes its level of access.
- General: scopes that can be used without review.
- Privileged: scopes that require approval before opened to your users in production.
*/
@objc public enum ScopeType : Int {
case general, privileged
}
/**
Scopes control the various API endpoints your application can access.
- AllTrips: Get details of the trip the user is currently taking.
- History: Pull trip data of a user's historical pickups and drop-offs.
- HistoryLite: Same as History without city information.
- Places: Save and retrieve user's favorite places.
- Profile: Access basic profile information on a user's Uber account.
- Request: Make requests for Uber rides on behalf of users.
- RideReceipt: Get receipt details for requests made by application.
- RideWidgets: The scope for using the Ride Request Widget.
*/
@objc public enum UberScopeType: Int {
case allTrips
case history
case historyLite
case places
case profile
case request
case requestReceipt
case rideWidgets
case custom
var type: ScopeType {
switch(self) {
case .history: fallthrough
case .historyLite: fallthrough
case .places: fallthrough
case .profile: fallthrough
case .rideWidgets:
return .general
case .allTrips: fallthrough
case .request: fallthrough
case .requestReceipt: fallthrough
case .custom:
return .privileged
}
}
}
/**
* Object representing an access scope to the Uber API
*/
@objc(UBSDKScope) public class UberScope : NSObject {
/// The UberScopeType of this UberScope
@objc public let uberScopeType: UberScopeType
/// The ScopeType of this UberScope (General / Privileged)
@objc public let scopeType: ScopeType
/// The String raw value of the scope
@objc public let rawValue: String
@objc public init(uberScopeType: UberScopeType) {
assert(uberScopeType != .custom, "Custom scope type should use the `scopeString` initializer")
self.uberScopeType = uberScopeType
scopeType = uberScopeType.type
rawValue = UberScope.toString(uberScopeType)
}
@objc public init(scopeString: String) {
self.uberScopeType = UberScope.toScope(scopeString)
scopeType = uberScopeType.type
rawValue = scopeString.lowercased()
}
override public func isEqual(_ object: Any?) -> Bool {
if let object = object as? UberScope {
return self.uberScopeType == object.uberScopeType && self.rawValue == object.rawValue
} else {
return false
}
}
override public var hash: Int {
return uberScopeType.rawValue.hashValue
}
/// Convenience variable for the AllTrips scope
@objc public static let allTrips = UberScope(uberScopeType: .allTrips)
/// Convenience variable for the History scope
@objc public static let history = UberScope(uberScopeType: .history)
/// Convenience variable for the HistoryLite scope
@objc public static let historyLite = UberScope(uberScopeType: .historyLite)
/// Convenience variable for the Places scope
@objc public static let places = UberScope(uberScopeType: .places)
/// Convenience variable for the Profile scope
@objc public static let profile = UberScope(uberScopeType: .profile)
/// Convenience variable for the Request scope
@objc public static let request = UberScope(uberScopeType: .request)
/// Convenience variable for the RequestReceipt scope
@objc public static let requestReceipt = UberScope(uberScopeType: .requestReceipt)
/// Convenience variable for the RideWidgets scope
@objc public static let rideWidgets = UberScope(uberScopeType: .rideWidgets)
private static func toString(_ uberScopeType: UberScopeType) -> String {
switch uberScopeType {
case .allTrips:
return "all_trips"
case .history:
return "history"
case .historyLite:
return "history_lite"
case .places:
return "places"
case .profile:
return "profile"
case .request:
return "request"
case .requestReceipt:
return "request_receipt"
case .rideWidgets:
return "ride_widgets"
default:
return ""
}
}
private static func toScope(_ rawString: String) -> UberScopeType {
switch rawString.lowercased() {
case "all_trips":
return .allTrips
case "history":
return .history
case "history_lite":
return .historyLite
case "places":
return .places
case "profile":
return .profile
case "request":
return .request
case "request_receipt":
return .requestReceipt
case "ride_widgets":
return .rideWidgets
default:
return .custom
}
}
}
/**
Extending String to allow for easy conversion from space delminated scope string
to array of UberScopes
*/
public extension String {
/**
Converts a string of space delimited scopes into an array of RideScopes
- returns: An array of UberScope representing the string
*/
func toUberScopesArray() -> [UberScope] {
// backend sends scope string delimited by both space and plus !!!
let separatedScopes = components(separatedBy: " ").flatMap { (str: String) in
str.components(separatedBy: "+")
}
let scopesArray = separatedScopes.map { (scopeString: String) in
UberScope(scopeString: scopeString)
}
return scopesArray
}
}
/**
Extends SequenceType of UberScope to allow for easy conversion to a space
delimited scope string
*/
public extension Sequence where Iterator.Element == UberScope {
/**
Converts an array of UberScopes into a space delimited String
- parameter scopes: The array of UberScopes to convert
- returns: A string representing the scopes
*/
func toUberScopeString() -> String
{
var scopeStringArray = [String]()
for scope in self {
scopeStringArray.append(scope.rawValue)
}
return scopeStringArray.joined(separator: " ")
}
}