Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions DevLog/App/Assembler/AppLayerAssembler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ final class AppLayerAssembler: Assembler {
func assemble(_ container: any DIContainer) {
container.register(FCMTokenSyncHandler.self) {
FCMTokenSyncHandler(
repository: container.resolve(UserDataRepository.self)
userService: container.resolve(UserService.self)
)
}
container.register(UserTimeZoneSyncHandler.self) {
UserTimeZoneSyncHandler(
repository: container.resolve(UserDataRepository.self)
userService: container.resolve(UserService.self)
)
}
}
Expand Down
6 changes: 6 additions & 0 deletions DevLog/App/Assembler/DataAssembler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ final class DataAssembler: Assembler {
)
}

container.register(NetworkConnectivityRepository.self) {
NetworkConnectivityRepositoryImpl(
connectivityProvider: container.resolve(NWPathConnectivityProvider.self)
)
}

container.register(AuthDataRepository.self) {
AuthDataRepositoryImpl(
authService: container.resolve(AuthService.self),
Expand Down
13 changes: 11 additions & 2 deletions DevLog/App/Assembler/DomainAssembler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
final class DomainAssembler: Assembler {
func assemble(_ container: DIContainer) {
registerAuthUseCases(container)
registerConnectivityUseCases(container)
registerAuthProviderUseCases(container)
registerTodoUseCases(container)
registerUserDataUseCases(container)
Expand All @@ -31,8 +32,16 @@ private extension DomainAssembler {
DeleteAuthUseCaseImpl(container.resolve(AuthenticationRepository.self))
}

container.register(AuthSessionUseCase.self) {
AuthSessionUseCaseImpl(container.resolve(AuthSessionRepository.self))
container.register(ObserveAuthSessionUseCase.self) {
ObserveAuthSessionUseCaseImpl(container.resolve(AuthSessionRepository.self))
}
}

func registerConnectivityUseCases(_ container: DIContainer) {
container.register(ObserveNetworkConnectivityUseCase.self) {
ObserveNetworkConnectivityUseCaseImpl(
container.resolve(NetworkConnectivityRepository.self)
)
Comment thread
opficdev marked this conversation as resolved.
}
}

Expand Down
3 changes: 3 additions & 0 deletions DevLog/App/Assembler/InfraAssembler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,8 @@ final class InfraAssembler: Assembler {
WebPageMetadataService()
}

container.register(NWPathConnectivityProvider.self) {
NWPathConnectivityProvider()
}
}
}
5 changes: 3 additions & 2 deletions DevLog/App/DevLogApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ struct DevLogApp: App {
var body: some Scene {
WindowGroup {
RootView(viewModel: RootViewModel(
sessionUseCase: container.resolve(AuthSessionUseCase.self),
observeSystemThemeUseCase: container.resolve(ObserveSystemThemeUseCase.self)
sessionUseCase: container.resolve(ObserveAuthSessionUseCase.self),
networkConnectivityUseCase: container.resolve(ObserveNetworkConnectivityUseCase.self),
systemThemeUseCase: container.resolve(ObserveSystemThemeUseCase.self)
))
.autocorrectionDisabled()
}
Expand Down
8 changes: 4 additions & 4 deletions DevLog/App/Handler/FCMTokenSyncHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,22 @@ import Combine
import Foundation

final class FCMTokenSyncHandler {
private let repository: UserDataRepository
private let userService: UserService
private let logger = Logger(category: "FCMTokenSyncHandler")
private var cancellables = Set<AnyCancellable>()

init(
repository: UserDataRepository,
userService: UserService,
notificationCenter: NotificationCenter = .default
) {
self.repository = repository
self.userService = userService

notificationCenter.publisher(for: .didRefreshFCMToken)
.compactMap { $0.userInfo?["fcmToken"] as? String }
.sink { [weak self] fcmToken in
Task {
do {
try await self?.repository.updateFCMToken(fcmToken)
try await self?.userService.updateFCMToken(fcmToken)
} catch {
self?.logger.error("Failed to sync refreshed FCM token", error: error)
}
Expand Down
8 changes: 4 additions & 4 deletions DevLog/App/Handler/UserTimeZoneSyncHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,22 @@ import Combine
import UIKit

final class UserTimeZoneSyncHandler {
private let repository: UserDataRepository
private let userService: UserService
private let logger = Logger(category: "UserTimeZoneSyncHandler")
private var cancellables = Set<AnyCancellable>()

init(
repository: UserDataRepository,
userService: UserService,
notificationCenter: NotificationCenter = .default
) {
self.repository = repository
self.userService = userService

notificationCenter.publisher(for: .didRequestUserTimeZoneSync)
.merge(with: notificationCenter.publisher(for: UIApplication.willEnterForegroundNotification))
.sink { [weak self] _ in
Task {
do {
try await self?.repository.updateUserTimeZone()
try await self?.userService.updateUserTimeZone()
} catch {
self?.logger.error("Failed to sync user timeZone", error: error)
}
Expand Down
4 changes: 2 additions & 2 deletions DevLog/App/RootView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ struct RootView: View {
if let signIn = viewModel.state.signIn {
if signIn {
MainView(viewModel: MainViewModel(
observeUnreadPushCountUseCase: container.resolve(ObserveUnreadPushCountUseCase.self)
unreadPushCountUseCase: container.resolve(ObserveUnreadPushCountUseCase.self)
))
} else {
LoginView(viewModel: LoginViewModel(
Expand Down Expand Up @@ -58,7 +58,7 @@ struct RootView: View {
.presentationDragIndicator(.visible)
}
}
.onReceive(PushNotificationRoute.shared.publisher) { route in
.onReceive(PushNotificationRoute.shared.observe()) { route in
selectedRoute = route
PushNotificationRoute.shared.clear()
}
Expand Down
2 changes: 1 addition & 1 deletion DevLog/App/Routing/PushNotificationRoute.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ enum AppRoute: Equatable, Identifiable {
final class PushNotificationRoute {
static let shared = PushNotificationRoute()

var publisher: AnyPublisher<AppRoute, Never> {
func observe() -> AnyPublisher<AppRoute, Never> {
subject
.compactMap { $0 }
.eraseToAnyPublisher()
Expand Down
4 changes: 2 additions & 2 deletions DevLog/Data/Repository/AuthSessionRepositoryImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ final class AuthSessionRepositoryImpl: AuthSessionRepository {
self.authService = authService
}

var signedInPublisher: AnyPublisher<Bool, Never> {
authService.signedInPublisher
func observeSignedIn() -> AnyPublisher<Bool, Never> {
authService.observeSignedIn()
}
}
20 changes: 20 additions & 0 deletions DevLog/Data/Repository/NetworkConnectivityRepositoryImpl.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// NetworkConnectivityRepositoryImpl.swift
// DevLog
//
// Created by opfic on 3/26/26.
//

import Combine

final class NetworkConnectivityRepositoryImpl: NetworkConnectivityRepository {
private let connectivityProvider: NWPathConnectivityProvider

init(connectivityProvider: NWPathConnectivityProvider) {
self.connectivityProvider = connectivityProvider
}

func observeNetworkConnectivity() -> AnyPublisher<Bool, Never> {
connectivityProvider.observeNetworkConnectivity()
}
}
8 changes: 0 additions & 8 deletions DevLog/Data/Repository/UserDataRepositoryImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,4 @@ final class UserDataRepositoryImpl: UserDataRepository {
func upsertStatusMessage(_ message: String) async throws {
try await userService.upsertStatusMessage(message)
}

func updateFCMToken(_ fcmToken: String) async throws {
try await userService.updateFCMToken(fcmToken)
}

func updateUserTimeZone() async throws {
try await userService.updateUserTimeZone()
}
}
4 changes: 2 additions & 2 deletions DevLog/Data/Repository/UserPreferencesRepositoryImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ final class UserPreferencesRepositoryImpl: UserPreferencesRepository {
themeStore.send(systemTheme())
}

var systemThemePublisher: AnyPublisher<SystemTheme, Never> {
themeStore.themePublisher
func observeSystemTheme() -> AnyPublisher<SystemTheme, Never> {
themeStore.observeTheme()
}

func systemTheme() -> SystemTheme {
Expand Down
2 changes: 1 addition & 1 deletion DevLog/Domain/Protocol/AuthSessionRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
import Combine

protocol AuthSessionRepository {
var signedInPublisher: AnyPublisher<Bool, Never> { get }
func observeSignedIn() -> AnyPublisher<Bool, Never>
}
12 changes: 12 additions & 0 deletions DevLog/Domain/Protocol/NetworkConnectivityRepository.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//
// NetworkConnectivityRepository.swift
// DevLog
//
// Created by opfic on 3/26/26.
//

import Combine

protocol NetworkConnectivityRepository {
func observeNetworkConnectivity() -> AnyPublisher<Bool, Never>
}
2 changes: 0 additions & 2 deletions DevLog/Domain/Protocol/UserDataRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,4 @@
protocol UserDataRepository {
func fetch() async throws -> UserProfile
func upsertStatusMessage(_ message: String) async throws
func updateFCMToken(_ fcmToken: String) async throws
func updateUserTimeZone() async throws
}
2 changes: 1 addition & 1 deletion DevLog/Domain/Protocol/UserPreferencesRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import Foundation
import Combine

protocol UserPreferencesRepository {
var systemThemePublisher: AnyPublisher<SystemTheme, Never> { get }
func observeSystemTheme() -> AnyPublisher<SystemTheme, Never>
func systemTheme() -> SystemTheme
func setSystemTheme(_ theme: SystemTheme)

Expand Down
12 changes: 0 additions & 12 deletions DevLog/Domain/UseCase/Auth/Session/AuthSessionUseCase.swift

This file was deleted.

12 changes: 12 additions & 0 deletions DevLog/Domain/UseCase/Auth/Session/ObserveAuthSessionUseCase.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//
// ObserveAuthSessionUseCase.swift
// DevLog
//
// Created by 최윤진 on 12/31/25.
//

import Combine

protocol ObserveAuthSessionUseCase {
func observe() -> AnyPublisher<Bool, Never>
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
//
// AuthSessionUseCaseImpl.swift
// ObserveAuthSessionUseCaseImpl.swift
// DevLog
//
// Created by 최윤진 on 12/31/25.
//

import Combine

final class AuthSessionUseCaseImpl: AuthSessionUseCase {
final class ObserveAuthSessionUseCaseImpl: ObserveAuthSessionUseCase {
private let repository: AuthSessionRepository

var signedInPublisher: AnyPublisher<Bool, Never> {
repository.signedInPublisher
func observe() -> AnyPublisher<Bool, Never> {
repository.observeSignedIn()
}

init(_ repository: AuthSessionRepository) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//
// ObserveNetworkConnectivityUseCase.swift
// DevLog
//
// Created by opfic on 3/26/26.
//

import Combine

protocol ObserveNetworkConnectivityUseCase {
func observe() -> AnyPublisher<Bool, Never>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// ObserveNetworkConnectivityUseCaseImpl.swift
// DevLog
//
// Created by opfic on 3/26/26.
//

import Combine

final class ObserveNetworkConnectivityUseCaseImpl: ObserveNetworkConnectivityUseCase {
private let repository: NetworkConnectivityRepository

init(_ repository: NetworkConnectivityRepository) {
self.repository = repository
}
Comment thread
opficdev marked this conversation as resolved.

func observe() -> AnyPublisher<Bool, Never> {
repository.observeNetworkConnectivity()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
import Combine

protocol ObserveUnreadPushCountUseCase {
func execute() throws -> AnyPublisher<Int, Error>
func observe() throws -> AnyPublisher<Int, Error>
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ final class ObserveUnreadPushCountUseCaseImpl: ObserveUnreadPushCountUseCase {
self.repository = repository
}

func execute() throws -> AnyPublisher<Int, Error> {
func observe() throws -> AnyPublisher<Int, Error> {
try repository.observeUnreadPushCount()
.removeDuplicates()
.eraseToAnyPublisher()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
import Combine

protocol ObserveSystemThemeUseCase {
var publisher: AnyPublisher<SystemTheme, Never> { get }
func observe() -> AnyPublisher<SystemTheme, Never>
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ final class ObserveSystemThemeUseCaseImpl: ObserveSystemThemeUseCase {
self.repository = repository
}

var publisher: AnyPublisher<SystemTheme, Never> {
repository.systemThemePublisher
func observe() -> AnyPublisher<SystemTheme, Never> {
repository.observeSystemTheme()
}
}
8 changes: 4 additions & 4 deletions DevLog/Infra/Service/AuthService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ final class AuthService {
Auth.auth().currentUser?.uid
}

var signedInPublisher: AnyPublisher<Bool, Never> {
subject.eraseToAnyPublisher()
}

var providerIDs: [String] {
Auth.auth().currentUser?.providerData.map { $0.providerID } ?? []
}
Expand All @@ -42,6 +38,10 @@ final class AuthService {
Auth.auth().removeStateDidChangeListener(handler)
}

func observeSignedIn() -> AnyPublisher<Bool, Never> {
subject.eraseToAnyPublisher()
}

func getProviderID() async throws -> String? {
logger.info("Fetching current provider ID")

Expand Down
Loading