Skip to content

Commit 7ec1727

Browse files
committed
add search target api
1 parent 452f643 commit 7ec1727

12 files changed

+190
-119
lines changed

Sources/SwiftThemoviedbWrap/Models/MovieDetail/MovieDetailResponseDTO.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public struct MovieDetailResponseDTO: Codable, Equatable {
3636
public let voteCount: Int
3737
public let videos: VideosDTO
3838
public let credits: CreditsDTO
39-
public let recommendations: MoviesResponseDTO
39+
public let recommendations: MoviesResponse
4040
public let reviews: ReviewsResponseDTO
4141

4242
private enum CodingKeys: String, CodingKey {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
//
2+
// File.swift
3+
// SwiftThemoviedbWrap
4+
//
5+
// Created by PhuongDoan on 21/6/24.
6+
//
7+
8+
import Foundation
9+
10+
public struct PagedResponse<Model: Codable & Equatable>: Codable, Equatable {
11+
private enum CodingKeys: String, CodingKey {
12+
case page
13+
case totalPages = "total_pages"
14+
case results = "results"
15+
}
16+
17+
public let page: Int
18+
public let totalPages: Int
19+
public let results: [Model]
20+
}
21+
22+
public struct Movie: Codable, Equatable {
23+
public let id: Int
24+
public let title: String
25+
public let originalTitle: String?
26+
public let overview: String
27+
public let posterPath: String?
28+
public let backdropPath: String?
29+
public let mediaType: String?
30+
public let adult: Bool
31+
public let originalLanguage: String
32+
public let genreIds: [Int]
33+
public let popularity: Double?
34+
public let releaseDate: String?
35+
public let video: Bool?
36+
public let voteAverage: Double
37+
public let voteCount: Int
38+
39+
private enum CodingKeys: String, CodingKey {
40+
case id
41+
case title
42+
case originalTitle = "original_title"
43+
case overview
44+
case posterPath = "poster_path"
45+
case backdropPath = "backdrop_path"
46+
case mediaType = "media_type"
47+
case adult
48+
case originalLanguage = "original_language"
49+
case genreIds = "genre_ids"
50+
case popularity
51+
case releaseDate = "release_date"
52+
case video
53+
case voteAverage = "vote_average"
54+
case voteCount = "vote_count"
55+
}
56+
}
57+
58+
public typealias MoviesResponse = PagedResponse<Movie>

Sources/SwiftThemoviedbWrap/Models/MoviesResponseDTO.swift

-40
This file was deleted.

Sources/SwiftThemoviedbWrap/Models/Reviews/ReviewDTO.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import Foundation
99

10-
public typealias MovieReviewsResponseDTO = PagedResponseDTO<ReviewDTO>
10+
public typealias MovieReviewsResponseDTO = PagedResponse<ReviewDTO>
1111

1212
public struct ReviewDTO: Codable, Equatable {
1313
public var author: String?

Sources/SwiftThemoviedbWrap/Models/MoviesQueryRequestDTO.swift Sources/SwiftThemoviedbWrap/Models/SearchRequest.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,20 @@ public protocol MoviesRequestable: Encodable {
1111
var page: Int { get set }
1212
}
1313

14-
public struct MoviesQueryRequestDTO: MoviesRequestable {
14+
public struct SearchRequest: MoviesRequestable {
1515
public let query: String
1616
public var page: Int
1717
}
1818

19-
public struct DefaultMoviesRequestDTO: MoviesRequestable {
19+
public struct DefaultMoviesRequest: MoviesRequestable {
2020
public var page: Int
2121

2222
public init(page: Int = 1) {
2323
self.page = page
2424
}
2525
}
2626

27-
public struct MoviesRecommendationRequestDTO: MoviesRequestable {
27+
public struct MoviesRecommendationRequest: MoviesRequestable {
2828
public var page: Int
2929
public var movieId: Int
3030

Sources/SwiftThemoviedbWrap/Providers/MoviesDataProvider.swift

+5-5
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import Combine
1010
import SwiftNetworkWrap
1111

1212
public protocol MoviesDataProvider {
13-
func getTrendingList(type: TrendingType, requestDTO: MoviesRequestable) -> AnyPublisher<MoviesResponseDTO, Error>
14-
func getMovieList(type: MovieListType, requestDto: MoviesRequestable) -> AnyPublisher<MoviesResponseDTO, Error>
13+
func getTrendingList(type: TrendingType, requestDTO: MoviesRequestable) -> AnyPublisher<MoviesResponse, Error>
14+
func getMovieList(type: MovieListType, requestDto: MoviesRequestable) -> AnyPublisher<MoviesResponse, Error>
1515
func getMovieDetails(requestDto: MovieDetailRequestDTO) -> AnyPublisher<MovieDetailResponseDTO, Error>
1616
func getMovieReviewList(requestDto: MovieReviewsRequestDTO) -> AnyPublisher<MovieReviewsResponseDTO, Error>
1717
}
@@ -36,7 +36,7 @@ public enum MovieListType {
3636
case .topRated:
3737
return MoviesTarget.topRated(request: request)
3838
case .recommendations:
39-
return MoviesTarget.recommendations(request: request as! MoviesRecommendationRequestDTO)
39+
return MoviesTarget.recommendations(request: request as! MoviesRecommendationRequest)
4040
}
4141
}
4242
}
@@ -49,7 +49,7 @@ public final class DefaultMoviesDataProvider: MoviesDataProvider {
4949
}
5050

5151
public func getTrendingList(type: TrendingType,
52-
requestDTO: MoviesRequestable) -> AnyPublisher<MoviesResponseDTO, Error> {
52+
requestDTO: MoviesRequestable) -> AnyPublisher<MoviesResponse, Error> {
5353
var target: ApiTarget
5454
switch type {
5555
case .today:
@@ -61,7 +61,7 @@ public final class DefaultMoviesDataProvider: MoviesDataProvider {
6161
}
6262

6363
public func getMovieList(type: MovieListType,
64-
requestDto: MoviesRequestable) -> AnyPublisher<MoviesResponseDTO, Error> {
64+
requestDto: MoviesRequestable) -> AnyPublisher<MoviesResponse, Error> {
6565
provider.request(type.target(request: requestDto))
6666
}
6767

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
// SearchDataProvider.swift
3+
//
4+
//
5+
// Created by PhuongDoan on 24/6/24.
6+
//
7+
8+
import Foundation
9+
import Combine
10+
11+
protocol SearchDataProvider {
12+
func movies(request: SearchRequest) -> AnyPublisher<MoviesResponse, Error>
13+
func persons(_ request: SearchRequest) -> AnyPublisher<Data, Error>
14+
}

Sources/SwiftThemoviedbWrap/Targets/MoviesTarget.swift

+28-27
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,48 @@ public class TMDBConfigurationManager: TMDBConfigurationManagerProtocol {
3232
}
3333
}
3434

35-
extension ApiTarget {
35+
protocol TmdbApiTarget: ApiTarget {}
36+
37+
extension TmdbApiTarget {
3638
var headers: [String : String]? {
3739
[
3840
"Content-type": "application/json",
3941
"Authorization": "Bearer \(TMDBConfigurationManager.shared.accessToken)"
4042
]
4143
}
44+
45+
func body() throws -> Data? {
46+
return nil
47+
}
48+
49+
func urlRequest(baseURL: String) throws -> URLRequest {
50+
try TMDBConfigurationManager.shared.validateCredentials()
51+
guard var urlComponents = URLComponents(string: baseURL) else {
52+
throw ApiError.invalidUrl
53+
}
54+
urlComponents.path = path
55+
if let queryItems = queryParameters() {
56+
urlComponents.queryItems = queryItems.map { URLQueryItem(name: $0.key, value: "\($0.value)")}
57+
}
58+
guard let url = urlComponents.url else {
59+
throw ApiError.invalidUrl
60+
}
61+
var request = URLRequest(url: url)
62+
request.httpMethod = method
63+
request.allHTTPHeaderFields = headers
64+
request.httpBody = try body()
65+
return request
66+
}
4267
}
4368

44-
enum MoviesTarget: ApiTarget {
69+
enum MoviesTarget: TmdbApiTarget {
4570
case todayTrending(request: MoviesRequestable)
4671
case weekTrending(request: MoviesRequestable)
4772
case nowPlaying(request: MoviesRequestable)
4873
case upComing(request: MoviesRequestable)
4974
case topRated(request: MoviesRequestable)
5075
case popular(request: MoviesRequestable)
51-
case recommendations(request: MoviesRecommendationRequestDTO)
76+
case recommendations(request: MoviesRecommendationRequest)
5277
case detail(request: MovieDetailRequestDTO)
5378
case reviews(request: MovieReviewsRequestDTO)
5479

@@ -97,30 +122,6 @@ enum MoviesTarget: ApiTarget {
97122
return nil
98123
}
99124
}
100-
101-
func body() throws -> Data? {
102-
return nil
103-
}
104-
105-
func urlRequest(baseURL: String) throws -> URLRequest {
106-
try TMDBConfigurationManager.shared.validateCredentials()
107-
108-
guard var urlComponents = URLComponents(string: baseURL) else {
109-
throw ApiError.invalidUrl
110-
}
111-
urlComponents.path = path
112-
if let queryItems = queryParameters() {
113-
urlComponents.queryItems = queryItems.map { URLQueryItem(name: $0.key, value: "\($0.value)")}
114-
}
115-
guard let url = urlComponents.url else {
116-
throw ApiError.invalidUrl
117-
}
118-
var request = URLRequest(url: url)
119-
request.httpMethod = method
120-
request.allHTTPHeaderFields = headers
121-
request.httpBody = try body()
122-
return request
123-
}
124125
}
125126

126127
enum TmdbApiError: Error {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//
2+
// SearchTarget.swift
3+
//
4+
//
5+
// Created by PhuongDoan on 24/6/24.
6+
//
7+
8+
import Foundation
9+
10+
// MARK: - Search
11+
enum SearchTarget: TmdbApiTarget {
12+
case search(request: SearchRequest)
13+
14+
var path: String {
15+
switch self {
16+
case .search:
17+
return "/search/movie"
18+
}
19+
}
20+
21+
var method: String { "GET" }
22+
23+
func queryParameters() -> [String: Any]? {
24+
switch self {
25+
case .search(let request):
26+
return request.toUrlQueryParameters()
27+
}
28+
}
29+
}

Tests/SwiftThemoviedbWrapTests/MockedDTO/ReviewResponseDTO.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ let reviewsJSON: String =
4949
"""
5050

5151
extension MovieReviewsResponseDTO {
52-
static var mock: PagedResponseDTO<ReviewDTO> {
52+
static var mock: PagedResponse<ReviewDTO> {
5353
let data = reviewsJSON.data(using: .utf16)!
54-
return try! JSONDecoder().decode(PagedResponseDTO<ReviewDTO>.self, from: data)
54+
return try! JSONDecoder().decode(PagedResponse<ReviewDTO>.self, from: data)
5555
}
5656
}

0 commit comments

Comments
 (0)