From 94067c72242bfd0eddf87b2d980bda72075d32fe Mon Sep 17 00:00:00 2001 From: opficdev Date: Wed, 8 Apr 2026 22:23:44 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=B5=9C=EC=B4=88=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=8B=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=20=EC=B4=88=EA=B8=B0=ED=99=94=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?=ED=9B=84=20=EC=84=B8=EC=85=98=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthenticationRepositoryImpl.swift | 31 +++++++++++++------ DevLog/Infra/Service/AuthService.swift | 30 ++++++++++++++++-- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/DevLog/Data/Repository/AuthenticationRepositoryImpl.swift b/DevLog/Data/Repository/AuthenticationRepositoryImpl.swift index ce02d5d6..a96b2862 100644 --- a/DevLog/Data/Repository/AuthenticationRepositoryImpl.swift +++ b/DevLog/Data/Repository/AuthenticationRepositoryImpl.swift @@ -27,16 +27,29 @@ final class AuthenticationRepositoryImpl: AuthenticationRepository { } func signIn(_ provider: AuthProvider) async throws { - let response: AuthDataResponse - switch provider { - case .apple: - response = try await appleAuthService.signIn() - case .github: - response = try await githubAuthService.signIn() - case .google: - response = try await googleAuthService.signIn() + authService.beginSignIn() + + do { + let response: AuthDataResponse + switch provider { + case .apple: + response = try await appleAuthService.signIn() + case .github: + response = try await githubAuthService.signIn() + case .google: + response = try await googleAuthService.signIn() + } + + try await userService.upsertUser(response) + authService.completeSignIn() + } catch { + if authService.uid != nil { + try? await authService.clearCurrentSession() + } + + authService.cancelSignIn() + throw error } - try await userService.upsertUser(response) } func signOut() async throws { diff --git a/DevLog/Infra/Service/AuthService.swift b/DevLog/Infra/Service/AuthService.swift index e0a27b9a..6b5cd59a 100644 --- a/DevLog/Infra/Service/AuthService.swift +++ b/DevLog/Infra/Service/AuthService.swift @@ -16,6 +16,7 @@ final class AuthService { private let logger = Logger(category: "AuthService") private let subject = CurrentValueSubject(Auth.auth().currentUser != nil) private var handler: AuthStateDidChangeListenerHandle? + private var isCompletingSignIn = false var uid: String? { Auth.auth().currentUser?.uid @@ -27,9 +28,16 @@ final class AuthService { init() { handler = Auth.auth().addStateDidChangeListener { [weak self] _, user in + guard let self else { return } let signedIn = user != nil - self?.logger.info("Firebase auth state changed. signedIn: \(signedIn)") - self?.subject.send(signedIn) + self.logger.info("Firebase auth state changed. signedIn: \(signedIn)") + + if signedIn && self.isCompletingSignIn { + self.logger.info("Delaying signed-in publication until user bootstrap finishes") + return + } + + self.subject.send(signedIn) } } @@ -42,6 +50,24 @@ final class AuthService { subject.eraseToAnyPublisher() } + func beginSignIn() { + logger.info("Beginning sign-in bootstrap") + isCompletingSignIn = true + subject.send(false) + } + + func completeSignIn() { + logger.info("Completing sign-in bootstrap") + isCompletingSignIn = false + subject.send(Auth.auth().currentUser != nil) + } + + func cancelSignIn() { + logger.info("Cancelling sign-in bootstrap") + isCompletingSignIn = false + subject.send(Auth.auth().currentUser != nil) + } + func getProviderID() async throws -> String? { logger.info("Fetching current provider ID")