Skip to content

Commit b2ffa27

Browse files
authored
[#557] 위젯을 새로운 피쳐 모듈 기반으로 분리한다 (#560)
* refactor: 위젯 스냅샷 repository adapter 추가 * refactor: DevLogWidget 모듈 추가 * refactor: 위젯 동기화 handler를 DevLogWidget으로 이동 * docs: 위젯 모듈 아키텍처 문서 갱신 * ci: DevLogWidget 테스트 scheme 추가 * docs: 앱 아키텍쳐 이미지 수정
1 parent 18dbd8b commit b2ffa27

24 files changed

Lines changed: 429 additions & 154 deletions

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,8 @@ jobs:
224224
schemes: "DevLogDomain DevLogData"
225225
- name: Persistence-Presentation
226226
schemes: "DevLogPersistence DevLogPresentation"
227-
- name: WidgetCore
228-
schemes: "DevLogWidgetCore"
227+
- name: Widget
228+
schemes: "DevLogWidget DevLogWidgetCore"
229229
steps:
230230
- uses: actions/checkout@v5
231231

.swiftlint.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ excluded:
99
- Application/DevLogInfra/Project.swift
1010
- Application/DevLogPersistence/Project.swift
1111
- Application/DevLogPresentation/Project.swift
12+
- Application/DevLogWidget/Project.swift
1213
- Widget/DevLogWidgetCore/Project.swift
1314
- Widget/DevLogWidgetExtension/Project.swift
1415

Application/DevLogApp/Project.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ let project = Project(
3434
.project(target: "DevLogPresentation", path: "../DevLogPresentation"),
3535
.project(target: "DevLogPersistence", path: "../DevLogPersistence"),
3636
.project(target: "DevLogInfra", path: "../DevLogInfra"),
37+
.project(target: "DevLogWidget", path: "../DevLogWidget"),
3738
.project(target: "DevLogData", path: "../DevLogData"),
3839
.project(target: "DevLogDomain", path: "../DevLogDomain"),
3940
.project(target: "DevLogCore", path: "../DevLogCore"),

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/DevLogData/Sources/DataAssembler.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ public final class DataAssembler: Assembler {
4545
)
4646
}
4747

48+
container.register(WidgetTodoSnapshotRepository.self) {
49+
WidgetTodoSnapshotRepositoryImpl(
50+
repository: container.resolve(TodoRepository.self)
51+
)
52+
}
53+
4854
container.register(TodoCategoryRepository.self) {
4955
TodoCategoryRepositoryImpl(
5056
todoCategoryService: container.resolve(TodoCategoryService.self)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// WidgetTodoSnapshotRepository.swift
3+
// DevLogData
4+
//
5+
// Created by opfic on 6/8/26.
6+
//
7+
8+
import Foundation
9+
import DevLogCore
10+
11+
public protocol WidgetTodoSnapshotRepository {
12+
func fetchTodayTodos(
13+
dueDateFilter: TodoQuery.DueDateFilter,
14+
sortTarget: TodoQuery.SortTarget,
15+
sortOrder: TodoQuery.SortOrder,
16+
pageSize: Int
17+
) async throws -> [WidgetTodoSnapshot]
18+
19+
func fetchHeatmapTodos(
20+
sortTarget: TodoQuery.SortTarget,
21+
quarterStart: Date,
22+
nextQuarterStart: Date,
23+
pageSize: Int
24+
) async throws -> [WidgetTodoSnapshot]
25+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
//
2+
// WidgetTodoSnapshotRepositoryImpl.swift
3+
// DevLogData
4+
//
5+
// Created by opfic on 6/8/26.
6+
//
7+
8+
import Foundation
9+
import DevLogCore
10+
import DevLogDomain
11+
12+
final class WidgetTodoSnapshotRepositoryImpl: WidgetTodoSnapshotRepository {
13+
private let repository: TodoRepository
14+
15+
init(repository: TodoRepository) {
16+
self.repository = repository
17+
}
18+
19+
func fetchTodayTodos(
20+
dueDateFilter: TodoQuery.DueDateFilter,
21+
sortTarget: TodoQuery.SortTarget,
22+
sortOrder: TodoQuery.SortOrder,
23+
pageSize: Int
24+
) async throws -> [WidgetTodoSnapshot] {
25+
let todoPage = try await repository.fetchTodos(
26+
TodoQuery(
27+
completionFilter: .incomplete,
28+
dueDateFilter: dueDateFilter,
29+
sortTarget: sortTarget,
30+
sortOrder: sortOrder,
31+
pageSize: pageSize,
32+
fetchAllPages: true
33+
),
34+
cursor: nil
35+
)
36+
37+
return todoPage.items.map(WidgetTodoSnapshot.fromDomain)
38+
}
39+
40+
func fetchHeatmapTodos(
41+
sortTarget: TodoQuery.SortTarget,
42+
quarterStart: Date,
43+
nextQuarterStart: Date,
44+
pageSize: Int
45+
) async throws -> [WidgetTodoSnapshot] {
46+
let todoPage = try await repository.fetchTodos(
47+
TodoQuery(
48+
sortDateFrom: quarterStart,
49+
sortDateTo: nextQuarterStart,
50+
includesDeleted: true,
51+
sortTarget: sortTarget,
52+
pageSize: pageSize,
53+
fetchAllPages: true
54+
),
55+
cursor: nil
56+
)
57+
58+
return todoPage.items.map(WidgetTodoSnapshot.fromDomain)
59+
}
60+
}

0 commit comments

Comments
 (0)