Skip to content

Commit

Permalink
feat: prepare tenor
Browse files Browse the repository at this point in the history
  • Loading branch information
uwaisalqadri committed Oct 11, 2024
1 parent 801e365 commit aa498e7
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@

import Foundation

struct Config {
static let baseUrl = "https://api.giphy.com/v1/gifs/"

struct APIConfig {
static let giphyBaseUrl = "https://api.giphy.com/v1/gifs/"
static let tenorBaseUrl = "https://g.tenor.com/v1/" // coming soon

static var apiKey: String {
guard let filePath = Bundle.main.path(forResource: "Info", ofType: "plist") else {
fatalError("Couldn't find file 'Info.plist'.")
Expand Down
51 changes: 8 additions & 43 deletions Modules/Common/Common/Sources/Common/Data/API/APIFactory.swift
Original file line number Diff line number Diff line change
@@ -1,50 +1,15 @@
//
// ApiFactory.swift
//
// APIFactory.swift
//
// Created by Uwais Alqadri on 10/17/21.
//
// Created by Uwais Alqadri on 11/10/24.
//

import Foundation

public enum APIFactory {
case trending
case random
case search(query: String)
}

public extension APIFactory {
var url: URL {
let params = parameter.map({ "\($0.key)=\($0.value)" }).joined(separator: "&")
let urlString = baseURL.appending(path)
.appending("?")
.appending(params)
return URL(string: urlString) ?? URL.init(fileURLWithPath: "")
}

private var baseURL: String {
Config.baseUrl
}

private var path: String {
switch self {
case .random:
return "random"
case .trending:
return "trending"
case .search:
return "search"
}
}

private var parameter: [String: Any] {
var defaultParams = ["api_key": Config.apiKey]
switch self {
case .search(let query) where query.count > 0:
defaultParams["q"] = query
default:
break
}
return defaultParams
}
public protocol APIFactory {
var path: String { get }
var parameter: [String: Any] { get }
var composedURL: URL { get }
var baseURL: String { get }
}
50 changes: 50 additions & 0 deletions Modules/Common/Common/Sources/Common/Data/API/GiphyAPI.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
//
// GiphyAPI.swift
//
//
// Created by Uwais Alqadri on 10/17/21.
//

import Foundation

public enum GiphyAPI {
case trending
case random
case search(query: String)
}

extension GiphyAPI: APIFactory {
public var baseURL: String {
APIConfig.giphyBaseUrl
}

public var path: String {
switch self {
case .random:
return "random"
case .trending:
return "trending"
case .search:
return "search"
}
}

public var parameter: [String: Any] {
var defaultParams = ["api_key": APIConfig.apiKey]
switch self {
case .search(let query) where query.count > 0:
defaultParams["q"] = query
default:
break
}
return defaultParams
}

public var composedURL: URL {
let params = parameter.map({ "\($0.key)=\($0.value)" }).joined(separator: "&")
let urlString = baseURL.appending(path)
.appending("?")
.appending(params)
return URL(string: urlString) ?? URL.init(fileURLWithPath: "")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import Alamofire
public class NetworkService {
public static let shared = NetworkService()

public func connect<T: Codable>(api: URL, responseType: T.Type) async throws -> T {
public func connect<T: Codable>(api: APIFactory, responseType: T.Type) async throws -> T {
return try await withCheckedThrowingContinuation { continuation in
AF.request(api.absoluteString)
AF.request(api.composedURL)
.prettyPrintedJsonResponse(of: responseType)
.responseDecodable(of: responseType) { response in
switch response.result {
Expand Down
40 changes: 40 additions & 0 deletions Modules/Common/Common/Sources/Common/Data/API/TenorAPI.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
//
// TenorAPI.swift
//
//
// Created by Uwais Alqadri on 11/10/24.
//

import Foundation

public enum TenorAPI {
case search(query: String)
}

extension TenorAPI: APIFactory {
public var path: String {
switch self {
case .search:
return "search"
}
}

public var parameter: [String: Any] {
switch self {
case let .search(query):
return ["q": query, "key": "LIVDSRZULELA", "limit": 100]
}
}

public var composedURL: URL {
let params = parameter.map({ "\($0.key)=\($0.value)" }).joined(separator: "&")
let urlString = baseURL.appending(path)
.appending("?")
.appending(params)
return URL(string: urlString) ?? URL.init(fileURLWithPath: "")
}

public var baseURL: String {
APIConfig.tenorBaseUrl
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,16 @@ public struct SearchRemoteDataSource: DataSource {
public init() {}

public func execute(request: String?) async throws -> [Giphy] {
let result = try await NetworkService.shared.connect(
api: APIFactory.search(query: request ?? "").url,
let giphyResult = try await NetworkService.shared.connect(
api: GiphyAPI.search(query: request ?? ""),
responseType: GiphyDataResponse.self
).data.compactMap { $0.map() }

return result
// let tenorResult = try await NetworkService.shared.connect(
// api: TenorAPI.search(query: request ?? ""),
// responseType: GiphyDataResponse.self
// ).data.compactMap { $0.map() }

return giphyResult
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public struct TrendingRemoteDataSource: DataSource {

public func execute(request: Int?) async throws -> [Giphy] {
let result = try await NetworkService.shared.connect(
api: APIFactory.trending.url,
api: GiphyAPI.trending,
responseType: GiphyDataResponse.self
).data.compactMap { $0.map() }

Expand Down

0 comments on commit aa498e7

Please sign in to comment.