Created
April 10, 2022 06:06
-
-
Save metin-atalay/1632d34b2a32ebb2d10c279efe6ed6e4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// RequestProvider.swift | |
// Requet Provider | |
// | |
// Created by Metin Atalay on 9.04.2022. | |
// | |
import Foundation | |
#if canImport(FoundationNetworking) | |
import FoundationNetworking | |
#endif | |
class RequestsProvider { | |
private let baseURL: URL? | |
private let tokenProvider: TokenProvider | |
init?(baseURLString: String, tokenProvider: TokenProvider) { | |
if !baseURLString.isEmpty { | |
self.baseURL = URL(string: baseURLString) | |
} | |
else { | |
baseURL = nil | |
} | |
self.tokenProvider = tokenProvider | |
} | |
func createRequestFor(for endpoint: ApiEndpoint) -> URLRequest? { | |
if baseURL == nil { | |
return nil | |
} | |
var userurl = "" | |
var httpMethod = "Get" | |
var movie: MovieRate? = nil | |
switch endpoint { | |
case let .getMovies(userId): | |
userurl = endpoint.endpointString + "?userId=" + userId | |
break | |
case .postRate(movieRate: let movieRate): | |
movie = movieRate | |
userurl = endpoint.endpointString + "postRate" | |
httpMethod = "Post" | |
break | |
} | |
let uri = URL(string: baseURL!.absoluteString + userurl) | |
if uri == nil { | |
return nil | |
} | |
if !verifyUrl (uri?.absoluteString ) { | |
return nil | |
} | |
var requet = URLRequest(url: uri!) | |
requet.httpMethod = httpMethod | |
if(httpMethod == "Post") { | |
guard let data = try? JSONEncoder().encode( movie) else { | |
fatalError("encoding fatal error") | |
} | |
requet.httpBody = data | |
} | |
requet.addValue("application/json", forHTTPHeaderField: "Content-Type") | |
requet.setValue("Basic " + tokenProvider.token, forHTTPHeaderField: "Authorization") | |
requet.timeoutInterval = 30 | |
return requet | |
} | |
func verifyUrl (_ urlString: String?) -> Bool { | |
if let urlString = urlString { | |
if NSURL(string: urlString) != nil { | |
return true | |
} | |
} | |
return false | |
} | |
} | |
struct MovieRate: Codable { | |
let movieId: String | |
let rate: Int | |
} | |
enum ApiEndpoint { | |
case getMovies(userId: String) | |
case postRate(movieRate: MovieRate) | |
var endpointString: String { | |
switch self { | |
case .getMovies: | |
return "/fetchMovies" | |
case .postRate: | |
return "/postRate" | |
} | |
} | |
} | |
protocol TokenProvider { | |
var token: String { get } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment