Skip to content

Commit 443f8c3

Browse files
authored
[#385] Github REST API 호출을 Nexa를 사용하도록 수정한다 (#391)
* refactor: Nexa 라이브러리를 도입해 보일러플레이트 코드 제거 * style: 메서드에서 생성되는 로컬 클라이언트 변수를 한번만 생성하도록 개선
1 parent b1f6985 commit 443f8c3

3 files changed

Lines changed: 49 additions & 37 deletions

File tree

DevLog.xcodeproj/project.pbxproj

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
DFABA3B02E23526500FEFBDB /* FirebaseFirestore in Frameworks */ = {isa = PBXBuildFile; productRef = DFABA3AF2E23526500FEFBDB /* FirebaseFirestore */; };
1616
DFABA3B22E23526500FEFBDB /* FirebaseFunctions in Frameworks */ = {isa = PBXBuildFile; productRef = DFABA3B12E23526500FEFBDB /* FirebaseFunctions */; };
1717
DFABA3B42E23526500FEFBDB /* FirebaseMessaging in Frameworks */ = {isa = PBXBuildFile; productRef = DFABA3B32E23526500FEFBDB /* FirebaseMessaging */; };
18+
DFD3B68D2F8F1FB8001DA7CD /* Nexa in Frameworks */ = {isa = PBXBuildFile; productRef = DFD3B68C2F8F1FB8001DA7CD /* Nexa */; };
1819
DFD645402EC827A10073E133 /* .gitignore in Resources */ = {isa = PBXBuildFile; fileRef = DFD6453F2EC827A10073E133 /* .gitignore */; };
1920
DFD74E2F2E423EA700613803 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = DFD74E2E2E423EA700613803 /* README.md */; };
2021
DFF2DACE2EDC02AD00778738 /* OrderedCollections in Frameworks */ = {isa = PBXBuildFile; productRef = DFF2DACD2EDC02AD00778738 /* OrderedCollections */; };
@@ -76,6 +77,7 @@
7677
isa = PBXFrameworksBuildPhase;
7778
buildActionMask = 2147483647;
7879
files = (
80+
DFD3B68D2F8F1FB8001DA7CD /* Nexa in Frameworks */,
7981
DFABA3B42E23526500FEFBDB /* FirebaseMessaging in Frameworks */,
8082
DFABA3A92E2351EE00FEFBDB /* GoogleSignInSwift in Frameworks */,
8183
DFABA3B22E23526500FEFBDB /* FirebaseFunctions in Frameworks */,
@@ -172,6 +174,7 @@
172174
DFABA3B12E23526500FEFBDB /* FirebaseFunctions */,
173175
DFABA3B32E23526500FEFBDB /* FirebaseMessaging */,
174176
DFF2DACD2EDC02AD00778738 /* OrderedCollections */,
177+
DFD3B68C2F8F1FB8001DA7CD /* Nexa */,
175178
);
176179
productName = SwiftUI_DevLog;
177180
productReference = DFD48B002DC4D6E2005905C5 /* DevLog.app */;
@@ -211,6 +214,7 @@
211214
DFABA3AA2E23526500FEFBDB /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
212215
DF66A07B2EA52E970098E643 /* XCRemoteSwiftPackageReference "SwiftLint" */,
213216
DFF2DACC2EDC02AD00778738 /* XCRemoteSwiftPackageReference "swift-collections" */,
217+
DFD3B68B2F8F1FB8001DA7CD /* XCRemoteSwiftPackageReference "Nexa" */,
214218
);
215219
preferredProjectObjectVersion = 77;
216220
productRefGroup = DFD48B012DC4D6E2005905C5 /* Products */;
@@ -610,6 +614,14 @@
610614
minimumVersion = 11.15.0;
611615
};
612616
};
617+
DFD3B68B2F8F1FB8001DA7CD /* XCRemoteSwiftPackageReference "Nexa" */ = {
618+
isa = XCRemoteSwiftPackageReference;
619+
repositoryURL = "https://github.com/opficdev/Nexa";
620+
requirement = {
621+
kind = upToNextMajorVersion;
622+
minimumVersion = 1.1.0;
623+
};
624+
};
613625
DFF2DACC2EDC02AD00778738 /* XCRemoteSwiftPackageReference "swift-collections" */ = {
614626
isa = XCRemoteSwiftPackageReference;
615627
repositoryURL = "https://github.com/apple/swift-collections.git";
@@ -666,6 +678,11 @@
666678
package = DFABA3AA2E23526500FEFBDB /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
667679
productName = FirebaseMessaging;
668680
};
681+
DFD3B68C2F8F1FB8001DA7CD /* Nexa */ = {
682+
isa = XCSwiftPackageProductDependency;
683+
package = DFD3B68B2F8F1FB8001DA7CD /* XCRemoteSwiftPackageReference "Nexa" */;
684+
productName = Nexa;
685+
};
669686
DFF2DACD2EDC02AD00778738 /* OrderedCollections */ = {
670687
isa = XCSwiftPackageProductDependency;
671688
package = DFF2DACC2EDC02AD00778738 /* XCRemoteSwiftPackageReference "swift-collections" */;

DevLog.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 10 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

DevLog/Infra/Service/SocialLogin/GithubAuthenticationService.swift

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,32 @@ import FirebaseAuth
1111
import FirebaseFirestore
1212
import FirebaseFunctions
1313
import FirebaseMessaging
14+
import Nexa
1415

1516
final 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

Comments
 (0)