@@ -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
169183private 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