Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
91 changes: 91 additions & 0 deletions lib/EventTypes.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
<?php

namespace WorkOS;

/**
* Common event types for IDE autocomplete.
* This list is NOT exhaustive - the API accepts additional values.
* @see https://workos.com/docs/events
*/
class EventTypes
{
// Authentication Events
public const AUTHENTICATION_EMAIL_VERIFICATION_SUCCEEDED = 'authentication.email_verification_succeeded';
public const AUTHENTICATION_MAGIC_AUTH_FAILED = 'authentication.magic_auth_failed';
public const AUTHENTICATION_MAGIC_AUTH_SUCCEEDED = 'authentication.magic_auth_succeeded';
public const AUTHENTICATION_MFA_FAILED = 'authentication.mfa_failed';
public const AUTHENTICATION_MFA_SUCCEEDED = 'authentication.mfa_succeeded';
public const AUTHENTICATION_OAUTH_FAILED = 'authentication.oauth_failed';
public const AUTHENTICATION_OAUTH_SUCCEEDED = 'authentication.oauth_succeeded';
public const AUTHENTICATION_PASSWORD_FAILED = 'authentication.password_failed';
public const AUTHENTICATION_PASSWORD_SUCCEEDED = 'authentication.password_succeeded';
public const AUTHENTICATION_PASSKEY_FAILED = 'authentication.passkey_failed';
public const AUTHENTICATION_PASSKEY_SUCCEEDED = 'authentication.passkey_succeeded';
public const AUTHENTICATION_SSO_FAILED = 'authentication.sso_failed';
public const AUTHENTICATION_SSO_SUCCEEDED = 'authentication.sso_succeeded';
public const AUTHENTICATION_RADAR_RISK_DETECTED = 'authentication.radar_risk_detected';

// Connection Events
public const CONNECTION_ACTIVATED = 'connection.activated';
public const CONNECTION_DEACTIVATED = 'connection.deactivated';
public const CONNECTION_DELETED = 'connection.deleted';
public const CONNECTION_SAML_CERTIFICATE_RENEWED = 'connection.saml_certificate_renewed';
public const CONNECTION_SAML_CERTIFICATE_RENEWAL_REQUIRED = 'connection.saml_certificate_renewal_required';

// DSync Events
public const DSYNC_ACTIVATED = 'dsync.activated';
public const DSYNC_DELETED = 'dsync.deleted';
public const DSYNC_GROUP_CREATED = 'dsync.group.created';
public const DSYNC_GROUP_DELETED = 'dsync.group.deleted';
public const DSYNC_GROUP_UPDATED = 'dsync.group.updated';
public const DSYNC_GROUP_USER_ADDED = 'dsync.group.user_added';
public const DSYNC_GROUP_USER_REMOVED = 'dsync.group.user_removed';
public const DSYNC_USER_CREATED = 'dsync.user.created';
public const DSYNC_USER_DELETED = 'dsync.user.deleted';
public const DSYNC_USER_UPDATED = 'dsync.user.updated';

// Email Verification Events
public const EMAIL_VERIFICATION_CREATED = 'email_verification.created';

// Flag Events
public const FLAG_CREATED = 'flag.created';
public const FLAG_UPDATED = 'flag.updated';
public const FLAG_DELETED = 'flag.deleted';
public const FLAG_RULE_UPDATED = 'flag.rule_updated';

// Invitation Events
public const INVITATION_ACCEPTED = 'invitation.accepted';
public const INVITATION_CREATED = 'invitation.created';
public const INVITATION_REVOKED = 'invitation.revoked';

// Organization Events
public const ORGANIZATION_CREATED = 'organization.created';
public const ORGANIZATION_UPDATED = 'organization.updated';
public const ORGANIZATION_DELETED = 'organization.deleted';
public const ORGANIZATION_DOMAIN_CREATED = 'organization_domain.created';
public const ORGANIZATION_DOMAIN_UPDATED = 'organization_domain.updated';
public const ORGANIZATION_DOMAIN_DELETED = 'organization_domain.deleted';
public const ORGANIZATION_DOMAIN_VERIFIED = 'organization_domain.verified';
public const ORGANIZATION_DOMAIN_VERIFICATION_FAILED = 'organization_domain.verification_failed';
public const ORGANIZATION_MEMBERSHIP_CREATED = 'organization_membership.created';
public const ORGANIZATION_MEMBERSHIP_DELETED = 'organization_membership.deleted';
public const ORGANIZATION_MEMBERSHIP_UPDATED = 'organization_membership.updated';

// Password Reset Events
public const PASSWORD_RESET_CREATED = 'password_reset.created';
public const PASSWORD_RESET_SUCCEEDED = 'password_reset.succeeded';

// Role Events
public const ROLE_CREATED = 'role.created';
public const ROLE_DELETED = 'role.deleted';
public const ROLE_UPDATED = 'role.updated';

// Session Events
public const SESSION_CREATED = 'session.created';
public const SESSION_REVOKED = 'session.revoked';

// User Events
public const USER_CREATED = 'user.created';
public const USER_DELETED = 'user.deleted';
public const USER_UPDATED = 'user.updated';
}
44 changes: 44 additions & 0 deletions lib/Events.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

