Skip to content

Commit 8baacc9

Browse files
authored
feat: Add missing hook triggers (#224)
* feat: Add missing hook triggers * lint * nits * add test
1 parent 700ee23 commit 8baacc9

6 files changed

Lines changed: 134 additions & 112 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@
22
# Parse-Swift Changelog
33

44
### main
5-
[Full Changelog](https://github.com/netreconlab/Parse-Swift/compare/6.0.0-beta.1...main), [Documentation](https://swiftpackageindex.com/netreconlab/Parse-Swift/main/documentation/parseswift)
5+
[Full Changelog](https://github.com/netreconlab/Parse-Swift/compare/6.0.0...main), [Documentation](https://swiftpackageindex.com/netreconlab/Parse-Swift/main/documentation/parseswift)
66
* _Contributing to this repo? Add info about your change here to be included in the next release_
77

8-
### 6.0.0-beta.1
9-
[Full Changelog](https://github.com/netreconlab/Parse-Swift/compare/5.12.3...6.0.0-beta.1), [Documentation](https://swiftpackageindex.com/netreconlab/Parse-Swift/6.0.0-beta.1/documentation/parseswift)
8+
### 6.0.0
9+
[Full Changelog](https://github.com/netreconlab/Parse-Swift/compare/5.12.3...6.0.0), [Documentation](https://swiftpackageindex.com/netreconlab/Parse-Swift/6.0.0/documentation/parseswift)
1010

1111
__Breaking Changes__
1212
* Update SDK to be Swift 6.0+ compliant. This includes making all objects `Sendable` and reducing the possibility of data races. Added WASM support. Multiple batches now perform asynchronously ([#208](https://github.com/netreconlab/Parse-Swift/pull/208)), thanks to [Corey Baker](https://github.com/cbaker6).
1313
* Remove all deprecated code and warnings ([#211](https://github.com/netreconlab/Parse-Swift/pull/211)), thanks to [Corey Baker](https://github.com/cbaker6).
1414

15+
__New features__
16+
* Add missing hook triggers: `beforePasswordResetRequest` for `ParseUser`, and `beforeFind` and `afterFind` for `ParseFile` ([#224](https://github.com/netreconlab/Parse-Swift/pull/224)), thanks to [Corey Baker](https://github.com/cbaker6).
17+
1518
### 5.12.3
1619
[Full Changelog](https://github.com/netreconlab/Parse-Swift/compare/5.12.2...5.12.3), [Documentation](https://swiftpackageindex.com/netreconlab/Parse-Swift/5.12.3/documentation/parseswift)
1720

Sources/ParseSwift/ParseConstants.swift

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -49,30 +49,33 @@ enum Method: String {
4949
The types of Parse Hook Triggers available.
5050
*/
5151
public enum ParseHookTriggerType: String, Codable, Sendable {
52-
/// Occurs before login of a `ParseUser`.
53-
case beforeLogin
54-
/// Occurs after login of a `ParseUser`.
55-
case afterLogin
56-
/// Occurs after logout of a `ParseUser`.
57-
case afterLogout
58-
/// Occurs before saving a `ParseObject`, `ParseFile`, or `ParseConfig`.
59-
case beforeSave
60-
/// Occurs after saving a `ParseObject`, `ParseFile`, or `ParseConfig`.
61-
case afterSave
62-
/// Occurs before deleting a `ParseObject` or `ParseFile`.
63-
case beforeDelete
64-
/// Occurs after deleting a `ParseObject` or `ParseFile`.
65-
case afterDelete
66-
/// Occurs before finding a `ParseObject`.
67-
case beforeFind
68-
/// Occurs after finding a `ParseObject`.
69-
case afterFind
70-
/// Occurs before a `ParseLiveQuery` connection is made.
71-
case beforeConnect
72-
/// Occurs before a `ParseLiveQuery` subscription is made.
73-
case beforeSubscribe
74-
/// Occurs after a `ParseLiveQuery` event.
75-
case afterEvent
52+
/// Occurs before login of a `ParseUser`.
53+
case beforeLogin
54+
/// Occurs after login of a `ParseUser`.
55+
case afterLogin
56+
/// Occurs after logout of a `ParseUser`.
57+
case afterLogout
58+
/// Occurs before password is reset on a `ParseUser`.
59+
/// - warning: Requires Parse Server 8.5.0+.
60+
case beforePasswordResetRequest
61+
/// Occurs before saving a `ParseObject`, `ParseFile`, or `ParseConfig`.
62+
case beforeSave
63+
/// Occurs after saving a `ParseObject`, `ParseFile`, or `ParseConfig`.
64+
case afterSave
65+
/// Occurs before deleting a `ParseObject` or `ParseFile`.
66+
case beforeDelete
67+
/// Occurs after deleting a `ParseObject` or `ParseFile`.
68+
case afterDelete
69+
/// Occurs before finding a `ParseObject` or `ParseFile`.
70+
case beforeFind
71+
/// Occurs after finding a `ParseObject` or `ParseFile`.
72+
case afterFind
73+
/// Occurs before a `ParseLiveQuery` connection is made.
74+
case beforeConnect
75+
/// Occurs before a `ParseLiveQuery` subscription is made.
76+
case beforeSubscribe
77+
/// Occurs after a `ParseLiveQuery` event.
78+
case afterEvent
7679
}
7780

7881
/**
@@ -86,7 +89,7 @@ public enum ParseHookTriggerObject: Sendable {
8689
/// Trigger on `ParseFile`'s.
8790
case file
8891
/// Trigger on `ParseConfig` updates.
89-
/// - warning: Requires Parse Server 7.3.0-alpha.6+.
92+
/// - warning: Requires Parse Server 7.3.0+.
9093
case config
9194
/// Trigger on `ParseLiveQuery` connections.
9295
case liveQueryConnect

Sources/ParseSwift/Protocols/ParseHookTriggerable.swift

Lines changed: 73 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -90,77 +90,79 @@ public extension ParseHookTriggerable {
9090
message: "This object \"\(object)\" currently does not support the hook trigger \"\(trigger)\""
9191
)
9292

93-
switch object {
94-
case .objectType(let parseObject):
95-
switch trigger {
96-
case .beforeLogin, .afterLogin, .afterLogout:
97-
guard parseObject is (any ParseUser.Type) else {
98-
throw notSupportedError
99-
}
100-
case .beforeSave, .afterSave, .beforeDelete,
101-
.afterDelete, .beforeFind, .afterFind,
102-
.beforeSubscribe, .afterEvent:
103-
break // No op
104-
default:
105-
throw notSupportedError
106-
}
107-
self.init(
108-
className: object.className,
109-
trigger: trigger,
110-
url: url
111-
)
112-
case .object(let parseObject):
113-
switch trigger {
114-
case .beforeLogin, .afterLogin, .afterLogout:
115-
guard parseObject is (any ParseUser) else {
116-
throw notSupportedError
117-
}
118-
case .beforeSave, .afterSave, .beforeDelete,
119-
.afterDelete, .beforeFind, .afterFind,
120-
.beforeSubscribe, .afterEvent:
121-
break // No op
122-
default:
123-
throw notSupportedError
124-
}
125-
self.init(
126-
className: object.className,
127-
trigger: trigger,
128-
url: url
129-
)
130-
case .file:
131-
switch trigger {
132-
case .beforeSave, .afterSave, .beforeDelete, .afterDelete:
133-
break // No op
134-
default:
135-
throw notSupportedError
136-
}
137-
self.init(
138-
className: object.className,
139-
trigger: trigger,
140-
url: url
141-
)
142-
case .config:
143-
switch trigger {
144-
case .beforeSave, .afterSave:
145-
break // No op
146-
default:
147-
throw notSupportedError
148-
}
149-
self.init(
150-
className: object.className,
151-
trigger: trigger,
152-
url: url
153-
)
154-
case .liveQueryConnect:
155-
guard trigger == .beforeConnect else {
156-
throw notSupportedError
157-
}
158-
self.init(
159-
className: object.className,
160-
trigger: trigger,
161-
url: url
162-
)
163-
}
93+
switch object {
94+
case .objectType(let parseObject):
95+
switch trigger {
96+
case .beforeLogin, .afterLogin, .afterLogout,
97+
.beforePasswordResetRequest:
98+
guard parseObject is (any ParseUser.Type) else {
99+
throw notSupportedError
100+
}
101+
case .beforeSave, .afterSave, .beforeDelete,
102+
.afterDelete, .beforeFind, .afterFind,
103+
.beforeSubscribe, .afterEvent:
104+
break // No op
105+
default:
106+
throw notSupportedError
107+
}
108+
self.init(
109+
className: object.className,
110+
trigger: trigger,
111+
url: url
112+
)
113+
case .object(let parseObject):
114+
switch trigger {
115+
case .beforeLogin, .afterLogin, .afterLogout, .beforePasswordResetRequest:
116+
guard parseObject is (any ParseUser) else {
117+
throw notSupportedError
118+
}
119+
case .beforeSave, .afterSave, .beforeDelete,
120+
.afterDelete, .beforeFind, .afterFind,
121+
.beforeSubscribe, .afterEvent:
122+
break // No op
123+
default:
124+
throw notSupportedError
125+
}
126+
self.init(
127+
className: object.className,
128+
trigger: trigger,
129+
url: url
130+
)
131+
case .file:
132+
switch trigger {
133+
case .beforeSave, .afterSave, .beforeDelete,
134+
.afterDelete, .beforeFind, .afterFind:
135+
break // No op
136+
default:
137+
throw notSupportedError
138+
}
139+
self.init(
140+
className: object.className,
141+
trigger: trigger,
142+
url: url
143+
)
144+
case .config:
145+
switch trigger {
146+
case .beforeSave, .afterSave:
147+
break // No op
148+
default:
149+
throw notSupportedError
150+
}
151+
self.init(
152+
className: object.className,
153+
trigger: trigger,
154+
url: url
155+
)
156+
case .liveQueryConnect:
157+
guard trigger == .beforeConnect else {
158+
throw notSupportedError
159+
}
160+
self.init(
161+
className: object.className,
162+
trigger: trigger,
163+
url: url
164+
)
165+
}
164166
}
165167
}
166168

Sources/ParseSwift/Types/ParseHookTriggerRequest.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public struct ParseHookTriggerRequest<U: ParseCloudUser>: ParseHookTriggerReques
2828
public var file: ParseFile?
2929
/// The size of the file in bytes.
3030
public var fileSize: Int?
31+
/// Force `ParseFile` download.
32+
public var forceDownload: Bool?
3133
var log: AnyCodable?
3234
var context: AnyCodable?
3335

@@ -37,7 +39,7 @@ public struct ParseHookTriggerRequest<U: ParseCloudUser>: ParseHookTriggerReques
3739
case trigger = "triggerName"
3840
case user, installationId, headers,
3941
log, context, file, fileSize,
40-
clients
42+
clients, forceDownload
4143
}
4244
}
4345

Tests/ParseSwiftTests/ParseHookTriggerRequestTests.swift

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -74,24 +74,29 @@ class ParseHookTriggerRequestTests: XCTestCase, @unchecked Sendable {
7474
}
7575

7676
func testCoding() async throws {
77-
let triggerRequest = ParseHookTriggerRequest<User>(primaryKey: true,
78-
ipAddress: "1.1.1.1",
79-
headers: ["yolo": "me"],
80-
trigger: .beforeDelete,
81-
file: ParseFile(data: Data()),
82-
fileSize: 0)
77+
let triggerRequest = ParseHookTriggerRequest<User>(
78+
primaryKey: true,
79+
ipAddress: "1.1.1.1",
80+
headers: ["yolo": "me"],
81+
trigger: .beforeDelete,
82+
file: ParseFile(data: Data()),
83+
fileSize: 0,
84+
forceDownload: true
85+
)
8386
// swiftlint:disable:next line_length
84-
let expected = "{\"file\":{\"__type\":\"File\",\"name\":\"file\"},\"fileSize\":0,\"headers\":{\"yolo\":\"me\"},\"ip\":\"1.1.1.1\",\"master\":true,\"triggerName\":\"beforeDelete\"}"
87+
let expected = "{\"file\":{\"__type\":\"File\",\"name\":\"file\"},\"fileSize\":0,\"forceDownload\":true,\"headers\":{\"yolo\":\"me\"},\"ip\":\"1.1.1.1\",\"master\":true,\"triggerName\":\"beforeDelete\"}"
8588
XCTAssertEqual(triggerRequest.description, expected)
8689
}
8790

8891
func testCodingObject() async throws {
8992
let object = User(objectId: "geez")
90-
let triggerRequest = ParseHookTriggerObjectRequest<User, User>(primaryKey: true,
91-
ipAddress: "1.1.1.1",
92-
headers: ["yolo": "me"],
93-
trigger: .beforeDelete,
94-
object: object)
93+
let triggerRequest = ParseHookTriggerObjectRequest<User, User>(
94+
primaryKey: true,
95+
ipAddress: "1.1.1.1",
96+
headers: ["yolo": "me"],
97+
trigger: .beforeDelete,
98+
object: object
99+
)
95100
// swiftlint:disable:next line_length
96101
let expected = "{\"headers\":{\"yolo\":\"me\"},\"ip\":\"1.1.1.1\",\"master\":true,\"object\":{\"objectId\":\"geez\"},\"triggerName\":\"beforeDelete\"}"
97102
XCTAssertEqual(triggerRequest.description, expected)

Tests/ParseSwiftTests/ParseHookTriggerTests.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,13 @@ class ParseHookTriggerTests: XCTestCase, @unchecked Sendable {
272272
url: url
273273
)
274274
)
275+
XCTAssertThrowsError(
276+
try ParseHookTrigger(
277+
object: ParseHookTriggerObject.objectType(GameScore.self),
278+
trigger: .beforePasswordResetRequest,
279+
url: url
280+
)
281+
)
275282
}
276283

277284
@MainActor

0 commit comments

Comments
 (0)