Skip to content

Commit a9d8480

Browse files
authored
[#160] TodoListView에서 정렬 및 필터 옵션을 스티키 헤더로 재구성하고 description에 있는 데로 옵션을 수정한다 (#165)
* ui: 스티키 헤더로 정렬, 필터링 옵션을 위치시킨다 * refactor: Todo 여러개 가져올 수 있는 유즈케이스를 쿼리를 통해 fetch하도록 병합
1 parent 30dcaf4 commit a9d8480

25 files changed

Lines changed: 442 additions & 340 deletions

DevLog/App/Assembler/DomainAssembler.swift

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,24 +51,12 @@ private extension DomainAssembler {
5151
}
5252

5353
func registerTodoUseCases(_ container: DIContainer) {
54-
container.register(FetchPinnedTodosUseCase.self) {
55-
FetchPinnedTodosUseCaseImpl(container.resolve(TodoRepository.self))
56-
}
57-
5854
container.register(FetchTodoByIDUseCase.self) {
5955
FetchTodoByIDUseCaseImpl(container.resolve(TodoRepository.self))
6056
}
6157

62-
container.register(FetchTodosByKindUseCase.self) {
63-
FetchTodosByKindUseCaseImpl(container.resolve(TodoRepository.self))
64-
}
65-
66-
container.register(FetchTodosByDateRangeUseCase.self) {
67-
FetchTodosByDateRangeUseCaseImpl(container.resolve(TodoRepository.self))
68-
}
69-
70-
container.register(FetchTodosByKeywordUseCase.self) {
71-
FetchTodosByKeywordUseCaseImpl(container.resolve(TodoRepository.self))
58+
container.register(FetchTodosUseCase.self) {
59+
FetchTodosUseCaseImpl(container.resolve(TodoRepository.self))
7260
}
7361

7462
container.register(UpsertTodoUseCase.self) {

DevLog/Data/DTO/TodoCursorDTO.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
import Foundation
99

1010
struct TodoCursorDTO {
11-
let createdAt: Date
11+
let orderedAt: Date
1212
let documentID: String
1313
}

DevLog/Data/Mapper/TodoMapping.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,14 @@ extension TodoResponse {
5050
extension TodoCursorDTO {
5151
func toDomain() -> TodoCursor {
5252
TodoCursor(
53-
createdAt: createdAt,
53+
orderedAt: orderedAt,
5454
documentID: documentID
5555
)
5656
}
5757

5858
static func fromDomain(_ cursor: TodoCursor) -> Self {
5959
TodoCursorDTO(
60-
createdAt: cursor.createdAt,
60+
orderedAt: cursor.orderedAt,
6161
documentID: cursor.documentID
6262
)
6363
}

DevLog/Domain/Entity/TodoCursor.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
import Foundation
99

1010
struct TodoCursor {
11-
let createdAt: Date
11+
let orderedAt: Date
1212
let documentID: String
1313
}

DevLog/Domain/Entity/TodoQuery.swift

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,77 @@
88
import Foundation
99

1010
struct TodoQuery {
11-
let kind: TodoKind?
12-
let keyword: String?
13-
let isPinned: Bool?
14-
let createdAtFrom: Date?
15-
let createdAtTo: Date?
16-
let createdAtDescending: Bool
17-
let pageSize: Int
18-
let fetchAllPages: Bool
11+
enum SortTarget: Equatable, Hashable {
12+
case createdAt
13+
case updatedAt
14+
15+
var fieldName: String {
16+
switch self {
17+
case .createdAt:
18+
return "createdAt"
19+
case .updatedAt:
20+
return "updatedAt"
21+
}
22+
}
23+
}
24+
25+
enum SortOrder: Equatable, Hashable {
26+
case latest
27+
case oldest
28+
29+
var isDescending: Bool {
30+
self == .latest
31+
}
32+
}
33+
34+
enum CompletionFilter: Equatable, Hashable {
35+
case all
36+
case incomplete
37+
case completed
38+
39+
var isCompletedValue: Bool? {
40+
switch self {
41+
case .all:
42+
return nil
43+
case .incomplete:
44+
return false
45+
case .completed:
46+
return true
47+
}
48+
}
49+
}
50+
51+
var kind: TodoKind?
52+
var keyword: String?
53+
var isPinned: Bool?
54+
var completionFilter: CompletionFilter
55+
var createdAtFrom: Date?
56+
var createdAtTo: Date?
57+
var sortTarget: SortTarget
58+
var sortOrder: SortOrder
59+
var pageSize: Int
60+
var fetchAllPages: Bool
1961

2062
init(
2163
kind: TodoKind? = nil,
2264
keyword: String? = nil,
2365
isPinned: Bool? = nil,
66+
completionFilter: CompletionFilter = .all,
2467
createdAtFrom: Date? = nil,
2568
createdAtTo: Date? = nil,
26-
createdAtDescending: Bool = true,
69+
sortTarget: SortTarget = .createdAt,
70+
sortOrder: SortOrder = .latest,
2771
pageSize: Int = 20,
2872
fetchAllPages: Bool = false
2973
) {
3074
self.kind = kind
3175
self.keyword = keyword
3276
self.isPinned = isPinned
77+
self.completionFilter = completionFilter
3378
self.createdAtFrom = createdAtFrom
3479
self.createdAtTo = createdAtTo
35-
self.createdAtDescending = createdAtDescending
80+
self.sortTarget = sortTarget
81+
self.sortOrder = sortOrder
3682
self.pageSize = pageSize
3783
self.fetchAllPages = fetchAllPages
3884
}

DevLog/Domain/UseCase/Todo/Fetch/FetchPinnedTodosUseCase.swift

Lines changed: 0 additions & 10 deletions
This file was deleted.

DevLog/Domain/UseCase/Todo/Fetch/FetchPinnedTodosUseCaseImpl.swift

Lines changed: 0 additions & 20 deletions
This file was deleted.

DevLog/Domain/UseCase/Todo/Fetch/FetchTodosByKeywordUseCase.swift

Lines changed: 0 additions & 10 deletions
This file was deleted.

DevLog/Domain/UseCase/Todo/Fetch/FetchTodosByKeywordUseCaseImpl.swift

Lines changed: 0 additions & 20 deletions
This file was deleted.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//
2+
// FetchTodosUseCase.swift
3+
// DevLog
4+
//
5+
// Created by opfic on 3/3/26.
6+
//
7+
8+
protocol FetchTodosUseCase {
9+
func execute(_ query: TodoQuery, cursor: TodoCursor?) async throws -> TodoPage
10+
}

0 commit comments

Comments
 (0)