summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadREST/MullvadAPI/APIRequest/APIRequest.swift
blob: 65ce546b165a782cd37a0496ed32310b065eacee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//
//  APIRequest.swift
//  MullvadVPN
//
//  Created by Jon Petersson on 2025-02-24.
//  Copyright © 2025 Mullvad VPN AB. All rights reserved.
//
import MullvadTypes
@preconcurrency import WireGuardKitTypes

public enum APIRequest: Codable, Sendable {
    // Api Proxy
    case getAddressList(_ retryStrategy: REST.RetryStrategy)
    case getRelayList(_ retryStrategy: REST.RetryStrategy, etag: String?)
    case sendProblemReport(_ retryStrategy: REST.RetryStrategy, problemReportRequest: ProblemReportRequest)
    case checkApiAvailability(_ retryStrategy: REST.RetryStrategy, accessMethod: PersistentAccessMethod)

    // Account Proxy
    case createAccount(_ retryStrategy: REST.RetryStrategy)
    case getAccount(_ retryStrategy: REST.RetryStrategy, accountNumber: String)
    case deleteAccount(_ retryStrategy: REST.RetryStrategy, accountNumber: String)
    case legacyStorekitPayment(
        retryStrategy: REST.RetryStrategy,
        accountNumber: String,
        request: LegacyStorekitRequest
    )
    case initStorekitPayment(retryStrategy: REST.RetryStrategy, accountNumber: String)
    case checkStorekitPayment(
        retryStrategy: REST.RetryStrategy,
        accountNumber: String,
        transaction: StorekitTransaction
    )

    // Device Proxy
    case getDevice(_ retryStrategy: REST.RetryStrategy, accountNumber: String, identifier: String)
    case getDevices(_ retryStrategy: REST.RetryStrategy, accountNumber: String)
    case createDevice(_ retryStrategy: REST.RetryStrategy, accountNumber: String, request: CreateDeviceRequest)
    case deleteDevice(_ retryStrategy: REST.RetryStrategy, accountNumber: String, identifier: String)
    case rotateDeviceKey(
        _ retryStrategy: REST.RetryStrategy,
        accountNumber: String,
        identifier: String,
        publicKey: PublicKey
    )

    var name: String {
        switch self {
        case .getAddressList:
            "get-address-list"
        case .getRelayList:
            "get-relay-list"
        case .sendProblemReport:
            "send-problem-report"
        case .createAccount:
            "create-account"
        case .getAccount:
            "get-account"
        case .deleteAccount:
            "delete-account"
        case .getDevice:
            "get-device"
        case .getDevices:
            "get-devices"
        case .deleteDevice:
            "delete-device"
        case .rotateDeviceKey:
            "rotate-device-key"
        case .createDevice:
            "create-device"
        case .legacyStorekitPayment:
            "legacy-storekit-payment"
        case .initStorekitPayment:
            "init-storekit-payment"
        case .checkStorekitPayment:
            "check-storekit-payment"
        case .checkApiAvailability:
            "check-api-availability"
        }
    }

    var retryStrategy: REST.RetryStrategy {
        switch self {
        case let .getAddressList(strategy),
            let .getRelayList(strategy, _),
            let .sendProblemReport(strategy, _),
            let .createAccount(strategy),
            let .getAccount(strategy, _),
            let .deleteAccount(strategy, _),
            let .createDevice(strategy, _, _),
            let .getDevice(strategy, _, _),
            let .getDevices(strategy, _),
            let .deleteDevice(strategy, _, _),
            let .rotateDeviceKey(strategy, _, _, _),
            let .legacyStorekitPayment(strategy, _, _),
            let .initStorekitPayment(strategy, _),
            let .checkStorekitPayment(strategy, _, _),
            let .checkApiAvailability(strategy, _):
            strategy
        }
    }
}

public struct ProxyAPIRequest: Codable, Sendable {
    public let id: UUID
    public let request: APIRequest

    public init(id: UUID, request: APIRequest) {
        self.id = id
        self.request = request
    }
}

public struct ProxyAPIResponse: Codable, Sendable {
    public let data: Data?
    public let error: APIError?
    public let etag: String?

    public init(data: Data?, error: APIError?, etag: String? = nil) {
        self.data = data
        self.error = error
        self.etag = etag
    }
}