Skip to content

Commit b574f05

Browse files
zac-workoszdburragegreptile-apps[bot]nicknisiCopilot
authored
Add Events API Support (#292)
* add events api * Update src/test/kotlin/com/workos/test/events/EventsApiTest.kt Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * Update src/main/kotlin/com/workos/events/models/EventsJsonDeserializer.kt Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * move import to correct place * add aassertIs import * lint and add more tests * add full event type coverage * Update src/main/kotlin/com/workos/events/models/EventTypes.kt Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Zac Burrage <[email protected]> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: Nick Nisi <[email protected]> Co-authored-by: Copilot <[email protected]>
1 parent f710d5f commit b574f05

File tree

7 files changed

+699
-0
lines changed

7 files changed

+699
-0
lines changed

src/main/kotlin/com/workos/WorkOS.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.workos.common.http.OAuthErrorResponse
1717
import com.workos.common.http.RequestConfig
1818
import com.workos.common.http.UnprocessableEntityExceptionResponse
1919
import com.workos.directorysync.DirectorySyncApi
20+
import com.workos.events.EventsApi
2021
import com.workos.fga.FgaApi
2122
import com.workos.mfa.MfaApi
2223
import com.workos.organizations.OrganizationsApi
@@ -133,6 +134,12 @@ class WorkOS(
133134
@JvmField
134135
val fga = FgaApi(this)
135136

137+
/**
138+
* Module for interacting with the Events API.
139+
*/
140+
@JvmField
141+
val events = EventsApi(this)
142+
136143
/**
137144
* The base URL for making API requests to.
138145
*/
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.workos.events
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude
4+
import com.workos.WorkOS
5+
import com.workos.common.http.PaginationParams
6+
import com.workos.common.http.RequestConfig
7+
import com.workos.common.models.Order
8+
import com.workos.events.models.EventList
9+
10+
/**
11+
* The EventsApi provides convenience methods for working with the WorkOS Events API.
12+
*/
13+
class EventsApi(private val workos: WorkOS) {
14+
/**
15+
* Parameters for [listEvents].
16+
*
17+
* @param events A list of event type strings to filter by.
18+
* @param organizationId Optional organization to filter events for.
19+
* @param after See [com.workos.common.http.PaginationParams]
20+
* @param before See [com.workos.common.http.PaginationParams]
21+
* @param limit See [com.workos.common.http.PaginationParams]
22+
* @param order See [com.workos.common.http.PaginationParams]
23+
*/
24+
@JsonInclude(JsonInclude.Include.NON_NULL)
25+
class ListEventsOptions @JvmOverloads constructor(
26+
events: List<String>? = null,
27+
organizationId: String? = null,
28+
after: String? = null,
29+
before: String? = null,
30+
limit: Int? = null,
31+
order: Order? = null
32+
) : PaginationParams(after, before, limit, order) {
33+
init {
34+
if (events != null && events.isNotEmpty()) set("events", events.joinToString(","))
35+
if (organizationId != null) set("organization_id", organizationId)
36+
}
37+
38+
/**
39+
* @suppress
40+
*/
41+
companion object {
42+
@JvmStatic
43+
fun builder(): ListEventsOptionsBuilder {
44+
return ListEventsOptionsBuilder()
45+
}
46+
}
47+
48+
/**
49+
* Builder class for creating [ListEventsOptions].
50+
*/
51+
class ListEventsOptionsBuilder : PaginationParams.PaginationParamsBuilder<ListEventsOptions>(ListEventsOptions()) {
52+
/**
53+
* Sets the list of event types to filter on.
54+
*/
55+
fun events(value: List<String>) = apply { this.params["events"] = value.joinToString(",") }
56+
57+
/**
58+
* Filters events by organization.
59+
*/
60+
fun organizationId(value: String) = apply { this.params["organization_id"] = value }
61+
62+
override fun build(): ListEventsOptions {
63+
val options = ListEventsOptions()
64+
for ((key, value) in this.params) {
65+
options[key] = value
66+
}
67+
return options
68+
}
69+
}
70+
}
71+
72+
/**
73+
* Retrieve a list of events.
74+
*/
75+
fun listEvents(options: ListEventsOptions = ListEventsOptions()): EventList {
76+
val config = RequestConfig.builder()
77+
.params(options)
78+
.build()
79+
80+
return workos.get("/events", EventList::class.java, config)
81+
}
82+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.workos.events.models
2+
3+
import com.fasterxml.jackson.annotation.JsonCreator
4+
import com.fasterxml.jackson.annotation.JsonProperty
5+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
6+
7+
/**
8+
* Represents a WorkOS Event. Use subclasses for strongly-typed `data`.
9+
*/
10+
@JsonDeserialize(using = EventsJsonDeserializer::class)
11+
abstract class Event
12+
@JsonCreator constructor(
13+
@JvmField
14+
open val id: String,
15+
16+
@JvmField
17+
open val event: String,
18+
19+
@JvmField
20+
@JsonProperty("created_at")
21+
open val createdAt: String,
22+
23+
@JvmField
24+
open val context: Map<String, Any>? = null,
25+
26+
@JvmField
27+
@JsonProperty("object")
28+
open val obj: String = "event"
29+
)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.workos.events.models
2+
3+
import com.fasterxml.jackson.annotation.JsonCreator
4+
import com.fasterxml.jackson.annotation.JsonProperty
5+
import com.workos.common.models.ListMetadata
6+
7+
/**
8+
* A list of WorkOS [Event] resources.
9+
*/
10+
data class EventList
11+
@JsonCreator constructor(
12+
@JvmField
13+
@JsonProperty("object")
14+
val obj: String = "list",
15+
16+
@JvmField
17+
val data: List<Event>,
18+
19+
@JvmField
20+
@JsonProperty("list_metadata")
21+
val listMetadata: ListMetadata
22+
)
Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
package com.workos.events.models
2+
3+
import com.fasterxml.jackson.annotation.JsonCreator
4+
import com.fasterxml.jackson.annotation.JsonProperty
5+
import com.workos.directorysync.models.DirectoryUserRole
6+
import com.workos.directorysync.models.Group
7+
import com.workos.directorysync.models.UserState
8+
import com.workos.organizations.models.OrganizationDomain
9+
import com.workos.sso.models.Connection
10+
import com.workos.usermanagement.models.AuthenticationEventData
11+
import com.workos.usermanagement.models.EmailVerificationEventData
12+
import com.workos.usermanagement.models.InvitationEventData
13+
import com.workos.usermanagement.models.MagicAuthEventData
14+
import com.workos.usermanagement.models.OrganizationMembership
15+
import com.workos.usermanagement.models.PasswordResetEventData
16+
import com.workos.roles.models.Role as RolesRole
17+
import com.workos.usermanagement.models.User as UmUser
18+
19+
/**
20+
* Strongly-typed Event variants used by EventsJsonDeserializer.
21+
*/
22+
23+
data class OrganizationEvent
24+
@JsonCreator constructor(
25+
override val id: String,
26+
override val event: String,
27+
override val createdAt: String,
28+
override val context: Map<String, Any>? = null,
29+
val data: OrganizationEventData
30+
) : Event(id, event, createdAt, context)
31+
32+
data class ConnectionEvent
33+
@JsonCreator constructor(
34+
override val id: String,
35+
override val event: String,
36+
override val createdAt: String,
37+
override val context: Map<String, Any>? = null,
38+
val data: Connection
39+
) : Event(id, event, createdAt, context)
40+
data class DirectoryUserEvent
41+
@JsonCreator constructor(
42+
override val id: String,
43+
override val event: String,
44+
override val createdAt: String,
45+
override val context: Map<String, Any>? = null,
46+
val data: DirectoryUserMinimal
47+
) : Event(id, event, createdAt, context)
48+
49+
data class DirectoryGroupEvent
50+
@JsonCreator constructor(
51+
override val id: String,
52+
override val event: String,
53+
override val createdAt: String,
54+
override val context: Map<String, Any>? = null,
55+
val data: DirectoryGroupEventData
56+
) : Event(id, event, createdAt, context)
57+
58+
data class DirectoryEvent
59+
@JsonCreator constructor(
60+
override val id: String,
61+
override val event: String,
62+
override val createdAt: String,
63+
override val context: Map<String, Any>? = null,
64+
val data: DirectoryEventData
65+
) : Event(id, event, createdAt, context)
66+
67+
data class UserEvent
68+
@JsonCreator constructor(
69+
override val id: String,
70+
override val event: String,
71+
override val createdAt: String,
72+
override val context: Map<String, Any>? = null,
73+
val data: UmUser
74+
) : Event(id, event, createdAt, context)
75+
76+
data class AuthenticationEvent
77+
@JsonCreator constructor(
78+
override val id: String,
79+
override val event: String,
80+
override val createdAt: String,
81+
override val context: Map<String, Any>? = null,
82+
val data: AuthenticationEventData
83+
) : Event(id, event, createdAt, context)
84+
85+
data class EmailVerificationEvent
86+
@JsonCreator constructor(
87+
override val id: String,
88+
override val event: String,
89+
override val createdAt: String,
90+
override val context: Map<String, Any>? = null,
91+
val data: EmailVerificationEventData
92+
) : Event(id, event, createdAt, context)
93+
94+
data class MagicAuthEvent
95+
@JsonCreator constructor(
96+
override val id: String,
97+
override val event: String,
98+
override val createdAt: String,
99+
override val context: Map<String, Any>? = null,
100+
val data: MagicAuthEventData
101+
) : Event(id, event, createdAt, context)
102+
103+
data class InvitationEvent
104+
@JsonCreator constructor(
105+
override val id: String,
106+
override val event: String,
107+
override val createdAt: String,
108+
override val context: Map<String, Any>? = null,
109+
val data: InvitationEventData
110+
) : Event(id, event, createdAt, context)
111+
112+
data class PasswordResetEvent
113+
@JsonCreator constructor(
114+
override val id: String,
115+
override val event: String,
116+
override val createdAt: String,
117+
override val context: Map<String, Any>? = null,
118+
val data: PasswordResetEventData
119+
) : Event(id, event, createdAt, context)
120+
121+
data class OrganizationDomainEvent
122+
@JsonCreator constructor(
123+
override val id: String,
124+
override val event: String,
125+
override val createdAt: String,
126+
override val context: Map<String, Any>? = null,
127+
val data: OrganizationDomain
128+
) : Event(id, event, createdAt, context)
129+
130+
data class RoleEvent
131+
@JsonCreator constructor(
132+
override val id: String,
133+
override val event: String,
134+
override val createdAt: String,
135+
override val context: Map<String, Any>? = null,
136+
val data: RolesRole
137+
) : Event(id, event, createdAt, context)
138+
139+
data class OrganizationMembershipEvent
140+
@JsonCreator constructor(
141+
override val id: String,
142+
override val event: String,
143+
override val createdAt: String,
144+
override val context: Map<String, Any>? = null,
145+
val data: OrganizationMembership
146+
) : Event(id, event, createdAt, context)
147+
148+
data class EventDirectoryUser
149+
@JsonCreator constructor(
150+
@JsonProperty("id") val id: String,
151+
@JsonProperty("directory_id") val directoryId: String,
152+
@JsonProperty("organization_id") val organizationId: String?,
153+
@JsonProperty("idp_id") val idpId: String,
154+
@JsonProperty("first_name") val firstName: String?,
155+
@JsonProperty("last_name") val lastName: String?,
156+
val email: String?,
157+
val state: UserState,
158+
@JsonProperty("created_at") val createdAt: String,
159+
@JsonProperty("updated_at") val updatedAt: String,
160+
@JsonProperty("custom_attributes") val customAttributes: Map<String, Any?>,
161+
val role: DirectoryUserRole?,
162+
@JsonProperty("raw_attributes") val rawAttributes: Map<String, Any?>
163+
)
164+
165+
data class OrganizationEventData
166+
@JsonCreator constructor(
167+
val id: String,
168+
val name: String
169+
)
170+
171+
data class DirectoryEventData
172+
@JsonCreator constructor(
173+
val id: String,
174+
val name: String
175+
)
176+
177+
data class DirectoryGroupEventData
178+
@JsonCreator constructor(
179+
val id: String,
180+
val name: String
181+
)
182+
183+
data class DirectoryUserMinimal
184+
@JsonCreator constructor(
185+
val id: String,
186+
val email: String?
187+
)
188+
189+
data class SessionImpersonator
190+
@JsonCreator constructor(
191+
val email: String?,
192+
val reason: String?
193+
)
194+
195+
data class SessionEventData
196+
@JsonCreator constructor(
197+
val obj: String = "session",
198+
val id: String,
199+
@JsonProperty("user_id") val userId: String?,
200+
@JsonProperty("organization_id") val organizationId: String?,
201+
val impersonator: SessionImpersonator?,
202+
@JsonProperty("ip_address") val ipAddress: String?,
203+
@JsonProperty("user_agent") val userAgent: String?,
204+
@JsonProperty("created_at") val createdAt: String,
205+
@JsonProperty("updated_at") val updatedAt: String
206+
)
207+
208+
data class SessionEvent
209+
@JsonCreator constructor(
210+
override val id: String,
211+
override val event: String,
212+
override val createdAt: String,
213+
override val context: Map<String, Any>? = null,
214+
val data: SessionEventData
215+
) : Event(id, event, createdAt, context)
216+
217+
data class DirectoryGroupMembershipData
218+
@JsonCreator constructor(
219+
val user: EventDirectoryUser,
220+
val group: Group
221+
)
222+
223+
data class DirectoryGroupMembershipEvent
224+
@JsonCreator constructor(
225+
override val id: String,
226+
override val event: String,
227+
override val createdAt: String,
228+
override val context: Map<String, Any>? = null,
229+
val data: DirectoryGroupMembershipData
230+
) : Event(id, event, createdAt, context)
231+
232+
data class UnknownEvent
233+
@JsonCreator constructor(
234+
override val id: String,
235+
override val event: String,
236+
override val createdAt: String,
237+
override val context: Map<String, Any>? = null,
238+
val data: Any?
239+
) : Event(id, event, createdAt, context)

0 commit comments

Comments
 (0)