Skip to content

Commit 7a99c47

Browse files
committed
fix: add columns query param to insert and upsert methods
1 parent 65fd412 commit 7a99c47

File tree

6 files changed

+52
-94
lines changed

6 files changed

+52
-94
lines changed

Sources/PostgREST/NullEncodable.swift

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

Sources/PostgREST/PostgrestQueryBuilder.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ public final class PostgrestQueryBuilder: PostgrestBuilder {
6969
if !prefersHeaders.isEmpty {
7070
$0.request.headers["Prefer"] = prefersHeaders.joined(separator: ",")
7171
}
72+
if let body = $0.request.body, let jsonObject = try JSONSerialization.jsonObject(with: body) as? [[String: Any]] {
73+
let allKeys = jsonObject.flatMap(\.keys)
74+
let uniqueKeys = Set(allKeys).sorted()
75+
$0.request.query.append(URLQueryItem(name: "columns", value: uniqueKeys.joined(separator: ",")))
76+
}
7277
}
7378

7479
return PostgrestFilterBuilder(self)
@@ -109,6 +114,12 @@ public final class PostgrestQueryBuilder: PostgrestBuilder {
109114
if !prefersHeaders.isEmpty {
110115
$0.request.headers["Prefer"] = prefersHeaders.joined(separator: ",")
111116
}
117+
118+
if let body = $0.request.body, let jsonObject = try JSONSerialization.jsonObject(with: body) as? [[String: Any]] {
119+
let allKeys = jsonObject.flatMap(\.keys)
120+
let uniqueKeys = Set(allKeys).sorted()
121+
$0.request.query.append(URLQueryItem(name: "columns", value: uniqueKeys.joined(separator: ",")))
122+
}
112123
}
113124
return PostgrestFilterBuilder(self)
114125
}

Tests/PostgRESTTests/BuildURLRequestTests.swift

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ import XCTest
1010
import FoundationNetworking
1111
#endif
1212

13+
struct User: Encodable {
14+
var email: String
15+
var username: String?
16+
}
17+
1318
@MainActor
1419
final class BuildURLRequestTests: XCTestCase {
1520
let url = URL(string: "https://example.supabase.co")!
@@ -55,7 +60,16 @@ final class BuildURLRequestTests: XCTestCase {
5560
},
5661
TestCase(name: "insert new user") { client in
5762
try await client.from("users")
58-
.insert(["email": "[email protected]"])
63+
.insert(User(email: "[email protected]"))
64+
},
65+
TestCase(name: "bulk insert users") { client in
66+
try await client.from("users")
67+
.insert(
68+
[
69+
User(email: "[email protected]"),
70+
User(email: "[email protected]", username: "johndoe2"),
71+
]
72+
)
5973
},
6074
TestCase(name: "call rpc") { client in
6175
try await client.rpc("test_fcn", params: ["KEY": "VALUE"])
@@ -89,11 +103,20 @@ final class BuildURLRequestTests: XCTestCase {
89103
},
90104
TestCase(name: "test upsert not ignoring duplicates") { client in
91105
try await client.from("users")
92-
.upsert(["email": "[email protected]"])
106+
.upsert(User(email: "[email protected]"))
107+
},
108+
TestCase(name: "bulk upsert") { client in
109+
try await client.from("users")
110+
.upsert(
111+
[
112+
User(email: "[email protected]"),
113+
User(email: "[email protected]", username: "johndoe2"),
114+
]
115+
)
93116
},
94117
TestCase(name: "test upsert ignoring duplicates") { client in
95118
try await client.from("users")
96-
.upsert(["email": "[email protected]"], ignoreDuplicates: true)
119+
.upsert(User(email: "[email protected]"), ignoreDuplicates: true)
97120
},
98121
TestCase(name: "query with + character") { client in
99122
await client.from("users")

Tests/PostgRESTTests/NullEncodableTests.swift

Lines changed: 0 additions & 49 deletions
This file was deleted.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
curl \
2+
--request POST \
3+
--header "Accept: application/json" \
4+
--header "Content-Type: application/json" \
5+
--header "X-Client-Info: postgrest-swift/x.y.z" \
6+
--data "[{\"email\":\"[email protected]\"},{\"email\":\"[email protected]\",\"username\":\"johndoe2\"}]" \
7+
"https://example.supabase.co/users?columns=email,username"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
curl \
2+
--request POST \
3+
--header "Accept: application/json" \
4+
--header "Content-Type: application/json" \
5+
--header "Prefer: resolution=merge-duplicates,return=representation" \
6+
--header "X-Client-Info: postgrest-swift/x.y.z" \
7+
--data "[{\"email\":\"[email protected]\"},{\"email\":\"[email protected]\",\"username\":\"johndoe2\"}]" \
8+
"https://example.supabase.co/users?columns=email,username"

0 commit comments

Comments
 (0)