Skip to content

Commit c087c2b

Browse files
committed
refactor: 100개 단위로 페이지네이션 형태를 통해 모든 데이터 받아오기
1 parent 31b211a commit c087c2b

3 files changed

Lines changed: 54 additions & 25 deletions

File tree

DevLog/Domain/Entity/TodoQuery.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ struct TodoQuery {
1414
let createdAtFrom: Date?
1515
let createdAtTo: Date?
1616
let createdAtDescending: Bool
17-
let pageSize: Int?
17+
let pageSize: Int
18+
let fetchAllPages: Bool
1819

1920
init(
2021
kind: TodoKind? = nil,
@@ -23,7 +24,8 @@ struct TodoQuery {
2324
createdAtFrom: Date? = nil,
2425
createdAtTo: Date? = nil,
2526
createdAtDescending: Bool = true,
26-
pageSize: Int? = 20
27+
pageSize: Int = 20,
28+
fetchAllPages: Bool = false
2729
) {
2830
self.kind = kind
2931
self.keyword = keyword
@@ -32,5 +34,6 @@ struct TodoQuery {
3234
self.createdAtTo = createdAtTo
3335
self.createdAtDescending = createdAtDescending
3436
self.pageSize = pageSize
37+
self.fetchAllPages = fetchAllPages
3538
}
3639
}

DevLog/Domain/UseCase/UserData/Fetch/Todo/FetchTodosByDateRangeUseCaseImpl.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ final class FetchTodosByDateRangeUseCaseImpl: FetchTodosByDateRangeUseCase {
1818
let query = TodoQuery(
1919
createdAtFrom: startDate,
2020
createdAtTo: endDate,
21-
pageSize: nil
21+
pageSize: 100,
22+
fetchAllPages: true
2223
)
2324
let page = try await repository.fetchTodos(query, cursor: nil)
2425
return page.items

DevLog/Infra/Service/TodoService.swift

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ final class TodoService {
2727
query.isPinned != nil ? "pinned=\(query.isPinned!)" : nil,
2828
query.createdAtFrom != nil ? "createdAtFrom=\(query.createdAtFrom!)" : nil,
2929
query.createdAtTo != nil ? "createdAtTo=\(query.createdAtTo!)" : nil,
30-
query.pageSize != nil ? "pageSize=\(query.pageSize!)" : nil,
30+
"pageSize=\(query.pageSize)",
31+
query.fetchAllPages ? "fetchAllPages=true" : nil,
3132
cursor != nil ? "cursor=\(cursor!)" : nil
3233
]
3334
logger.info("Fetching todo page: \(logComponents.compactMap { $0 }.joined(separator: ", "))")
@@ -60,36 +61,49 @@ final class TodoService {
6061
}
6162

6263
if trimmedKeyword.isEmpty {
64+
if query.fetchAllPages {
65+
var allItems: [TodoResponse] = []
66+
var pageCursor = cursor
67+
68+
while true {
69+
var pageQuery = firestoreQuery
70+
if let pageCursor {
71+
pageQuery = pageQuery.start(after: [
72+
Timestamp(date: pageCursor.createdAt),
73+
pageCursor.documentID
74+
])
75+
}
76+
77+
pageQuery = pageQuery.limit(to: query.pageSize)
78+
let snapshot = try await pageQuery.getDocuments()
79+
allItems.append(contentsOf: snapshot.documents.compactMap { makeResponse(from: $0) })
80+
81+
guard snapshot.documents.count == query.pageSize else {
82+
break
83+
}
84+
85+
guard let lastDocument = snapshot.documents.last,
86+
let nextCursor = makeCursor(from: lastDocument) else {
87+
break
88+
}
89+
90+
pageCursor = nextCursor
91+
}
92+
93+
return TodoPageResponse(items: allItems, nextCursor: nil)
94+
}
95+
6396
if let cursor {
6497
firestoreQuery = firestoreQuery.start(after: [
6598
Timestamp(date: cursor.createdAt),
6699
cursor.documentID
67100
])
68101
}
69102

70-
if let pageSize = query.pageSize {
71-
firestoreQuery = firestoreQuery.limit(to: pageSize)
72-
}
73-
103+
firestoreQuery = firestoreQuery.limit(to: query.pageSize)
74104
let snapshot = try await firestoreQuery.getDocuments()
75-
76105
let items = snapshot.documents.compactMap { makeResponse(from: $0) }
77-
78-
let nextCursor: TodoCursorDTO?
79-
if query.pageSize == nil {
80-
nextCursor = nil
81-
} else {
82-
nextCursor = snapshot.documents.last.flatMap { document in
83-
guard let createdAt = document.data()[TodoFieldKey.createdAt.rawValue] as? Timestamp else {
84-
return nil
85-
}
86-
87-
return TodoCursorDTO(
88-
createdAt: createdAt.dateValue(),
89-
documentID: document.documentID
90-
)
91-
}
92-
}
106+
let nextCursor = snapshot.documents.last.flatMap { makeCursor(from: $0) }
93107

94108
return TodoPageResponse(items: items, nextCursor: nextCursor)
95109
}
@@ -167,6 +181,17 @@ final class TodoService {
167181
}
168182

169183
private extension TodoService {
184+
func makeCursor(from document: QueryDocumentSnapshot) -> TodoCursorDTO? {
185+
guard let createdAt = document.data()[TodoFieldKey.createdAt.rawValue] as? Timestamp else {
186+
return nil
187+
}
188+
189+
return TodoCursorDTO(
190+
createdAt: createdAt.dateValue(),
191+
documentID: document.documentID
192+
)
193+
}
194+
170195
func makeResponse(from snapshot: QueryDocumentSnapshot) -> TodoResponse? {
171196
makeResponse(documentID: snapshot.documentID, data: snapshot.data())
172197
}

0 commit comments

Comments
 (0)