Skip to content

Commit f05cf72

Browse files
author
Juan López
committed
Move decodable mapping logic to a new class FeedImagesMapper to decouple the Feed Feature module from API implementation data
1 parent 01d5500 commit f05cf72

File tree

2 files changed

+40
-16
lines changed

2 files changed

+40
-16
lines changed

FeedAPIChallenge/Feed API/RemoteFeedLoader.swift

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,51 @@ public final class RemoteFeedLoader: FeedLoader {
2222
client.get(from: url) { result in
2323
switch result {
2424
case let .success((data, response)):
25-
if response.statusCode == 200, let root = try? JSONDecoder().decode(Root.self, from: data) {
26-
completion(.success(root.items))
27-
} else {
28-
completion(.failure(Error.invalidData))
29-
}
25+
completion(FeedImagesMapper.map(data: data, from: response))
3026
case .failure:
3127
completion(.failure(Error.connectivity))
3228
}
3329
}
3430
}
3531
}
3632

37-
private struct Root: Codable {
38-
let items: [FeedImage]
33+
private final class FeedImagesMapper {
34+
private struct Root: Decodable {
35+
let items: [Item]
36+
37+
var feed: [FeedImage] {
38+
items.map { $0.feedImage }
39+
}
40+
}
41+
42+
private struct Item: Decodable {
43+
let id: UUID
44+
let description: String?
45+
let location: String?
46+
let url: URL
47+
48+
var feedImage: FeedImage {
49+
.init(id: id, description: description, location: location, url: url)
50+
}
51+
52+
enum CodingKeys: String, CodingKey {
53+
case id = "image_id"
54+
case description = "image_desc"
55+
case location = "image_loc"
56+
case url = "image_url"
57+
}
58+
}
59+
60+
private static var goodResponseCode: Int { 200 }
61+
62+
static func map(data: Data, from response: HTTPURLResponse) -> FeedLoader.Result {
63+
guard
64+
response.statusCode == goodResponseCode,
65+
let root = try? JSONDecoder().decode(Root.self, from: data)
66+
else {
67+
return .failure(RemoteFeedLoader.Error.invalidData)
68+
}
69+
70+
return .success(root.feed)
71+
}
3972
}

FeedAPIChallenge/Feed Feature/FeedImage.swift

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,3 @@ public struct FeedImage: Hashable {
1717
self.url = url
1818
}
1919
}
20-
21-
extension FeedImage: Codable {
22-
enum CodingKeys: String, CodingKey {
23-
case id = "image_id"
24-
case description = "image_desc"
25-
case location = "image_loc"
26-
case url = "image_url"
27-
}
28-
}

0 commit comments

Comments
 (0)