diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 9b9e0fc5..cde3451a 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ 782B407D2C3E3984008B0CA7 /* WelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782B407C2C3E3984008B0CA7 /* WelcomeViewController.swift */; }; 782B407F2C3E44B7008B0CA7 /* WelcomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782B407E2C3E44B7008B0CA7 /* WelcomeViewModel.swift */; }; 782B40822C3E4925008B0CA7 /* NicknameViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782B40812C3E4925008B0CA7 /* NicknameViewModel.swift */; }; + 784824F72C6E1C9900FE07A0 /* AuthServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 784824F62C6E1C9900FE07A0 /* AuthServiceProtocol.swift */; }; 784E4D942C3B1C7F00BC943C /* KakaoSDK in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D932C3B1C7F00BC943C /* KakaoSDK */; }; 784E4D962C3B1C7F00BC943C /* KakaoSDKAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D952C3B1C7F00BC943C /* KakaoSDKAuth */; }; 784E4D992C3B95A900BC943C /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D982C3B95A900BC943C /* KeychainAccess */; }; @@ -246,6 +247,7 @@ 782B407C2C3E3984008B0CA7 /* WelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewController.swift; sourceTree = ""; }; 782B407E2C3E44B7008B0CA7 /* WelcomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewModel.swift; sourceTree = ""; }; 782B40812C3E4925008B0CA7 /* NicknameViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NicknameViewModel.swift; sourceTree = ""; }; + 784824F62C6E1C9900FE07A0 /* AuthServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthServiceProtocol.swift; sourceTree = ""; }; 785AE1D02C3B07A600677CA0 /* PrivacyInfo.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PrivacyInfo.plist; sourceTree = ""; }; 789196332C486F6B00FF8CDF /* KeychainAccessible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainAccessible.swift; sourceTree = ""; }; 789196352C492F8600FF8CDF /* AuthTargetType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthTargetType.swift; sourceTree = ""; }; @@ -530,6 +532,14 @@ path = ViewModel; sourceTree = ""; }; + 784824F52C6E1C6800FE07A0 /* ServiceProtocol */ = { + isa = PBXGroup; + children = ( + 784824F62C6E1C9900FE07A0 /* AuthServiceProtocol.swift */, + ); + path = ServiceProtocol; + sourceTree = ""; + }; 789196392C49697F00FF8CDF /* Auth */ = { isa = PBXGroup; children = ( @@ -1064,6 +1074,7 @@ DD865B652C3920F600C351A2 /* Onboarding */ = { isa = PBXGroup; children = ( + 784824F52C6E1C6800FE07A0 /* ServiceProtocol */, 782B40762C3E389F008B0CA7 /* Welcome */, DDFA50782C4693BD000A62E2 /* Profile */, 78AED1322C3D9514000AD80A /* Nickname */, @@ -1866,6 +1877,7 @@ 789196342C486F6B00FF8CDF /* KeychainAccessible.swift in Sources */, DE254AB02C31195B00A4015E /* NSAttributedString+.swift in Sources */, DD43937B2C412F4500EC1799 /* CreateMeetingViewController.swift in Sources */, + 784824F72C6E1C9900FE07A0 /* AuthServiceProtocol.swift in Sources */, DD86266C2C4606A300E4F980 /* SetReadyInfoViewController.swift in Sources */, DE8247FD2C36E7C7000601BC /* MoyaLoggingPlugin.swift in Sources */, DECB845C2C4442490022A003 /* FindPlaceViewController.swift in Sources */, diff --git a/KkuMulKum/Network/Service/AuthService.swift b/KkuMulKum/Network/Service/AuthService.swift index e96eaff0..a22d2218 100644 --- a/KkuMulKum/Network/Service/AuthService.swift +++ b/KkuMulKum/Network/Service/AuthService.swift @@ -5,15 +5,22 @@ // Created by 이지훈 on 7/14/24. // import Foundation + import Moya -protocol AuthServiceType { - func saveAccessToken(_ token: String) -> Bool - func saveRefreshToken(_ token: String) -> Bool - func getAccessToken() -> String? - func getRefreshToken() -> String? - func clearTokens() -> Bool - func performRequest(_ target: AuthTargetType) async throws -> T +enum NetworkErrorMapper { + static func mapErrorResponse(_ error: ErrorResponse) -> NetworkError { + switch error.code { + case 40080: + return .invalidImageFormat + case 40081: + return .imageSizeExceeded + case 40420: + return .userNotFound + default: + return .apiError(code: error.code, message: error.message) + } + } } class AuthService: AuthServiceType { @@ -26,30 +33,6 @@ class AuthService: AuthServiceType { self.provider = provider } - func saveAccessToken(_ token: String) -> Bool { - keychainService.accessToken = token - return keychainService.accessToken == token - } - - func saveRefreshToken(_ token: String) -> Bool { - keychainService.refreshToken = token - return keychainService.refreshToken == token - } - - func getAccessToken() -> String? { - return keychainService.accessToken - } - - func getRefreshToken() -> String? { - return keychainService.refreshToken - } - - func clearTokens() -> Bool { - keychainService.accessToken = nil - keychainService.refreshToken = nil - return keychainService.accessToken == nil && keychainService.refreshToken == nil - } - func performRequest(_ target: AuthTargetType) async throws -> T { return try await withCheckedThrowingContinuation { continuation in provider.request(target) { result in @@ -61,7 +44,8 @@ class AuthService: AuthServiceType { do { let decodedResponse = try JSONDecoder().decode(ResponseBodyDTO.self, from: response.data) guard decodedResponse.success else { - throw decodedResponse.error.map(self.mapErrorResponse) ?? NetworkError.unknownError("Unknown error occurred") + throw decodedResponse.error.map(NetworkErrorMapper.mapErrorResponse) ?? + NetworkError.unknownError("Unknown error occurred") } guard let data = decodedResponse.data else { if T.self == EmptyModel.self { @@ -78,21 +62,35 @@ class AuthService: AuthServiceType { case .failure(let error): continuation.resume(throwing: NetworkError.networkError(error)) } - + } } } +} + + +extension AuthService { + func saveAccessToken(_ token: String) -> Bool { + keychainService.accessToken = token + return keychainService.accessToken == token + } - private func mapErrorResponse(_ error: ErrorResponse) -> NetworkError { - switch error.code { - case 40080: - return .invalidImageFormat - case 40081: - return .imageSizeExceeded - case 40420: - return .userNotFound - default: - return .apiError(code: error.code, message: error.message) - } + func saveRefreshToken(_ token: String) -> Bool { + keychainService.refreshToken = token + return keychainService.refreshToken == token + } + + func getAccessToken() -> String? { + return keychainService.accessToken + } + + func getRefreshToken() -> String? { + return keychainService.refreshToken + } + + func clearTokens() -> Bool { + keychainService.accessToken = nil + keychainService.refreshToken = nil + return keychainService.accessToken == nil && keychainService.refreshToken == nil } } diff --git a/KkuMulKum/Source/Onboarding/ServiceProtocol/AuthServiceProtocol.swift b/KkuMulKum/Source/Onboarding/ServiceProtocol/AuthServiceProtocol.swift new file mode 100644 index 00000000..5bb64773 --- /dev/null +++ b/KkuMulKum/Source/Onboarding/ServiceProtocol/AuthServiceProtocol.swift @@ -0,0 +1,18 @@ +// +// AuthServiceType.swift +// KkuMulKum +// +// Created by 이지훈 on 8/15/24. +// + +import Foundation + +protocol AuthServiceType { + func saveAccessToken(_ token: String) -> Bool + func saveRefreshToken(_ token: String) -> Bool + func getAccessToken() -> String? + func getRefreshToken() -> String? + func clearTokens() -> Bool + func performRequest(_ target: AuthTargetType) async throws -> T +} +