namespace WorkOS;

/**
* Class Events
*
* This class facilitates the use of WorkOS Events API.
*/
class Events
{
/**
* List events with optional filtering and pagination.
*
* @param array $params Optional parameters:
* - **events** (string|array): Comma-separated string or array of event types to filter by (required - at least one event type must be specified)
* - **organization_id** (string): Filter events by organization ID
* - **limit** (int): Number of events to return
* - **after** (string): Cursor for pagination (object ID)
* - **before** (string): Cursor for pagination (object ID)
* - **order** (string): Sort order - 'asc' or 'desc'
*
* @throws Exception\WorkOSException
*
* @return array{null, string|null, array<Resource\Event>} Returns [before, after, events] where before is always null for Events API
*/
public function listEvents($params = [])
{
$eventsPath = "events";

// Handle events parameter - convert array to comma-separated string
if (isset($params['events']) && is_array($params['events'])) {
$params['events'] = implode(',', $params['events']);
}

$response = Client::request(Client::METHOD_GET, $eventsPath, null, $params, true);
$events = [];
foreach ($response["data"] as $responseData) {
\array_push($events, Resource\Event::constructFromResponse($responseData));
}
$after = $response["list_metadata"]["after"] ?? null;
return [null, $after, $events];
}
}
174 changes: 174 additions & 0 deletions lib/Resource/Event.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
<?php

namespace WorkOS\Resource;

/**
* Class Event
*
* Represents a WorkOS Event resource.
*/
class Event extends BaseWorkOSResource
{
public const RESOURCE_TYPE = "event";

public const RESOURCE_ATTRIBUTES = [
"id",
"object",
"event",
"data",
"createdAt",
];

public const RESPONSE_TO_RESOURCE_KEY = [
"id" => "id",
"object" => "object",
"event" => "event",
"data" => "data",
"created_at" => "createdAt",
];

/**
* Get the event ID.
*
* @return string
*/
public function getId()
{
return $this->values["id"];
}

/**
* Get the event object type.
*
* @return string
*/
public function getObject()
{
return $this->values["object"];
}

/**
* Get the event type.
*
* @return string
*/
public function getEvent()
{
return $this->values["event"];
}

/**
* Get the event data.
*
* @return array
*/
public function getData()
{
return $this->values["data"];
}

/**
* Get the event creation timestamp.
*
* @return string
*/
public function getCreatedAt()
{
return $this->values["createdAt"];
}

/**
* Get formatted creation date.
*
* @param string $format PHP date format (default: 'Y-m-d H:i:s')
*
* @return string
*/
public function getFormattedCreatedAt($format = 'Y-m-d H:i:s')
{
return date($format, strtotime($this->values["createdAt"]));
}

/**
* Check if event is of a specific type.
*
* @param string $eventType The event type to check
*
* @return bool
*/
public function isEventType($eventType)
{
return $this->values["event"] === $eventType;
}

/**
* Check if event is an authentication event.
*
* @return bool
*/
public function isAuthenticationEvent()
{
return strpos($this->values["event"], 'authentication.') === 0;
}

/**
* Check if event is a user event.
*
* @return bool
*/
public function isUserEvent()
{
return strpos($this->values["event"], 'user.') === 0;
}

/**
* Check if event is an organization event.
*
* @return bool
*/
public function isOrganizationEvent()
{
return strpos($this->values["event"], 'organization') === 0;
}

/**
* Check if event is a DSync event.
*
* @return bool
*/
public function isDSyncEvent()
{
return strpos($this->values["event"], 'dsync.') === 0;
}

/**
* Get a specific data field from the event data.
*
* @param string $key The data key to retrieve
* @param mixed $default Default value if key doesn't exist
*
* @return mixed
*/
public function getDataField($key, $default = null)
{
$data = $this->values["data"];

if (is_array($data) && array_key_exists($key, $data)) {
return $data[$key];
}

return $default;
}

/**
* Get the event data as JSON string.
*
* @param int $options JSON encoding options
*
* @return string
*/
public function getDataAsJson($options = JSON_PRETTY_PRINT)
{
return json_encode($this->values["data"], $options);
}
}
1 change: 1 addition & 0 deletions lib/WorkOS.php
Original file line number Diff line number Diff line change
Expand Up @@ -162,4 +162,5 @@ private static function getEnvVariable($key)

return false;
}

}
Loading