Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 44 additions & 66 deletions Sources/MeiliSearch/Request.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@ public protocol URLSessionDataTaskProtocol {
func resume()
}

private enum HTTPMethod: String {
case get = "GET"
case put = "PUT"
case post = "POST"
case patch = "PATCH"
case delete = "DELETE"
}

public final class Request {
private let config: Config
private let session: URLSessionProtocol
Expand All @@ -28,6 +36,33 @@ public final class Request {
self.session = config.session ?? URLSession.shared
}

private func request(
_ httpMethod: HTTPMethod,
_ url: URL,
_ headers: [String: String] = [:],
data: Data? = nil
) -> URLRequest {
var request = URLRequest(url: url)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

    var request = URLRequest(url: url)
    request.httpMethod = httpMethod.rawValue
    request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")
    
    if httpMethod != .get {
      request.httpBody = data
      request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    }
    
    if let apiKey: String = config.apiKey {
      let bearer = "Bearer \(apiKey)"
      request.setValue(bearer, forHTTPHeaderField: "Authorization")
    }
    
    headers.forEach { key, value in
      request.addValue(value, forHTTPHeaderField: key)
    }

    return request

I added some spaces between functions, I think they were important (it is easier to read :D).
But I changed some function execution orders as well, this will help anyone to apply custom data from the headers param when needed (idk, if to fully apply this concept we need to switch over setValue instead of addValue).

request.httpMethod = httpMethod.rawValue
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")

if httpMethod != .get {
request.httpBody = data
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
}

if let apiKey: String = config.apiKey {
let bearer = "Bearer \(apiKey)"
request.setValue(bearer, forHTTPHeaderField: "Authorization")
}

headers.forEach { key, value in
request.addValue(value, forHTTPHeaderField: key)
}

return request
}

func get(
api: String,
param: String? = nil,
Expand All @@ -38,24 +73,11 @@ public final class Request {
if let param: String = param, !param.isEmpty {
urlString += param
}

guard let url = URL(string: urlString) else {
completion(.failure(MeiliSearch.Error.invalidURL(url: urlString)))
return
}

var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")
headers.forEach { key, value in
request.addValue(value, forHTTPHeaderField: key)
}

if let apiKey = config.apiKey {
let bearer = "Bearer \(apiKey)"
request.addValue(bearer, forHTTPHeaderField: "Authorization")
}

let request = self.request(.get, url, headers)
let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in
do {
try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error)
Expand All @@ -73,25 +95,15 @@ public final class Request {

func post(
api: String,
headers: [String: String] = [:],
_ data: Data,
_ completion: @escaping (Result<Data, Swift.Error>) -> Void) {
guard let url = URL(string: config.url(api: api)) else {
completion(.failure(MeiliSearch.Error.invalidURL()))
return
}

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = data
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")

if let apiKey: String = config.apiKey {
let bearer = "Bearer \(apiKey)"
request.addValue(bearer, forHTTPHeaderField: "Authorization")
}

let request = self.request(.post, url, headers, data: data)
let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in
do {
try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error)
Expand All @@ -111,25 +123,14 @@ public final class Request {

func put(
api: String,
headers: [String: String] = [:],
_ data: Data,
_ completion: @escaping (Result<Data, Swift.Error>) -> Void) {
guard let url = URL(string: config.url(api: api)) else {
completion(.failure(MeiliSearch.Error.invalidURL()))
return
}

var request = URLRequest(url: url)
request.httpMethod = "PUT"
request.httpBody = data
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")

if let apiKey: String = config.apiKey {
let bearer = "Bearer \(apiKey)"
request.addValue(bearer, forHTTPHeaderField: "Authorization")
}

let request = self.request(.put, url, headers, data: data)
let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in
do {
try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error)
Expand All @@ -144,31 +145,19 @@ public final class Request {
return
}
}

task.resume()
}

func patch(
api: String,
headers: [String: String] = [:],
_ data: Data,
_ completion: @escaping (Result<Data, Swift.Error>) -> Void) {
guard let url = URL(string: config.url(api: api)) else {
completion(.failure(MeiliSearch.Error.invalidURL()))
return
}

var request = URLRequest(url: url)
request.httpMethod = "PATCH"
request.httpBody = data
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")

if let apiKey: String = config.apiKey {
let bearer = "Bearer \(apiKey)"
request.setValue(bearer, forHTTPHeaderField: "Authorization")
}

let request = self.request(.patch, url, headers, data: data)
let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in
do {
try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error)
Expand All @@ -183,29 +172,18 @@ public final class Request {
return
}
}

task.resume()
}

func delete(
api: String,
headers: [String: String] = [:],
_ completion: @escaping (Result<Data?, Swift.Error>) -> Void) {
guard let url = URL(string: config.url(api: api)) else {
completion(.failure(MeiliSearch.Error.invalidURL()))
return
}

var request = URLRequest(url: url)
request.httpMethod = "DELETE"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")

if let apiKey: String = config.apiKey {
let bearer = "Bearer \(apiKey)"
request.addValue(bearer, forHTTPHeaderField: "Authorization")
}

let request = self.request(.delete, url, headers)
let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in
do {
try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error)
Expand Down