@@ -11,20 +11,32 @@ import FirebaseAuth
1111import FirebaseFirestore
1212import FirebaseFunctions
1313import FirebaseMessaging
14+ import Nexa
1415
1516final class GithubAuthenticationService : NSObject , AuthenticationService {
1617 private enum FunctionName : String {
1718 case requestGithubTokens
1819 case revokeGithubAccessToken
1920 }
2021
22+ private enum GitHubAPI {
23+ static let baseURL = URL ( string: " https://api.github.com " ) !
24+ static let acceptHeader = " application/vnd.github.v3+json "
25+ }
26+
2127 private let store = Firestore . firestore ( )
2228 private let functions = Functions . functions ( region: " asia-northeast3 " )
2329 private let messaging = Messaging . messaging ( )
2430 private var user : User ? { Auth . auth ( ) . currentUser }
2531 private let providerID = AuthProviderID . gitHub
2632 private let provider = TopViewControllerProvider ( )
2733 private let logger = Logger ( category: " GithubAuthService " )
34+ private let gitHubApiClient = NXAPIClient (
35+ configuration: NXClientConfiguration (
36+ baseURL: GitHubAPI . baseURL,
37+ headers: [ " Accept " : GitHubAPI . acceptHeader]
38+ )
39+ )
2840
2941 func signIn( ) async throws -> AuthDataResponse {
3042 logger. info ( " Starting GitHub sign in " )
@@ -243,24 +255,11 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
243255
244256 // GitHub API로 사용자 프로필 정보 가져오기
245257 private func requestUserProfile( accessToken: String ) async throws -> GitHubUser {
246- guard let url = URL ( string: " https://api.github.com/user " ) else {
247- throw URLError ( . badURL)
248- }
249-
250- var request = URLRequest ( url: url)
251- request. httpMethod = " GET "
252- request. addValue ( " Bearer \( accessToken) " , forHTTPHeaderField: " Authorization " )
253- request. addValue ( " application/vnd.github.v3+json " , forHTTPHeaderField: " Accept " )
254-
255- let ( data, response) = try await URLSession . shared. data ( for: request)
256-
257- guard let httpResponse = response as? HTTPURLResponse ,
258- httpResponse. statusCode == 200 else {
259- throw URLError ( . badServerResponse)
260- }
261-
262- let decoder = JSONDecoder ( )
263- let gitHubUser = try decoder. decode ( GitHubUser . self, from: data)
258+ let gitHubUser = try await gitHubApiClient
259+ . get ( " /user " , as: GitHubUser . self)
260+ . header ( " Authorization " , " Bearer \( accessToken) " )
261+ . validate ( . statusCodes( [ 200 ] ) )
262+ . send ( )
264263
265264 if gitHubUser. email != nil {
266265 return gitHubUser
@@ -276,24 +275,11 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
276275 }
277276
278277 private func requestPrimaryVerifiedEmail( accessToken: String ) async throws -> String ? {
279- guard let url = URL ( string: " https://api.github.com/user/emails " ) else {
280- throw URLError ( . badURL)
281- }
282-
283- var request = URLRequest ( url: url)
284- request. httpMethod = " GET "
285- request. addValue ( " Bearer \( accessToken) " , forHTTPHeaderField: " Authorization " )
286- request. addValue ( " application/vnd.github.v3+json " , forHTTPHeaderField: " Accept " )
287-
288- let ( data, response) = try await URLSession . shared. data ( for: request)
289-
290- guard let httpResponse = response as? HTTPURLResponse ,
291- httpResponse. statusCode == 200 else {
292- throw URLError ( . badServerResponse)
293- }
294-
295- let decoder = JSONDecoder ( )
296- let gitHubEmails = try decoder. decode ( [ GitHubEmail ] . self, from: data)
278+ let gitHubEmails = try await gitHubApiClient
279+ . get ( " /user/emails " , as: [ GitHubEmail ] . self)
280+ . header ( " Authorization " , " Bearer \( accessToken) " )
281+ . validate ( . statusCodes( [ 200 ] ) )
282+ . send ( )
297283
298284 if let primaryVerifiedEmail = gitHubEmails. first ( where: { $0. primary && $0. verified } ) {
299285 return primaryVerifiedEmail. email
0 commit comments