Skip to content

Commit d2a13c1

Browse files
committed
refactor: 시간대를 저장하는 기능 역시 동일한 형태로 재구성
1 parent da1095b commit d2a13c1

8 files changed

Lines changed: 76 additions & 24 deletions

File tree

DevLog/App/Assembler/AppLayerAssembler.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ final class AppLayerAssembler: Assembler {
99
func assemble(_ container: any DIContainer) {
1010
container.register(FCMTokenSyncHandler.self) {
1111
FCMTokenSyncHandler(
12-
userDataRepository: container.resolve(UserDataRepository.self)
12+
repository: container.resolve(UserDataRepository.self)
13+
)
14+
}
15+
container.register(UserTimeZoneSyncHandler.self) {
16+
UserTimeZoneSyncHandler(
17+
repository: container.resolve(UserDataRepository.self)
1318
)
1419
}
1520
}

DevLog/App/Delegate/AppDelegate.swift

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77

88
import UIKit
99
import Firebase
10-
import FirebaseAuth
1110
import GoogleSignIn
1211

1312
class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate {
1413
private let logger = Logger(category: "AppDelegate")
14+
private let container = AppDIContainer.shared
1515

1616
func application(
1717
_ app: UIApplication,
@@ -26,8 +26,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate {
2626
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
2727
) -> Bool {
2828
FirebaseApp.configure()
29-
_ = AppDIContainer.shared.resolve(FCMTokenSyncHandler.self)
30-
29+
_ = container.resolve(FCMTokenSyncHandler.self)
30+
_ = container.resolve(UserTimeZoneSyncHandler.self)
31+
3132
// 알림 권한 요청
3233
UNUserNotificationCenter.current().delegate = self
3334
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
@@ -42,7 +43,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate {
4243
}
4344

4445
// 앱이 온그라운드로 되었을 때, 로그인 세션이 존재한다면 현재 유저의 timeZone 저장
45-
updateUserTimeZone()
46+
NotificationCenter.default.post(name: .didRequestUserTimeZoneSync, object: nil)
4647

4748
// Firebase Messaging 설정
4849
Messaging.messaging().delegate = self
@@ -88,21 +89,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate {
8889
}
8990
}
9091

91-
private extension AppDelegate {
92-
func updateUserTimeZone() {
93-
Task {
94-
do {
95-
guard let uid = Auth.auth().currentUser?.uid else { return }
96-
let settingsRef = Firestore.firestore().document("users/\(uid)/userData/settings")
97-
98-
try await settingsRef.setData(["timeZone": TimeZone.autoupdatingCurrent.identifier], merge: true)
99-
} catch {
100-
logger.error("Failed to update timeZone", error: error)
101-
}
102-
}
103-
}
104-
}
105-
10692
extension AppDelegate: UNUserNotificationCenterDelegate {
10793
// 앱이 포그라운드에 있을 때 알림 표시
10894
func userNotificationCenter(

DevLog/App/FCMTokenSyncHandler.swift renamed to DevLog/App/Handler/FCMTokenSyncHandler.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,22 @@ import Combine
99
import Foundation
1010

1111
final class FCMTokenSyncHandler {
12-
private let userDataRepository: UserDataRepository
12+
private let repository: UserDataRepository
1313
private let logger = Logger(category: "FCMTokenSyncHandler")
1414
private var cancellables = Set<AnyCancellable>()
1515

1616
init(
17-
userDataRepository: UserDataRepository,
17+
repository: UserDataRepository,
1818
notificationCenter: NotificationCenter = .default
1919
) {
20-
self.userDataRepository = userDataRepository
20+
self.repository = repository
2121

2222
notificationCenter.publisher(for: .didRefreshFCMToken)
2323
.compactMap { $0.userInfo?["fcmToken"] as? String }
2424
.sink { [weak self] fcmToken in
2525
Task {
2626
do {
27-
try await self?.userDataRepository.updateFCMToken(fcmToken)
27+
try await self?.repository.updateFCMToken(fcmToken)
2828
} catch {
2929
self?.logger.error("Failed to sync refreshed FCM token", error: error)
3030
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//
2+
// UserTimeZoneSyncHandler.swift
3+
// DevLog
4+
//
5+
// Created by opfic on 3/19/26.
6+
//
7+
8+
import Combine
9+
import Foundation
10+
11+
final class UserTimeZoneSyncHandler {
12+
private let repository: UserDataRepository
13+
private let logger = Logger(category: "UserTimeZoneSyncHandler")
14+
private var cancellables = Set<AnyCancellable>()
15+
16+
init(
17+
repository: UserDataRepository,
18+
notificationCenter: NotificationCenter = .default
19+
) {
20+
self.repository = repository
21+
22+
notificationCenter.publisher(for: .didRequestUserTimeZoneSync)
23+
.sink { [weak self] _ in
24+
Task {
25+
do {
26+
try await self?.repository.updateUserTimeZone()
27+
} catch {
28+
self?.logger.error("Failed to sync user timeZone", error: error)
29+
}
30+
}
31+
}
32+
.store(in: &cancellables)
33+
}
34+
}

DevLog/App/Notification/NotificationName+.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ import Foundation
99

1010
extension Notification.Name {
1111
static let didRefreshFCMToken = Notification.Name("didRefreshFCMToken")
12+
static let didRequestUserTimeZoneSync = Notification.Name("didRequestUserTimeZoneSync")
1213
}

DevLog/Data/Repository/UserDataRepositoryImpl.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,8 @@ final class UserDataRepositoryImpl: UserDataRepository {
2525
func updateFCMToken(_ fcmToken: String) async throws {
2626
try await userService.updateFCMToken(fcmToken)
2727
}
28+
29+
func updateUserTimeZone() async throws {
30+
try await userService.updateUserTimeZone()
31+
}
2832
}

DevLog/Domain/Protocol/UserDataRepository.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ protocol UserDataRepository {
99
func fetch() async throws -> UserProfile
1010
func upsertStatusMessage(_ message: String) async throws
1111
func updateFCMToken(_ fcmToken: String) async throws
12+
func updateUserTimeZone() async throws
1213
}

DevLog/Infra/Service/UserService.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,25 @@ final class UserService {
162162
throw error
163163
}
164164
}
165+
166+
func updateUserTimeZone() async throws {
167+
guard let userId = Auth.auth().currentUser?.uid else {
168+
logger.info("Skipping timeZone update because no authenticated user exists")
169+
return
170+
}
171+
172+
logger.info("Updating timeZone for user: \(userId)")
173+
174+
do {
175+
let settingsRef = store.document("users/\(userId)/userData/settings")
176+
try await settingsRef.setData(
177+
["timeZone": TimeZone.autoupdatingCurrent.identifier],
178+
merge: true
179+
)
180+
logger.info("Successfully updated timeZone")
181+
} catch {
182+
logger.error("Failed to update timeZone", error: error)
183+
throw error
184+
}
185+
}
165186
}

0 commit comments

Comments
 (0)