Skip to content
Merged
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
45 changes: 45 additions & 0 deletions lib/Organizations.php
Original file line number Diff line number Diff line change
Expand Up @@ -250,4 +250,49 @@ public function listOrganizationRoles($organizationId)

return [$roles];
}

/**
* List feature flags for an organization.
*
* @param string $organizationId WorkOS organization ID to fetch feature flags for
* @param int $limit Maximum number of records to return
* @param null|string $before FeatureFlag ID to look before
* @param null|string $after FeatureFlag ID to look after
* @param Resource\Order $order The Order in which to paginate records
*
* @throws Exception\WorkOSException
*
* @return array{?string, ?string, Resource\FeatureFlag[]} An array containing the FeatureFlag ID to use as before and after cursor, and an array of FeatureFlag instances
*/
public function listOrganizationFeatureFlags(
$organizationId,
$limit = self::DEFAULT_PAGE_SIZE,
$before = null,
$after = null,
$order = null
) {
$featureFlagsPath = "organizations/{$organizationId}/feature-flags";
$params = [
"limit" => $limit,
"before" => $before,
"after" => $after,
"order" => $order
];

$response = Client::request(
Client::METHOD_GET,
$featureFlagsPath,
null,
$params,
true
);

$featureFlags = [];
list($before, $after) = Util\Request::parsePaginationArgs($response);
foreach ($response["data"] as $responseData) {
\array_push($featureFlags, Resource\FeatureFlag::constructFromResponse($responseData));
}

return [$before, $after, $featureFlags];
}
}
37 changes: 37 additions & 0 deletions lib/Resource/FeatureFlag.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace WorkOS\Resource;

/**
* Class FeatureFlag.
*
* @property string $id
* @property string $slug
* @property string $name
* @property string $description
* @property string $createdAt
* @property string $updatedAt
*/

class FeatureFlag extends BaseWorkOSResource
{
public const RESOURCE_TYPE = "feature_flag";

public const RESOURCE_ATTRIBUTES = [
"id",
"slug",
"name",
"description",
"createdAt",
"updatedAt"
];

public const RESPONSE_TO_RESOURCE_KEY = [
"id" => "id",
"slug" => "slug",
"name" => "name",
"description" => "description",
"created_at" => "createdAt",
"updated_at" => "updatedAt"
];
}
27 changes: 27 additions & 0 deletions lib/Resource/VaultObject.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace WorkOS\Resource;

/**
* Class VaultObject.
*/
class VaultObject extends BaseWorkOSResource
{
public const RESOURCE_TYPE = "vault_object";

public const RESOURCE_ATTRIBUTES = [
"id",
"name",
"updatedAt",
"value",
"metadata"
];

public const RESPONSE_TO_RESOURCE_KEY = [
"id" => "id",
"name" => "name",
"updated_at" => "updatedAt",
"value" => "value",
"metadata" => "metadata"
];
}
78 changes: 78 additions & 0 deletions lib/Vault.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?php

namespace WorkOS;

/**
* Class Vault.
*
* This class facilitates the use of WorkOS Vault operations.
*/
class Vault
{
public const DEFAULT_PAGE_SIZE = 10;

/**
* Get a Vault Object.
*
* @param string $vaultObjectId The unique identifier for the vault object.
*
* @throws Exception\WorkOSException
*
* @return Resource\VaultObject
*/
public function getVaultObject($vaultObjectId)
{
$vaultObjectPath = "vault/v1/kv/{$vaultObjectId}";

$response = Client::request(Client::METHOD_GET, $vaultObjectPath, null, null, true);

return Resource\VaultObject::constructFromResponse($response);
}

/**
* List Vault Objects.
*
* @param int $limit Maximum number of records to return
* @param null|string $before Vault Object ID to look before
* @param null|string $after Vault Object ID to look after
* @param Resource\Order $order The Order in which to paginate records
*
* @return array{?string, ?string, Resource\VaultObject[]} An array containing the Vault Object ID to use as before and after cursor, and an array of VaultObject instances
*
* @throws Exception\WorkOSException
*/
public function listVaultObjects(
$limit = self::DEFAULT_PAGE_SIZE,
$before = null,
$after = null,
$order = null
) {
$vaultObjectsPath = "vault/v1/kv";
$params = [
"limit" => $limit,
"before" => $before,
"after" => $after,
"order" => $order
];

$response = Client::request(
Client::METHOD_GET,
$vaultObjectsPath,
null,
$params,
true
);

$vaultObjects = [];
list($before, $after) = Util\Request::parsePaginationArgs($response);
foreach ($response["data"] as $responseData) {
\array_push($vaultObjects, Resource\VaultObject::constructFromResponse($responseData));
}

return [$before, $after, $vaultObjects];
}




}
85 changes: 85 additions & 0 deletions tests/WorkOS/OrganizationsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ class OrganizationsTest extends TestCase
setUp as protected traitSetUp;
}

/**
* @var Organizations
*/
protected $organizations;

protected function setUp(): void
{
$this->traitSetUp();
Expand Down Expand Up @@ -190,6 +195,34 @@ public function testListOrganizationRoles()
$this->assertSame($role, $roles[0]->toArray());
}

public function testListOrganizationFeatureFlags()
{
$featureFlagsPath = "organizations/org_01EHQMYV6MBK39QC5PZXHY59C3/feature-flags";

$result = $this->featureFlagsResponseFixture();

$params = [
"limit" => 10,
"before" => null,
"after" => null,
"order" => null
];

$this->mockRequest(
Client::METHOD_GET,
$featureFlagsPath,
null,
$params,
true,
$result
);

$featureFlag = $this->featureFlagFixture();

list($before, $after, $featureFlags) = $this->organizations->listOrganizationFeatureFlags("org_01EHQMYV6MBK39QC5PZXHY59C3");
$this->assertSame($featureFlag, $featureFlags[0]->toArray());
}

// Fixtures

private function createOrganizationResponseFixture()
Expand Down Expand Up @@ -342,4 +375,56 @@ private function roleFixture()
"updated_at" => "2024-01-01T00:00:00.000Z"
];
}

private function featureFlagFixture()
{
return [
"id" => "flag_01K2QR5YSWRB8J7GGAG05Y24HQ",
"slug" => "flag3",
"name" => "Flag3",
"description" => "",
"createdAt" => "2025-08-15T20:54:13.561Z",
"updatedAt" => "2025-08-15T20:54:13.561Z"
];
}

private function featureFlagsResponseFixture()
{
return json_encode([
"object" => "list",
"data" => [
[
"object" => "feature_flag",
"id" => "flag_01K2QR5YSWRB8J7GGAG05Y24HQ",
"slug" => "flag3",
"name" => "Flag3",
"description" => "",
"created_at" => "2025-08-15T20:54:13.561Z",
"updated_at" => "2025-08-15T20:54:13.561Z"
],
[
"object" => "feature_flag",
"id" => "flag_01K2QR5HGK2HQVFDZ4T60GWGVD",
"slug" => "flag2",
"name" => "Flag2",
"description" => "",
"created_at" => "2025-08-15T20:53:59.952Z",
"updated_at" => "2025-08-15T20:53:59.952Z"
],
[
"object" => "feature_flag",
"id" => "flag_01K2QKSH38RF4P9FV917PE24R3",
"slug" => "flag1",
"name" => "Flag1",
"description" => "",
"created_at" => "2025-08-15T19:37:32.005Z",
"updated_at" => "2025-08-15T19:37:32.005Z"
],
],
"list_metadata" => [
"before" => "",
"after" => ""
]
]);
}
}
Loading