Skip to content

Commit 1acf721

Browse files
committed
refactor: 위젯 동기화 handler를 DevLogWidget으로 이동
1 parent 378e289 commit 1acf721

11 files changed

Lines changed: 142 additions & 141 deletions

Application/DevLogApp/Sources/App/Assembler/AppAssembler.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ import DevLogData
1010
import DevLogDomain
1111
import DevLogInfra
1212
import DevLogPersistence
13+
import DevLogWidget
1314

1415
final class AppAssembler: Assembler {
1516
private let assemblers: [Assembler] = [
1617
PersistenceAssembler(),
1718
InfraAssembler(),
19+
WidgetAssembler(),
1820
DataAssembler(),
1921
DomainAssembler(),
2022
AppLayerAssembler()

Application/DevLogApp/Sources/App/Assembler/AppLayerAssembler.swift

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,9 @@
77

88
import DevLogCore
99
import DevLogData
10-
import DevLogDomain
1110

1211
final class AppLayerAssembler: Assembler {
1312
func assemble(_ container: any DIContainer) {
14-
container.register(WidgetSyncEventBus.self) {
15-
WidgetSyncEventBusImpl()
16-
}
17-
container.register(WidgetSyncEventHandler.self) {
18-
WidgetSyncEventHandler(
19-
eventBus: container.resolve(WidgetSyncEventBus.self),
20-
repository: container.resolve(TodoRepository.self),
21-
snapshotUpdater: container.resolve(WidgetSnapshotUpdater.self)
22-
)
23-
}
24-
container.register(WidgetSessionSyncHandler.self) {
25-
WidgetSessionSyncHandler(
26-
authService: container.resolve(AuthService.self),
27-
widgetSyncEventBus: container.resolve(WidgetSyncEventBus.self)
28-
)
29-
}
3013
container.register(FCMTokenSyncHandler.self) {
3114
FCMTokenSyncHandler(
3215
userService: container.resolve(UserService.self)

Application/DevLogApp/Sources/App/Delegate/AppDelegate.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import UIKit
99
import DevLogCore
1010
import DevLogData
1111
import DevLogInfra
12+
import DevLogWidget
1213

1314
class AppDelegate: UIResponder, UIApplicationDelegate {
1415
private let logger = Logger(category: "AppDelegate")

Application/DevLogApp/Sources/App/DevLogApp.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import DevLogCore
1010
import DevLogData
1111
import DevLogDomain
1212
import DevLogPresentation
13+
import DevLogWidget
1314

1415
@main
1516
struct DevLogApp: App {

Application/DevLogApp/Sources/App/Handler/WidgetSessionSyncHandler.swift renamed to Application/DevLogWidget/Sources/Handler/WidgetSessionSyncHandler.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//
22
// WidgetSessionSyncHandler.swift
3-
// DevLog
3+
// DevLogWidget
44
//
55
// Created by opfic on 6/1/26.
66
//
@@ -9,13 +9,13 @@ import Combine
99
import Foundation
1010
import DevLogData
1111

12-
final class WidgetSessionSyncHandler {
12+
public final class WidgetSessionSyncHandler {
1313
private let authService: AuthService
1414
private let widgetSyncEventBus: WidgetSyncEventBus
1515
private var hasRequestedWidgetSync = false
1616
private var cancellables = Set<AnyCancellable>()
1717

18-
init(
18+
public init(
1919
authService: AuthService,
2020
widgetSyncEventBus: WidgetSyncEventBus
2121
) {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// WidgetAssembler.swift
3+
// DevLogWidget
4+
//
5+
// Created by opfic on 6/8/26.
6+
//
7+
8+
import DevLogCore
9+
import DevLogData
10+
11+
public final class WidgetAssembler: Assembler {
12+
public init() { }
13+
14+
public func assemble(_ container: any DIContainer) {
15+
container.register(WidgetSyncEventBus.self) {
16+
WidgetSyncEventBusImpl()
17+
}
18+
container.register(WidgetSyncEventHandler.self) {
19+
WidgetSyncEventHandler(
20+
eventBus: container.resolve(WidgetSyncEventBus.self),
21+
repository: container.resolve(WidgetTodoSnapshotRepository.self),
22+
snapshotUpdater: container.resolve(WidgetSnapshotUpdater.self)
23+
)
24+
}
25+
container.register(WidgetSessionSyncHandler.self) {
26+
WidgetSessionSyncHandler(
27+
authService: container.resolve(AuthService.self),
28+
widgetSyncEventBus: container.resolve(WidgetSyncEventBus.self)
29+
)
30+
}
31+
}
32+
}

Application/DevLogData/Sources/Widget/WidgetSyncEventBusImpl.swift renamed to Application/DevLogWidget/Sources/Widget/WidgetSyncEventBusImpl.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
//
22
// WidgetSyncEventBusImpl.swift
3-
// DevLogData
3+
// DevLogWidget
44
//
55
// Created by opfic on 4/30/26.
66
//
77

88
import Combine
9+
import DevLogData
910

1011
public final class WidgetSyncEventBusImpl: WidgetSyncEventBus {
1112
private let subject = PassthroughSubject<WidgetSyncEvent, Never>()

Application/DevLogData/Sources/Widget/WidgetSyncEventHandler.swift renamed to Application/DevLogWidget/Sources/Widget/WidgetSyncEventHandler.swift

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
//
22
// WidgetSyncEventHandler.swift
3-
// DevLogData
3+
// DevLogWidget
44
//
55
// Created by opfic on 4/30/26.
66
//
77

88
import Combine
99
import Foundation
1010
import DevLogCore
11-
import DevLogDomain
11+
import DevLogData
1212

1313
public final class WidgetSyncEventHandler {
14-
private let repository: TodoRepository
14+
private let repository: WidgetTodoSnapshotRepository
1515
private let snapshotUpdater: WidgetSnapshotUpdater
1616
private let pageSize = 100
1717
private let logger = Logger(category: "WidgetSyncEventHandler")
1818
private var cancellables = Set<AnyCancellable>()
1919

2020
public init(
2121
eventBus: WidgetSyncEventBus,
22-
repository: TodoRepository,
22+
repository: WidgetTodoSnapshotRepository,
2323
snapshotUpdater: WidgetSnapshotUpdater
2424
) {
2525
self.repository = repository
@@ -64,7 +64,7 @@ private extension WidgetSyncEventHandler {
6464
todosWithoutDueDate
6565
)
6666
snapshotUpdater.updateTodaySnapshot(
67-
todos: (todayTodosWithDueDate + todayTodosWithoutDueDate).map(WidgetTodoSnapshot.fromDomain),
67+
todos: todayTodosWithDueDate + todayTodosWithoutDueDate,
6868
now: now
6969
)
7070
} catch {
@@ -103,9 +103,9 @@ private extension WidgetSyncEventHandler {
103103
deletedTodos
104104
)
105105
snapshotUpdater.updateHeatmapSnapshot(
106-
createdTodos: createdTodoItems.map(WidgetTodoSnapshot.fromDomain),
107-
completedTodos: completedTodoItems.map(WidgetTodoSnapshot.fromDomain),
108-
deletedTodos: deletedTodoItems.map(WidgetTodoSnapshot.fromDomain),
106+
createdTodos: createdTodoItems,
107+
completedTodos: completedTodoItems,
108+
deletedTodos: deletedTodoItems,
109109
quarterStart: quarterStart,
110110
now: now
111111
)
@@ -121,39 +121,25 @@ private extension WidgetSyncEventHandler {
121121
dueDateFilter: TodoQuery.DueDateFilter,
122122
sortTarget: TodoQuery.SortTarget,
123123
sortOrder: TodoQuery.SortOrder
124-
) async throws -> [Todo] {
125-
let todoPage = try await repository.fetchTodos(
126-
TodoQuery(
127-
completionFilter: .incomplete,
128-
dueDateFilter: dueDateFilter,
129-
sortTarget: sortTarget,
130-
sortOrder: sortOrder,
131-
pageSize: pageSize,
132-
fetchAllPages: true
133-
),
134-
cursor: nil
124+
) async throws -> [WidgetTodoSnapshot] {
125+
try await repository.fetchTodayTodos(
126+
dueDateFilter: dueDateFilter,
127+
sortTarget: sortTarget,
128+
sortOrder: sortOrder,
129+
pageSize: pageSize
135130
)
136-
137-
return todoPage.items
138131
}
139132

140133
func fetchHeatmapTodos(
141134
sortTarget: TodoQuery.SortTarget,
142135
quarterStart: Date,
143136
nextQuarterStart: Date
144-
) async throws -> [Todo] {
145-
let todoPage = try await repository.fetchTodos(
146-
TodoQuery(
147-
sortDateFrom: quarterStart,
148-
sortDateTo: nextQuarterStart,
149-
includesDeleted: true,
150-
sortTarget: sortTarget,
151-
pageSize: pageSize,
152-
fetchAllPages: true
153-
),
154-
cursor: nil
137+
) async throws -> [WidgetTodoSnapshot] {
138+
try await repository.fetchHeatmapTodos(
139+
sortTarget: sortTarget,
140+
quarterStart: quarterStart,
141+
nextQuarterStart: nextQuarterStart,
142+
pageSize: pageSize
155143
)
156-
157-
return todoPage.items
158144
}
159145
}

Application/DevLogApp/Tests/App/WidgetSessionSyncHandlerTests.swift renamed to Application/DevLogWidget/Tests/Handler/WidgetSessionSyncHandlerTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//
22
// WidgetSessionSyncHandlerTests.swift
3-
// DevLogAppTests
3+
// DevLogWidgetTests
44
//
55
// Created by opfic on 6/1/26.
66
//
@@ -9,7 +9,7 @@ import Combine
99
import Foundation
1010
import Testing
1111
import DevLogData
12-
@testable import DevLogApp
12+
@testable import DevLogWidget
1313

1414
struct WidgetSessionSyncHandlerTests {
1515
@Test("로그인 세션 true 첫 진입에서만 위젯 초기 동기화를 요청한다")

Application/DevLogData/Tests/Widget/WidgetSyncEventBusTests.swift renamed to Application/DevLogWidget/Tests/Widget/WidgetSyncEventBusTests.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
//
22
// WidgetSyncEventBusTests.swift
3-
// DevLogDataTests
3+
// DevLogWidgetTests
44
//
55
// Created by opfic on 4/30/26.
66
//
77

88
import Combine
99
import Testing
10-
@testable import DevLogData
10+
import DevLogData
11+
@testable import DevLogWidget
1112

1213
struct WidgetSyncEventBusTests {
1314
@Test("WidgetSyncEventBus는 발행된 이벤트를 관찰자에게 전달한다")

0 commit comments

Comments
 (0)