Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1.6.x #61

Merged
merged 8 commits into from
Aug 27, 2024
Merged
Show file tree
Hide file tree
Changes from 6 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
4 changes: 2 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ let package = Package(
),
],
dependencies: [
.package(url: "https://github.com/swift-server/async-http-client.git", from: "1.17.0"),
.package(url: "https://github.com/apple/swift-nio.git", from: "2.32.0"),
.package(url: "https://github.com/swift-server/async-http-client.git", from: "1.19.0"),
.package(url: "https://github.com/apple/swift-nio.git", from: "2.58.0"),
],
targets: [
.target(
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

![Swift Package Manager](https://img.shields.io/github/v/release/appwrite/sdk-for-apple.svg?color=green&style=flat-square)
![License](https://img.shields.io/github/license/appwrite/sdk-for-apple.svg?style=flat-square)
![Version](https://img.shields.io/badge/api%20version-1.5.6-blue.svg?style=flat-square)
![Version](https://img.shields.io/badge/api%20version-1.6.0-blue.svg?style=flat-square)
[![Build Status](https://img.shields.io/travis/com/appwrite/sdk-generator?style=flat-square)](https://travis-ci.com/appwrite/sdk-generator)
[![Twitter Account](https://img.shields.io/twitter/follow/appwrite?color=00acee&label=twitter&style=flat-square)](https://twitter.com/appwrite)
[![Discord](https://img.shields.io/discord/564160730845151244?label=discord&style=flat-square)](https://appwrite.io/discord)

**This SDK is compatible with Appwrite server version 1.5.x. For older versions, please check [previous releases](https://github.com/appwrite/sdk-for-apple/releases).**
**This SDK is compatible with Appwrite server version 1.6.x. For older versions, please check [previous releases](https://github.com/appwrite/sdk-for-apple/releases).**

Appwrite is an open-source backend as a service server that abstract and simplify complex and repetitive development tasks behind a very simple to use REST API. Appwrite aims to help you develop your apps faster and in a more secure way. Use the Apple SDK to integrate your app with the Appwrite server to easily start interacting with all of Appwrite backend APIs and tools. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)

Expand All @@ -31,7 +31,7 @@ Add the package to your `Package.swift` dependencies:

```swift
dependencies: [
.package(url: "[email protected]:appwrite/sdk-for-apple.git", from: "6.0.0"),
.package(url: "[email protected]:appwrite/sdk-for-apple.git", from: "7.0.0"),
],
```

Expand Down
10 changes: 8 additions & 2 deletions Sources/Appwrite/Client.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ open class Client {
"x-sdk-name": "Apple",
"x-sdk-platform": "client",
"x-sdk-language": "apple",
"x-sdk-version": "6.0.0",
"x-appwrite-response-format": "1.5.0"
"x-sdk-version": "7.0.0",
"x-appwrite-response-format": "1.6.0"
]

internal var config: [String: String] = [:]
Expand Down Expand Up @@ -313,6 +313,12 @@ open class Client {
timeout: .seconds(30)
)

if let warning = response.headers["x-appwrite-warning"].first {
warning.split(separator: ";").forEach { warning in
print("Warning: \(warning)")
}
}

switch response.status.code {
case 0..<400:
if response.headers["Set-Cookie"].count > 0 {
Expand Down
24 changes: 14 additions & 10 deletions Sources/Appwrite/OAuth/WebAuthComponent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,17 +53,24 @@ public class WebAuthComponent {
/// - url: The URL containing the cookie
///
public static func handleIncomingCookie(from url: URL) {
let components = URLComponents(string: url.absoluteString)!

let cookieParts = [String: String](uniqueKeysWithValues: components.queryItems!.map {
($0.name, $0.value!)
guard let components = URLComponents(string: url.absoluteString),
let queryItems = components.queryItems else {
return
}

let cookieParts = [String: String](uniqueKeysWithValues: queryItems.compactMap { item in
item.value.map { (item.name, $0) }
})

var domain = cookieParts["domain"]!
guard var domain = cookieParts["domain"],
let key = cookieParts["key"],
let secret = cookieParts["secret"] else {
return
}

domain.remove(at: domain.startIndex)

let key: String = cookieParts["key"]!
let secret: String = cookieParts["secret"]!
let path: String? = cookieParts["path"]
let expires: String? = cookieParts["expires"]
let maxAge: String? = cookieParts["maxAge"]
Expand Down Expand Up @@ -92,10 +99,7 @@ public class WebAuthComponent {
cookie += "; secure"
}

let existing = UserDefaults.standard.stringArray(forKey: domain)
let new = [cookie]

UserDefaults.standard.set(new, forKey: domain)
UserDefaults.standard.set([cookie], forKey: domain)

WebAuthComponent.onCallback(
scheme: components.scheme!,
Expand Down
20 changes: 8 additions & 12 deletions Sources/Appwrite/Services/Account.swift
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ open class Account: Service {
///
open func createJWT(
) async throws -> AppwriteModels.Jwt {
let apiPath: String = "/account/jwt"
let apiPath: String = "/account/jwts"

let apiParams: [String: Any] = [:]

Expand Down Expand Up @@ -402,7 +402,7 @@ open class Account: Service {
}

///
/// Add Authenticator
/// Create Authenticator
///
/// Add an authenticator app to be used as an MFA factor. Verify the
/// authenticator using the [verify
Expand Down Expand Up @@ -443,7 +443,7 @@ open class Account: Service {
///
/// Verify an authenticator app after adding it using the [add
/// authenticator](/docs/references/cloud/client-web/account#createMfaAuthenticator)
/// method. add
/// method.
///
/// @param AppwriteEnums.AuthenticatorType type
/// @param String otp
Expand Down Expand Up @@ -484,7 +484,7 @@ open class Account: Service {
///
/// Verify an authenticator app after adding it using the [add
/// authenticator](/docs/references/cloud/client-web/account#createMfaAuthenticator)
/// method. add
/// method.
///
/// @param AppwriteEnums.AuthenticatorType type
/// @param String otp
Expand All @@ -508,20 +508,16 @@ open class Account: Service {
/// Delete an authenticator for a user by ID.
///
/// @param AppwriteEnums.AuthenticatorType type
/// @param String otp
/// @throws Exception
/// @return array
///
open func deleteMfaAuthenticator(
type: AppwriteEnums.AuthenticatorType,
otp: String
type: AppwriteEnums.AuthenticatorType
) async throws -> Any {
let apiPath: String = "/account/mfa/authenticators/{type}"
.replacingOccurrences(of: "{type}", with: type.rawValue)

let apiParams: [String: Any?] = [
"otp": otp
]
let apiParams: [String: Any] = [:]

let apiHeaders: [String: String] = [
"content-type": "application/json"
Expand All @@ -535,7 +531,7 @@ open class Account: Service {
}

///
/// Create 2FA Challenge
/// Create MFA Challenge
///
/// Begin the process of MFA verification after sign-in. Finish the flow with
/// [updateMfaChallenge](/docs/references/cloud/client-web/account#updateMfaChallenge)
Expand Down Expand Up @@ -2037,7 +2033,7 @@ open class Account: Service {
}

///
/// Create phone verification (confirmation)
/// Update phone verification (confirmation)
///
/// Use this endpoint to complete the user phone verification process. Use the
/// **userId** and **secret** that were sent to your user's phone number to
Expand Down
2 changes: 2 additions & 0 deletions Sources/Appwrite/Services/Avatars.swift
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ open class Avatars: Service {
/// Use this endpoint to fetch the favorite icon (AKA favicon) of any remote
/// website URL.
///
/// This endpoint does not follow HTTP redirects.
///
/// @param String url
/// @throws Exception
Expand Down Expand Up @@ -180,6 +181,7 @@ open class Avatars: Service {
/// image at source quality. If dimensions are not specified, the default size
/// of image returned is 400x400px.
///
/// This endpoint does not follow HTTP redirects.
///
/// @param String url
/// @param Int width
Expand Down
71 changes: 69 additions & 2 deletions Sources/Appwrite/Services/Functions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,70 @@ import AppwriteModels
/// The Functions Service allows you view, create and manage your Cloud Functions.
open class Functions: Service {

///
/// Get function template
///
/// Get a function template using ID. You can use template details in
/// [createFunction](/docs/references/cloud/server-nodejs/functions#create)
/// method.
///
/// @param String templateId
/// @throws Exception
/// @return array
///
open func getTemplate(
templateId: String
) async throws -> AppwriteModels.TemplateFunction {
let apiPath: String = "/functions/templates/{templateId}"
.replacingOccurrences(of: "{templateId}", with: templateId)

let apiParams: [String: Any] = [:]

let apiHeaders: [String: String] = [
"content-type": "application/json"
]

let converter: (Any) -> AppwriteModels.TemplateFunction = { response in
return AppwriteModels.TemplateFunction.from(map: response as! [String: Any])
}

return try await client.call(
method: "GET",
path: apiPath,
headers: apiHeaders,
params: apiParams,
converter: converter
)
}

///
/// Download deployment
///
/// Get a Deployment's contents by its unique ID. This endpoint supports range
/// requests for partial or streaming file download.
///
/// @param String functionId
/// @param String deploymentId
/// @throws Exception
/// @return array
///
open func getDeploymentDownload(
functionId: String,
deploymentId: String
) async throws -> ByteBuffer {
let apiPath: String = "/functions/{functionId}/deployments/{deploymentId}/download"
.replacingOccurrences(of: "{functionId}", with: functionId)
.replacingOccurrences(of: "{deploymentId}", with: deploymentId)

let apiParams: [String: Any] = [:]

return try await client.call(
method: "GET",
path: apiPath,
params: apiParams
)
}

///
/// List executions
///
Expand Down Expand Up @@ -64,6 +128,7 @@ open class Functions: Service {
/// @param String path
/// @param AppwriteEnums.ExecutionMethod method
/// @param Any headers
/// @param String scheduledAt
/// @throws Exception
/// @return array
///
Expand All @@ -73,7 +138,8 @@ open class Functions: Service {
async: Bool? = nil,
path: String? = nil,
method: AppwriteEnums.ExecutionMethod? = nil,
headers: Any? = nil
headers: Any? = nil,
scheduledAt: String? = nil
) async throws -> AppwriteModels.Execution {
let apiPath: String = "/functions/{functionId}/executions"
.replacingOccurrences(of: "{functionId}", with: functionId)
Expand All @@ -83,7 +149,8 @@ open class Functions: Service {
"async": async,
"path": path,
"method": method,
"headers": headers
"headers": headers,
"scheduledAt": scheduledAt
]

let apiHeaders: [String: String] = [
Expand Down
13 changes: 10 additions & 3 deletions Sources/AppwriteModels/Execution.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ public class Execution {
/// Function execution duration in seconds.
public let duration: Double

/// The scheduled time for execution. If left empty, execution will be queued immediately.
public let scheduledAt: String??
abnegate marked this conversation as resolved.
Show resolved Hide resolved


init(
id: String,
Expand All @@ -69,7 +72,8 @@ public class Execution {
responseHeaders: [Headers],
logs: String,
errors: String,
duration: Double
duration: Double,
scheduledAt: String??
) {
self.id = id
self.createdAt = createdAt
Expand All @@ -87,6 +91,7 @@ public class Execution {
self.logs = logs
self.errors = errors
self.duration = duration
self.scheduledAt = scheduledAt
}

public func toMap() -> [String: Any] {
Expand All @@ -106,7 +111,8 @@ public class Execution {
"responseHeaders": responseHeaders.map { $0.toMap() } as Any,
"logs": logs as Any,
"errors": errors as Any,
"duration": duration as Any
"duration": duration as Any,
"scheduledAt": scheduledAt as Any
]
}

Expand All @@ -127,7 +133,8 @@ public class Execution {
responseHeaders: (map["responseHeaders"] as! [[String: Any]]).map { Headers.from(map: $0) },
logs: map["logs"] as! String,
errors: map["errors"] as! String,
duration: map["duration"] as! Double
duration: map["duration"] as! Double,
scheduledAt: map["scheduledAt"] as? String?
)
}
}
Loading