Skip to content

Instantly share code, notes, and snippets.

@metin-atalay
Created April 10, 2022 06:06
Show Gist options
  • Save metin-atalay/1632d34b2a32ebb2d10c279efe6ed6e4 to your computer and use it in GitHub Desktop.
Save metin-atalay/1632d34b2a32ebb2d10c279efe6ed6e4 to your computer and use it in GitHub Desktop.
//
// 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