Skip to content

Commit c7db5ab

Browse files
Merge pull request #118 from appwrite/dev
feat: Apple SDK update for version 18.0.0
2 parents 5139018 + f1840fc commit c7db5ab

10 files changed

Lines changed: 46 additions & 177 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Change Log
22

3+
## 18.0.0
4+
5+
* Breaking: `avatars.getScreenshot` `theme` parameter now uses the `BrowserTheme` enum
6+
* Breaking: Removed generic type parameters from `presences` service methods
7+
* Added: `BrowserTheme` enum
8+
* Updated: `Presence` model is now concrete and adds a `metadata` field
9+
310
## 17.1.1
411

512
* Fixed: Removed `Advisor` service and `Insight`, `InsightCTA`, `InsightList`, `Report`, `ReportList` models (admin-only endpoints, not intended for client SDKs)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Add the package to your `Package.swift` dependencies:
3131

3232
```swift
3333
dependencies: [
34-
.package(url: "git@github.com:appwrite/sdk-for-apple.git", from: "17.2.0"),
34+
.package(url: "git@github.com:appwrite/sdk-for-apple.git", from: "18.0.0"),
3535
],
3636
```
3737

Sources/Appwrite/Client.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ open class Client {
2727
"x-sdk-name": "Apple",
2828
"x-sdk-platform": "client",
2929
"x-sdk-language": "apple",
30-
"x-sdk-version": "17.2.0",
30+
"x-sdk-version": "18.0.0",
3131
"x-appwrite-response-format": "1.9.5"
3232
]
3333

