BreezeLambdaAPIClient

Breeze CI codecov

这是 Breeze Lambda API(自 0.2.0 版本起)的客户端。

Breeze

安装

Swift Package Manager

将 BreezeLambdaAPIClient 作为依赖项添加到您的 Package.swift 的 dependencies 值中。

    dependencies: [
        //...
        .package(url: "https://github.com/swift-serverless/BreezeLambdaAPIClient.git", from: "0.2.0"),
        // ...
    ]
)

用法

以下示例展示了如何使用客户端来创建、读取、更新、删除和列出项目。 Item 是一个符合 Codable 协议的结构体。 Item 必须在客户端和 Breeze Lambda API 之间共享。

import Foundation
import BreezeLambdaAPIClient

protocol ItemServing {
    func create(item: Item) async throws -> Item
    func read(key: String) async throws -> Item
    func update(item: Item) async throws -> Item
    func delete(item: Item) async throws
    func list(startKey: String?, limit: Int?) async throws -> [Item]
}

struct ItemService: ItemServing {
    
    private let apiClient: BreezeLambdaAPIClient<Item>
    
    private let session: SessionService
    
    private var token: String? {
        session.userSession?.jwtToken
    }
    
    init(session: SessionService) {
        guard var env = try? APIEnvironment.dev() else {
            fatalError("Invalid Environment")
        }
        env.logger = Logger()
        self.session = session
        self.apiClient = BreezeLambdaAPIClient<Item>(env: env, path: "items", additionalHeaders: [:])
    }
    
    func create(item: Item) async throws -> Item {
        try await apiClient.create(token: token, item: item)
    }
    
    func read(key: String) async throws -> Item {
        try await apiClient.read(token: token, key: key)
    }
    
    func update(item: Item) async throws -> Item {
        try await apiClient.update(token: token, item: item)
    }
    
    func delete(item: Item) async throws {
        guard let updatedAt = item.updatedAt,
              let createdAt = item.createdAt else {
            throw ItemServiceError.invalidItem
        }
        try await apiClient.delete(token: token, key: item.key, createdAt: createdAt, updatedAt: updatedAt)
    }
    
    func list(startKey: String?, limit: Int?) async throws -> [Item] {
        try await apiClient.list(token: token, exclusiveStartKey: startKey, limit: limit)
    }
}

struct APIEnvironment {
    static func dev() throws -> APIClientEnv {
        try APIClientEnv(session: URLSession.shared, baseURL: "<API GATEWAY URL>", logger: nil)
    }
}

extension Item: KeyedCodable {}

struct Logger: APIClientLogging {
    func log(request: URLRequest) {
        print(request)
    }
    
    func log(data: Data, for response: URLResponse) {
        print(response)
        let value = String(data: data, encoding: .utf8) ?? ""
        print(value)
    }
}

enum ItemServiceError: Error {
    case invalidItem
}

注意:SessionService 用于获取 JWT 令牌。会话不属于此软件包的一部分。

贡献

非常欢迎大家做出贡献!请遵循此指南来做出贡献。