· 4 years ago · Jun 25, 2021, 11:16 AM
1//
2// OAuthAPIService.swift
3// MyFin
4//
5// Created by Plamen Terziev on 11.09.19.
6// Copyright © 2019 SGFS. All rights reserved.
7//
8
9import UIKit
10import Moya
11
12enum OAuthAPIService {
13 case requestPhoneVerificationCode(phoneNumber: String)
14 case signup(signupDetails: SignupDetails, verificationCode: String)
15 case baseAccessToken
16 case getAccessToken(username: String, password: String, screen: String)
17 case refreshToken(refreshToken: String, screen: String)
18 case requestForgottenPasswordChange(mobPhone: String, email: String)
19 case authorizeForgottenPasswordChange(verificationCode: String, authRequestId: String, password: String)
20}
21
22// MARK: - TargetType implementation
23
24extension OAuthAPIService: TargetType {
25
26 private struct Constants {
27 static let scope = "E_MOBILE"
28 static let system = "E-MOBILE.BG"
29 static var tokenAuthorizationHeaderValue: String {
30 "Basic " + "\(APIConstants.Environment.oauthClientId):\(APIConstants.Environment.oauthClientSecret)".toBase64()
31 }
32 }
33
34 var baseURL: URL {
35 switch self {
36 case .baseAccessToken, .getAccessToken, .refreshToken:
37 return URL(string: "https://nuins.io/oauth2-server/")!
38 default:
39 return URL(string: "\(APIConstants.Environment.resourcesBaseURL)syws-auth/")!
40 }
41 }
42
43 var path: String {
44 switch self {
45 case .requestPhoneVerificationCode,
46 .signup:
47 return "registration/signUp"
48 case .baseAccessToken, .getAccessToken, .refreshToken:
49 return "oauth/token"
50 case .requestForgottenPasswordChange:
51 return "forgotenPassword/request"
52 case .authorizeForgottenPasswordChange:
53 return "forgotenPassword/authorize"
54 }
55 }
56
57 var method: Moya.Method {
58 switch self {
59 case .requestPhoneVerificationCode,
60 .signup,
61 .baseAccessToken,
62 .getAccessToken,
63 .refreshToken,
64 .requestForgottenPasswordChange,
65 .authorizeForgottenPasswordChange:
66 return .post
67 }
68 }
69
70 var sampleData: Data {
71 Data()
72 }
73
74 var validationType: ValidationType {
75 .successCodes
76 }
77
78 var task: Task {
79 switch self {
80 case .requestPhoneVerificationCode(let phoneNumber):
81 return .requestCompositeParameters(
82 bodyParameters: ["operation" : "REQUEST_PHONE_VALIDATION",
83 "mobTelephone" : phoneNumber],
84 bodyEncoding: JSONEncoding.default,
85 urlParameters: ["theme" : "E_BANK"])
86 case .signup(let signupDetails, let verificationCode):
87 return .requestCompositeParameters(
88 bodyParameters: ["operation" : "SIGN_UP",
89 "mobTelephone" : signupDetails.phoneNumber!.normalizedNumber,
90 "email" : signupDetails.email!,
91 "password" : signupDetails.password!,
92 "countryCode" : signupDetails.country!.code,
93 "defaultCcy" : signupDetails.currency!,
94 "verificationCode" : verificationCode],
95 bodyEncoding: JSONEncoding.default,
96 urlParameters: ["theme" : "E_MOBILE"])
97 case .baseAccessToken:
98 return.requestParameters(
99 parameters: ["grant_type" : "client_credentials"],
100 encoding: URLEncoding.default)
101 case .getAccessToken(let username, let password, _):
102 return .requestParameters(
103 parameters: ["grant_type" : "password",
104 "username" : username,
105 "password" : password,
106 "scope" : Constants.scope,
107 "system" : Constants.system],
108 encoding: URLEncoding.default)
109 case .refreshToken(let refreshToken, _):
110 return .requestParameters(
111 parameters: ["grant_type" : "refresh_token",
112 "refresh_token" : refreshToken,
113 "client_id" : APIConstants.Environment.oauthClientId],
114 encoding: URLEncoding.default)
115 case .requestForgottenPasswordChange(let mobPhone, let email):
116 return .requestParameters(
117 parameters: ["mobPhone" : mobPhone,
118 "email" : email],
119 encoding: JSONEncoding.default)
120 case .authorizeForgottenPasswordChange(let verificationCode, let authRequestId, let password):
121 return .requestParameters(
122 parameters: ["otp" : verificationCode,
123 "authRequestId" : authRequestId,
124 "password" : password],
125 encoding: JSONEncoding.default)
126 }
127 }
128
129 var headers: [String : String]? {
130 switch self {
131 case .requestPhoneVerificationCode,
132 .signup,
133 .requestForgottenPasswordChange,
134 .authorizeForgottenPasswordChange:
135 return [APIConstants.Header.contentType : APIConstants.MIME.json,
136 APIConstants.Header.accept : APIConstants.MIME.json]
137 .merging(self.commonHeaders) { (_, new) in new }
138 case .baseAccessToken:
139 return [APIConstants.Header.contentType : APIConstants.MIME.urlEncoded,
140 APIConstants.Header.accept : "\(APIConstants.MIME.json), \(APIConstants.MIME.urlEncoded)",
141 APIConstants.Header.acceptLanguage: APIConstants.MIME.language,
142 APIConstants.Header.authorization : Constants.tokenAuthorizationHeaderValue]
143 case .getAccessToken(_, _, let screen):
144 return [APIConstants.Header.contentType : APIConstants.MIME.urlEncoded,
145 APIConstants.Header.accept : "\(APIConstants.MIME.json), \(APIConstants.MIME.urlEncoded)",
146 APIConstants.Header.acceptLanguage: APIConstants.MIME.language,
147 APIConstants.Header.authorization : Constants.tokenAuthorizationHeaderValue,
148 "Nuins-Screen" : screen]
149 .merging(self.commonHeaders) { (_, new) in new }
150 case .refreshToken(_, let screen):
151 return [APIConstants.Header.contentType : APIConstants.MIME.urlEncoded,
152 APIConstants.Header.accept : "\(APIConstants.MIME.json), \(APIConstants.MIME.urlEncoded)",
153 APIConstants.Header.authorization : Constants.tokenAuthorizationHeaderValue,
154 "Nuins-Screen" : screen]
155 .merging(self.commonHeaders) { (_, new) in new }
156 }
157 }
158}
159
160extension OAuthAPIService {
161 var commonHeaders: [String : String] {
162 ["Nuins-App-Version" : AppGlobal.sharedInstance.applicationVersionBuild,
163 "Nuins-Chanel" : "MOBILE",
164 "Nuins-Client-Time" : CustomDateFormatter.formatDateLongT(date: Date()),
165 "Nuins-Client-Version" : UIDevice.current.systemVersion,
166 "Nuins-Device-Id" : AppGlobal.sharedInstance.applicationUUID,
167 "Nuins-Device-OS" : "\(UIDevice.current.model), \(UIDevice.current.systemVersion)",
168 "Nuins-Theme" : "E_MOBILE"
169 ]
170 }
171}
172