Sources/Appwrite/Services/Avatars.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ open class Avatars: Service {
308308
/// - viewportWidth: Int (optional)
309309
/// - viewportHeight: Int (optional)
310310
/// - scale: Double (optional)
311-
/// - theme: AppwriteEnums.Theme (optional)
311+
/// - theme: AppwriteEnums.BrowserTheme (optional)
312312
/// - userAgent: String (optional)
313313
/// - fullpage: Bool (optional)
314314
/// - locale: String (optional)
@@ -332,7 +332,7 @@ open class Avatars: Service {
332332
viewportWidth: Int? = nil,
333333
viewportHeight: Int? = nil,
334334
scale: Double? = nil,
335-
theme: AppwriteEnums.Theme? = nil,
335+
theme: AppwriteEnums.BrowserTheme? = nil,
336336
userAgent: String? = nil,
337337
fullpage: Bool? = nil,
338338
locale: String? = nil,

Sources/Appwrite/Services/Presences.swift

Lines changed: 20 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,13 @@ open class Presences: Service {
1717
/// - total: Bool (optional)
1818
/// - ttl: Int (optional)
1919
/// - Throws: Exception if the request fails
20-
/// - Returns: AppwriteModels.PresenceList<T>
20+
/// - Returns: AppwriteModels.PresenceList
2121
///
22-
open func list<T>(
22+
open func list(
2323
queries: [String]? = nil,
2424
total: Bool? = nil,
25-
ttl: Int? = nil,
26-
nestedType: T.Type
27-
) async throws -> AppwriteModels.PresenceList<T> {
25+
ttl: Int? = nil
26+
) async throws -> AppwriteModels.PresenceList {
2827
let apiPath: String = "/presences"
2928

3029
let apiParams: [String: Any?] = [
@@ -35,7 +34,7 @@ open class Presences: Service {
3534

3635
let apiHeaders: [String: String] = [:]
3736

38-
let converter: (Any) throws -> AppwriteModels.PresenceList<T> = { response in
37+
let converter: (Any) throws -> AppwriteModels.PresenceList = { response in
3938
return AppwriteModels.PresenceList.from(map: response as! [String: Any])
4039
}
4140

@@ -48,30 +47,6 @@ open class Presences: Service {
4847
)
4948
}
5049

51-
///
52-
/// List presence logs. Expired entries are filtered out automatically.
53-
///
54-
///
55-
/// - Parameters:
56-
/// - queries: [String] (optional)
57-
/// - total: Bool (optional)
58-
/// - ttl: Int (optional)
59-
/// - Throws: Exception if the request fails
60-
/// - Returns: AppwriteModels.PresenceList<T>
61-
///
62-
open func list(
63-
queries: [String]? = nil,
64-
total: Bool? = nil,
65-
ttl: Int? = nil
66-
) async throws -> AppwriteModels.PresenceList<[String: AnyCodable]> {
67-
return try await list(
68-
queries: queries,
69-
total: total,
70-
ttl: ttl,
71-
nestedType: [String: AnyCodable].self
72-
)
73-
}
74-
7550
///
7651
/// Get a presence log by its unique ID. Entries whose `expiresAt` is in the
7752
/// past are treated as not found.
@@ -80,20 +55,19 @@ open class Presences: Service {
8055
/// - Parameters:
8156
/// - presenceId: String
8257
/// - Throws: Exception if the request fails
83-
/// - Returns: AppwriteModels.Presence<T>
58+
/// - Returns: AppwriteModels.Presence
8459
///
85-
open func get<T>(
86-
presenceId: String,
87-
nestedType: T.Type
88-
) async throws -> AppwriteModels.Presence<T> {
60+
open func get(
61+
presenceId: String
62+
) async throws -> AppwriteModels.Presence {
8963
let apiPath: String = "/presences/{presenceId}"
9064
.replacingOccurrences(of: "{presenceId}", with: presenceId)
9165

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

9468
let apiHeaders: [String: String] = [:]
9569

96-
let converter: (Any) throws -> AppwriteModels.Presence<T> = { response in
70+
let converter: (Any) throws -> AppwriteModels.Presence = { response in
9771
return AppwriteModels.Presence.from(map: response as! [String: Any])
9872
}
9973

@@ -106,25 +80,6 @@ open class Presences: Service {
10680
)
10781
}
10882

109-
///
110-
/// Get a presence log by its unique ID. Entries whose `expiresAt` is in the
111-
/// past are treated as not found.
112-
///
113-
///
114-
/// - Parameters:
115-
/// - presenceId: String
116-
/// - Throws: Exception if the request fails
117-
/// - Returns: AppwriteModels.Presence<T>
118-
///
119-
open func get(
120-
presenceId: String
121-
) async throws -> AppwriteModels.Presence<[String: AnyCodable]> {
122-
return try await get(
123-
presenceId: presenceId,
124-
nestedType: [String: AnyCodable].self
125-
)
126-
}
127-
12883
///
12984
/// Create or update a presence log by its user ID.
13085
///
@@ -136,16 +91,15 @@ open class Presences: Service {
13691
/// - expiresAt: String (optional)
13792
/// - metadata: Any (optional)
13893
/// - Throws: Exception if the request fails
139-
/// - Returns: AppwriteModels.Presence<T>
94+
/// - Returns: AppwriteModels.Presence
14095
///
141-
open func upsert<T>(
96+
open func upsert(
14297
presenceId: String,
14398
status: String,
14499
permissions: [String]? = nil,
145100
expiresAt: String? = nil,
146-
metadata: Any? = nil,
147-
nestedType: T.Type
148-
) async throws -> AppwriteModels.Presence<T> {
101+
metadata: Any? = nil
102+
) async throws -> AppwriteModels.Presence {
149103
let apiPath: String = "/presences/{presenceId}"
150104
.replacingOccurrences(of: "{presenceId}", with: presenceId)
151105

@@ -160,7 +114,7 @@ open class Presences: Service {
160114
"content-type": "application/json"
161115
]
162116

163-
let converter: (Any) throws -> AppwriteModels.Presence<T> = { response in
117+
let converter: (Any) throws -> AppwriteModels.Presence = { response in
164118
return AppwriteModels.Presence.from(map: response as! [String: Any])
165119
}
166120

@@ -173,36 +127,6 @@ open class Presences: Service {
173127
)
174128
}
175129

176-
///
177-
/// Create or update a presence log by its user ID.
178-
///
179-
///
180-
/// - Parameters:
181-
/// - presenceId: String
182-
/// - status: String
183-
/// - permissions: [String] (optional)
184-
/// - expiresAt: String (optional)
185-
/// - metadata: Any (optional)
186-
/// - Throws: Exception if the request fails
187-
/// - Returns: AppwriteModels.Presence<T>
188-
///
189-
open func upsert(
190-
presenceId: String,
191-
status: String,
192-
permissions: [String]? = nil,
193-
expiresAt: String? = nil,
194-
metadata: Any? = nil
195-
) async throws -> AppwriteModels.Presence<[String: AnyCodable]> {
196-
return try await upsert(
197-
presenceId: presenceId,
198-
status: status,
199-
permissions: permissions,
200-
expiresAt: expiresAt,
201-
metadata: metadata,
202-
nestedType: [String: AnyCodable].self
203-
)
204-
}
205-
206130
///
207131
/// Update a presence log by its unique ID. Using the patch method you can pass
208132
/// only specific fields that will get updated.
@@ -216,17 +140,16 @@ open class Presences: Service {
216140
/// - permissions: [String] (optional)
217141
/// - purge: Bool (optional)
218142
/// - Throws: Exception if the request fails
219-
/// - Returns: AppwriteModels.Presence<T>
143+
/// - Returns: AppwriteModels.Presence
220144
///
221-
open func update<T>(
145+
open func update(
222146
presenceId: String,
223147
status: String? = nil,
224148
expiresAt: String? = nil,
225149
metadata: Any? = nil,
226150
permissions: [String]? = nil,
227-
purge: Bool? = nil,
228-
nestedType: T.Type
229-
) async throws -> AppwriteModels.Presence<T> {
151+
purge: Bool? = nil
152+
) async throws -> AppwriteModels.Presence {
230153
let apiPath: String = "/presences/{presenceId}"
231154
.replacingOccurrences(of: "{presenceId}", with: presenceId)
232155

@@ -242,7 +165,7 @@ open class Presences: Service {
242165
"content-type": "application/json"
243166
]
244167

245-
let converter: (Any) throws -> AppwriteModels.Presence<T> = { response in
168+
let converter: (Any) throws -> AppwriteModels.Presence = { response in
246169
return AppwriteModels.Presence.from(map: response as! [String: Any])
247170
}
248171

@@ -255,40 +178,6 @@ open class Presences: Service {
255178
)
256179
}
257180

258-
///
259-
/// Update a presence log by its unique ID. Using the patch method you can pass
260-
/// only specific fields that will get updated.
261-
///
262-
///
263-
/// - Parameters:
264-
/// - presenceId: String
265-
/// - status: String (optional)
266-
/// - expiresAt: String (optional)
267-
/// - metadata: Any (optional)
268-
/// - permissions: [String] (optional)
269-
/// - purge: Bool (optional)
270-
/// - Throws: Exception if the request fails
271-
/// - Returns: AppwriteModels.Presence<T>
272-
///
273-
open func update(
274-
presenceId: String,
275-
status: String? = nil,
276-
expiresAt: String? = nil,
277-
metadata: Any? = nil,
278-
permissions: [String]? = nil,
279-
purge: Bool? = nil
280-
) async throws -> AppwriteModels.Presence<[String: AnyCodable]> {
281-
return try await update(
282-
presenceId: presenceId,
283-
status: status,
284-
expiresAt: expiresAt,
285-
metadata: metadata,
286-
permissions: permissions,
287-
purge: purge,
288-
nestedType: [String: AnyCodable].self
289-
)
290-
}
291-
292181
///
293182
/// Delete a presence log by its unique ID.
294183
///
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Foundation
22

3-
public enum Theme: String, Codable, CustomStringConvertible {
3+
public enum BrowserTheme: String, Codable, CustomStringConvertible {
44
case light = "light"
55
case dark = "dark"
66

Sources/AppwriteModels/Document.swift

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,7 @@ open class Document<T : Codable>: Codable {
100100
createdAt: map["$createdAt"] as? String ?? "",
101101
updatedAt: map["$updatedAt"] as? String ?? "",
102102
permissions: map["$permissions"] as? [String] ?? [],
103-
data: try! JSONDecoder().decode(T.self, from: {
104-
let raw = map["data"]
105-
if let dict = raw as? [String: Any] {
106-
return try! JSONSerialization.data(withJSONObject: dict, options: [])
107-
} else if let raw = raw, JSONSerialization.isValidJSONObject(raw) {
108-
return try! JSONSerialization.data(withJSONObject: raw, options: [])
109-
} else {
110-
return try! JSONSerialization.data(withJSONObject: [:] as [String: Any], options: [])
111-
}
112-
}())
103+
data: try! JSONDecoder().decode(T.self, from: JSONSerialization.data(withJSONObject: map["data"] as? [String: Any] ?? map, options: []))
113104
)
114105
}
115106
}

Sources/AppwriteModels/Presence.swift

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Foundation
22
import JSONCodable
33

44
/// Presence
5-
open class Presence<T : Codable>: Codable {
5+
open class Presence: Codable {
66

77
enum CodingKeys: String, CodingKey {
88
case id = "$id"
@@ -32,8 +32,8 @@ open class Presence<T : Codable>: Codable {
3232
public let source: String
3333
/// Presence expiry date in ISO 8601 format.
3434
public let expiresAt: String?
35-
/// Additional properties
36-
public let metadata: T
35+
/// Presence metadata.
36+
public let metadata: [String: AnyCodable]?
3737

3838
init(
3939
id: String,
@@ -44,7 +44,7 @@ open class Presence<T : Codable>: Codable {
4444
status: String?,
4545
source: String,
4646
expiresAt: String?,
47-
metadata: T
47+
metadata: [String: AnyCodable]?
4848
) {
4949
self.id = id
5050
self.createdAt = createdAt
@@ -68,7 +68,7 @@ open class Presence<T : Codable>: Codable {
6868
self.status = try container.decodeIfPresent(String.self, forKey: .status)
6969
self.source = try container.decode(String.self, forKey: .source)
7070
self.expiresAt = try container.decodeIfPresent(String.self, forKey: .expiresAt)
71-
self.metadata = try container.decode(T.self, forKey: .metadata)
71+
self.metadata = try container.decodeIfPresent([String: AnyCodable].self, forKey: .metadata)
7272
}
7373

7474
public func encode(to encoder: Encoder) throws {
@@ -82,7 +82,7 @@ open class Presence<T : Codable>: Codable {
8282
try container.encodeIfPresent(status, forKey: .status)
8383
try container.encode(source, forKey: .source)
8484
try container.encodeIfPresent(expiresAt, forKey: .expiresAt)
85-
try container.encode(metadata, forKey: .metadata)
85+
try container.encodeIfPresent(metadata, forKey: .metadata)
8686
}
8787

8888
public func toMap() -> [String: Any] {
@@ -95,7 +95,7 @@ open class Presence<T : Codable>: Codable {
9595
"status": status as Any,
9696
"source": source as Any,
9797
"expiresAt": expiresAt as Any,
98-
"metadata": (try! JSONSerialization.jsonObject(with: JSONEncoder().encode(metadata))) as? [String: Any] ?? [:]
98+
"metadata": metadata as Any
9999
]
100100
}
101101

@@ -109,16 +109,7 @@ open class Presence<T : Codable>: Codable {
109109
status: map["status"] as? String,
110110
source: map["source"] as! String,
111111
expiresAt: map["expiresAt"] as? String,
112-
metadata: try! JSONDecoder().decode(T.self, from: {
113-
let raw = map["metadata"]
114-
if let dict = raw as? [String: Any] {
115-
return try! JSONSerialization.data(withJSONObject: dict, options: [])
116-
} else if let raw = raw, JSONSerialization.isValidJSONObject(raw) {
117-
return try! JSONSerialization.data(withJSONObject: raw, options: [])
118-
} else {
119-
return try! JSONSerialization.data(withJSONObject: [:] as [String: Any], options: [])
120-
}
121-
}())
112+
metadata: (map["metadata"] as? [String: Any] ?? [:]).mapValues { AnyCodable($0) }
122113
)
123114
}
124115
}

0 commit comments

Comments
 (0)