@@ -59,8 +59,35 @@ final class TodoRepositoryImpl: TodoRepository {
5959 return try resolve ( todoResponse, userTodoCategories: userTodoCategories) . toDomain ( )
6060 }
6161
62- func fetchReferenceItems( _ numbers: [ Int ] ) async throws -> [ Int : TodoReferenceItem ] {
63- try await todoService. fetchReferenceItems ( numbers)
62+ func fetchReferences( _ numbers: [ Int ] ) async throws -> [ Int : TodoReference ] {
63+ async let responseTask = todoService. fetchReferences ( numbers)
64+ async let preferencesTask = todoCategoryService. fetchPreferences ( )
65+
66+ let ( responses, preferences) = try await ( responseTask, preferencesTask)
67+ let userTodoCategories : [ UserTodoCategory ] = preferences. compactMap { preference in
68+ guard case . user( let category) = preference. category else {
69+ return nil
70+ }
71+
72+ return category
73+ }
74+
75+ return try responses. reduce ( into: [ Int: TodoReference] ( ) ) { partialResult, pair in
76+ let response = try resolve ( pair. value, userTodoCategories: userTodoCategories)
77+ let category : TodoCategory
78+ switch response. category {
79+ case . decoded( let decodedCategory) :
80+ category = decodedCategory
81+ case . raw( let value) :
82+ throw DataError . invalidData ( " TodoReferenceResponse.category is invalid: \( value) " )
83+ }
84+
85+ partialResult [ pair. key] = TodoReference (
86+ id: response. id,
87+ title: response. title,
88+ category: category
89+ )
90+ }
6491 }
6592
6693 func upsertTodo( _ todo: Todo ) async throws {
@@ -117,4 +144,35 @@ private extension TodoRepositoryImpl {
117144 category: . decoded( category)
118145 )
119146 }
147+
148+ func resolve(
149+ _ response: TodoReferenceResponse ,
150+ userTodoCategories: [ UserTodoCategory ]
151+ ) throws -> TodoReferenceResponse {
152+ let categoryID : String
153+ switch response. category {
154+ case . raw( let value) :
155+ categoryID = value
156+ case . decoded:
157+ return response
158+ }
159+
160+ let category : TodoCategory
161+ if let systemTodoCategory = SystemTodoCategory ( rawValue: categoryID) {
162+ category = . system( systemTodoCategory)
163+ } else if let userTodoCategory = userTodoCategories. first ( where: {
164+ $0. id == categoryID
165+ } ) {
166+ category = . user( userTodoCategory)
167+ } else {
168+ throw DataError . invalidData ( " TodoReferenceResponse.category is invalid: \( categoryID) " )
169+ }
170+
171+ return TodoReferenceResponse (
172+ id: response. id,
173+ number: response. number,
174+ title: response. title,
175+ category: . decoded( category)
176+ )
177+ }
120178}
0 commit comments