@@ -11,13 +11,19 @@ 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 ( )
@@ -243,24 +249,18 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
243249
244250 // GitHub API로 사용자 프로필 정보 가져오기
245251 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- }
252+ let gitHubApiClient = NXAPIClient (
253+ configuration: NXClientConfiguration (
254+ baseURL: GitHubAPI . baseURL,
255+ headers: [ " Accept " : GitHubAPI . acceptHeader]
256+ )
257+ )
249258
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)
259+ let gitHubUser = try await gitHubApiClient
260+ . get ( " /user " , as: GitHubUser . self)
261+ . header ( " Authorization " , " Bearer \( accessToken) " )
262+ . validate ( . statusCodes( [ 200 ] ) )
263+ . send ( )
264264
265265 if gitHubUser. email != nil {
266266 return gitHubUser
@@ -276,24 +276,18 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
276276 }
277277
278278 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- }
279+ let gitHubApiClient = NXAPIClient (
280+ configuration: NXClientConfiguration (
281+ baseURL: GitHubAPI . baseURL,
282+ headers: [ " Accept " : GitHubAPI . acceptHeader]
283+ )
284+ )
294285
295- let decoder = JSONDecoder ( )
296- let gitHubEmails = try decoder. decode ( [ GitHubEmail ] . self, from: data)
286+ let gitHubEmails = try await gitHubApiClient
287+ . get ( " /user/emails " , as: [ GitHubEmail ] . self)
288+ . header ( " Authorization " , " Bearer \( accessToken) " )
289+ . validate ( . statusCodes( [ 200 ] ) )
290+ . send ( )
297291
298292 if let primaryVerifiedEmail = gitHubEmails. first ( where: { $0. primary && $0. verified } ) {
299293 return primaryVerifiedEmail. email
0 commit comments