Skip to content

Commit 0983bb6

Browse files
committed
added Network Model Manager to be more configurable
1 parent 37f2163 commit 0983bb6

15 files changed

Lines changed: 334 additions & 461 deletions

.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.resolved

Lines changed: 1 addition & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,27 @@
44
import PackageDescription
55

66
let package = Package(
7-
name: "NetworkManager",
7+
name: "NetworkModelManager",
88
platforms: [.iOS(.v13), .macOS(.v12)],
99
products: [
1010
// Products define the executables and libraries a package produces, making them visible to other packages.
1111
.library(
12-
name: "NetworkManager",
13-
targets: ["NetworkManager"]),
12+
name: "NetworkModelManager",
13+
targets: ["NetworkModelManager"]),
1414
],
1515
dependencies: [
16-
.package(url: "https://github.com/Alamofire/Alamofire", exact: "5.8.0"),
17-
.package(url: "https://github.com/konkab/AlamofireNetworkActivityLogger", exact: "3.4.0")
16+
.package(url: "https://github.com/Alamofire/Alamofire", exact: "5.8.0")
1817
],
1918
targets: [
2019
// Targets are the basic building blocks of a package, defining a module or a test suite.
2120
// Targets can depend on other targets in this package and products from dependencies.
2221
.target(
23-
name: "NetworkManager",
24-
dependencies: ["Alamofire", "AlamofireNetworkActivityLogger"]
22+
name: "NetworkModelManager",
23+
dependencies: ["Alamofire"]
2524
),
2625
.testTarget(
27-
name: "NetworkManagerTests",
28-
dependencies: ["NetworkManager"],
26+
name: "NetworkModelManagerTests",
27+
dependencies: ["NetworkModelManager"],
2928
resources: [.process("Resources")]),
3029
]
3130
)

Sources/NetworkManager/NetworkManager.swift

Lines changed: 0 additions & 87 deletions
This file was deleted.

Sources/NetworkManager/HTTPURLResponse.swift renamed to Sources/NetworkModelManager/HTTPStatusCode.swift

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,12 @@
11
//
2-
// HTTPURLResponse.swift
2+
// HTTPStatusCode.swift
33
// NetworkManager
44
//
55
// Created by ahmed suliman on 19/07/2022.
66
//
77

88
import Foundation
99

10-
public enum NetworkError: Error {
11-
case nullData
12-
case decodingError
13-
case data
14-
case offline
15-
case invalidURL
16-
case undefined
17-
case custom(Error)
18-
19-
}
20-
2110
public enum HTTPStatusCode: Error {
2211
/// The response class representation of status codes, these get grouped by their first digit.
2312
enum ResponseType: Equatable, Error {
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//
2+
// NetworkModel.swift
3+
// NetworkModel
4+
//
5+
// Created by ahmed suliman on 17/10/2023.
6+
//
7+
8+
import Foundation
9+
import class Alamofire.Session
10+
import struct Alamofire.DataTask
11+
import enum Alamofire.AFError
12+
13+
protocol NetworkModelProtocol {
14+
associatedtype Request: RequestRoute
15+
associatedtype Response: Decodable
16+
17+
static func request(request: Request) async -> Swift.Result<Response, AFError>
18+
}
19+
20+
extension NetworkModelProtocol {
21+
@inlinable
22+
public static func request(request: Request) async -> Swift.Result<Response, AFError> {
23+
guard let request = URLRequest.prepareRequest(requestRoute: request) else {
24+
return .failure(AFError.invalidURL(url: request.url))
25+
}
26+
27+
let session = Session.prepareSession(host: request.url?.host ?? "")
28+
let task: DataTask<Response> = session.request(request).serializingDecodable(Response.self)
29+
30+
guard let httpResponse = await task.response.response,
31+
case let httpStatus = HTTPStatusCode.ResponseType(code: httpResponse.statusCode),
32+
httpStatus.pass else {
33+
34+
if let httpResponse = await task.response.response {
35+
return .failure(.sessionInvalidated(error: HTTPStatusCode.ResponseType(code: httpResponse.statusCode)))
36+
}
37+
38+
return .failure(.sessionInvalidated(error: HTTPStatusCode.ResponseType.undefined))
39+
}
40+
41+
return await task.result
42+
}
43+
44+
}
45+
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
//
2+
// RequestRoute.swift
3+
//
4+
//
5+
// Created by ahmed suliman on 17/10/2023.
6+
//
7+
8+
import Foundation
9+
import protocol Alamofire.URLConvertible
10+
import struct Alamofire.HTTPHeaders
11+
12+
// MARK: - Request URL
13+
public protocol RequestURLProtocol: URLConvertible {
14+
var host: String { get }
15+
var path: String { get }
16+
}
17+
18+
extension RequestURLProtocol {
19+
public func asURL() throws -> URL {
20+
guard let url = URL(string: host + path) else {
21+
fatalError("URL isn't valid")
22+
}
23+
return url
24+
}
25+
}
26+
27+
@frozen
28+
public struct RequestURL: RequestURLProtocol {
29+
public let host: String
30+
public let path: String
31+
}
32+
33+
// MARK: - Network Method
34+
public enum NetworkMethod {
35+
case get
36+
case post
37+
case put
38+
case delete
39+
}
40+
41+
extension NetworkMethod: CustomStringConvertible {
42+
public var description: String {
43+
switch self {
44+
case .get: return "GET"
45+
case .post: return "POST"
46+
case .put: return "PUT"
47+
case .delete: return "DELETE"
48+
}
49+
}
50+
}
51+
52+
// MARK: - Request Query
53+
public enum RequestQuery {
54+
case path
55+
case json
56+
}
57+
58+
// MARK: - Request Parameter
59+
public enum RequestParameter {
60+
case queryItem([URLQueryItem])
61+
case dict([String: Any])
62+
case object(Codable)
63+
}
64+
65+
// MARK: - Request Route
66+
public protocol RequestRoute {
67+
var url: RequestURL { get }
68+
var headers: HTTPHeaders { get }
69+
var method: NetworkMethod { get }
70+
var query: RequestQuery { get }
71+
var parameters: RequestParameter { get }
72+
}

0 commit comments

Comments
 (0)