@@ -21,10 +21,12 @@ final class TodoService {
2121
2222 let trimmedKeyword = query. keyword? . trimmingCharacters ( in: . whitespacesAndNewlines) ?? " "
2323 let logComponents : [ String ? ] = [
24- " createdAtDescending= \( query. createdAtDescending) " ,
24+ " sortTarget= \( query. sortTarget. fieldName) " ,
25+ " sortOrder= \( query. sortOrder == . latest ? " latest " : " oldest " ) " ,
2526 query. keyword != nil ? " keywordLength= \( trimmedKeyword. count) " : nil ,
2627 query. kind != nil ? " kind= \( query. kind!. rawValue) " : nil ,
2728 query. isPinned != nil ? " pinned= \( query. isPinned!) " : nil ,
29+ query. completionFilter. isCompletedValue != nil ? " completed= \( query. completionFilter. isCompletedValue!) " : nil ,
2830 query. createdAtFrom != nil ? " createdAtFrom= \( query. createdAtFrom!) " : nil ,
2931 query. createdAtTo != nil ? " createdAtTo= \( query. createdAtTo!) " : nil ,
3032 " pageSize= \( query. pageSize) " ,
@@ -35,7 +37,7 @@ final class TodoService {
3537
3638 var firestoreQuery : Query = store
3739 . collection ( " users/ \( uid) /todoLists/ " )
38- . order ( by: " createdAt " , descending: query. createdAtDescending )
40+ . order ( by: query . sortTarget . fieldName , descending: query. sortOrder . isDescending )
3941 . order ( by: FieldPath . documentID ( ) )
4042
4143 if let kind = query. kind {
@@ -46,6 +48,10 @@ final class TodoService {
4648 firestoreQuery = firestoreQuery. whereField ( " isPinned " , isEqualTo: isPinned)
4749 }
4850
51+ if let isCompleted = query. completionFilter. isCompletedValue {
52+ firestoreQuery = firestoreQuery. whereField ( " isCompleted " , isEqualTo: isCompleted)
53+ }
54+
4955 if let createdAtFrom = query. createdAtFrom {
5056 firestoreQuery = firestoreQuery. whereField (
5157 " createdAt " ,
@@ -69,7 +75,7 @@ final class TodoService {
6975 var pageQuery = firestoreQuery
7076 if let pageCursor {
7177 pageQuery = pageQuery. start ( after: [
72- Timestamp ( date: pageCursor. createdAt ) ,
78+ Timestamp ( date: pageCursor. orderedAt ) ,
7379 pageCursor. documentID
7480 ] )
7581 }
@@ -83,7 +89,10 @@ final class TodoService {
8389 }
8490
8591 guard let lastDocument = snapshot. documents. last,
86- let nextCursor = makeCursor ( from: lastDocument) else {
92+ let nextCursor = makeCursor (
93+ from: lastDocument,
94+ orderField: query. sortTarget. fieldName
95+ ) else {
8796 break
8897 }
8998
@@ -95,15 +104,17 @@ final class TodoService {
95104
96105 if let cursor {
97106 firestoreQuery = firestoreQuery. start ( after: [
98- Timestamp ( date: cursor. createdAt ) ,
107+ Timestamp ( date: cursor. orderedAt ) ,
99108 cursor. documentID
100109 ] )
101110 }
102111
103112 firestoreQuery = firestoreQuery. limit ( to: query. pageSize)
104113 let snapshot = try await firestoreQuery. getDocuments ( )
105114 let items = snapshot. documents. compactMap { makeResponse ( from: $0) }
106- let nextCursor = snapshot. documents. last. flatMap { makeCursor ( from: $0) }
115+ let nextCursor = snapshot. documents. last. flatMap {
116+ makeCursor ( from: $0, orderField: query. sortTarget. fieldName)
117+ }
107118
108119 return TodoPageResponse ( items: items, nextCursor: nextCursor)
109120 }
@@ -184,13 +195,16 @@ final class TodoService {
184195}
185196
186197private extension TodoService {
187- func makeCursor( from document: QueryDocumentSnapshot ) -> TodoCursorDTO ? {
188- guard let createdAt = document. data ( ) [ TodoFieldKey . createdAt. rawValue] as? Timestamp else {
198+ func makeCursor(
199+ from document: QueryDocumentSnapshot ,
200+ orderField: String
201+ ) -> TodoCursorDTO ? {
202+ guard let orderedAt = document. data ( ) [ orderField] as? Timestamp else {
189203 return nil
190204 }
191205
192206 return TodoCursorDTO (
193- createdAt : createdAt . dateValue ( ) ,
207+ orderedAt : orderedAt . dateValue ( ) ,
194208 documentID: document. documentID
195209 )
196210 }
0 commit comments