diff --git a/src/authorization/authorization.spec.ts b/src/authorization/authorization.spec.ts index 18fea2c10..dae0e3e30 100644 --- a/src/authorization/authorization.spec.ts +++ b/src/authorization/authorization.spec.ts @@ -8,8 +8,13 @@ import { import { WorkOS } from '../workos'; import environmentRoleFixture from './fixtures/environment-role.json'; import listEnvironmentRolesFixture from './fixtures/list-environment-roles.json'; +import organizationRoleFixture from './fixtures/organization-role.json'; +import listOrganizationRolesFixture from './fixtures/list-organization-roles.json'; +import permissionFixture from './fixtures/permission.json'; +import listPermissionsFixture from './fixtures/list-permissions.json'; const workos = new WorkOS('sk_test_Sz3IQjepeSWaI4cMS4ms4sMuU'); +const testOrgId = 'org_01HXYZ123ABC456DEF789ABC'; describe('Authorization', () => { beforeEach(() => fetch.resetMocks()); @@ -95,18 +100,6 @@ describe('Authorization', () => { ]), ); }); - - it('passes expand parameter', async () => { - fetchOnce(listEnvironmentRolesFixture); - - await workos.authorization.listEnvironmentRoles({ - expand: 'permissions', - }); - - expect(fetchSearchParams()).toEqual({ - expand: 'permissions', - }); - }); }); describe('getEnvironmentRole', () => { @@ -236,4 +229,366 @@ describe('Authorization', () => { ); }); }); + + describe('createOrganizationRole', () => { + it('creates an organization role', async () => { + fetchOnce(organizationRoleFixture, { status: 201 }); + + const role = await workos.authorization.createOrganizationRole( + testOrgId, + { + slug: 'org-admin', + name: 'Org Admin', + description: 'Organization administrator', + }, + ); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/roles`, + ); + expect(fetchBody()).toEqual({ + slug: 'org-admin', + name: 'Org Admin', + description: 'Organization administrator', + }); + expect(role).toMatchObject({ + object: 'role', + id: 'role_01HXYZ123ABC456DEF789ORG', + slug: 'org-admin', + name: 'Org Admin', + type: 'OrganizationRole', + }); + }); + }); + + describe('listOrganizationRoles', () => { + it('returns both environment and organization roles', async () => { + fetchOnce(listOrganizationRolesFixture); + + const { data, object } = + await workos.authorization.listOrganizationRoles(testOrgId); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/roles`, + ); + expect(object).toEqual('list'); + expect(data).toHaveLength(3); + expect(data).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + slug: 'admin', + type: 'EnvironmentRole', + }), + expect.objectContaining({ + slug: 'org-admin', + type: 'OrganizationRole', + }), + expect.objectContaining({ + slug: 'org-member', + type: 'OrganizationRole', + }), + ]), + ); + }); + }); + + describe('getOrganizationRole', () => { + it('gets an organization role by slug', async () => { + fetchOnce(organizationRoleFixture); + + const role = await workos.authorization.getOrganizationRole( + testOrgId, + 'org-admin', + ); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/roles/org-admin`, + ); + expect(role).toMatchObject({ + object: 'role', + slug: 'org-admin', + type: 'OrganizationRole', + }); + }); + }); + + describe('updateOrganizationRole', () => { + it('updates an organization role', async () => { + const updatedRoleFixture = { + ...organizationRoleFixture, + name: 'Super Org Admin', + description: 'Updated description', + }; + fetchOnce(updatedRoleFixture); + + const role = await workos.authorization.updateOrganizationRole( + testOrgId, + 'org-admin', + { + name: 'Super Org Admin', + description: 'Updated description', + }, + ); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/roles/org-admin`, + ); + expect(fetchBody()).toEqual({ + name: 'Super Org Admin', + description: 'Updated description', + }); + expect(role).toMatchObject({ + name: 'Super Org Admin', + description: 'Updated description', + }); + }); + }); + + describe('deleteOrganizationRole', () => { + it('deletes an organization role', async () => { + fetchOnce({}, { status: 204 }); + + await workos.authorization.deleteOrganizationRole(testOrgId, 'org-admin'); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/roles/org-admin`, + ); + }); + }); + + describe('setOrganizationRolePermissions', () => { + it('sets permissions for an organization role', async () => { + const updatedRoleFixture = { + ...organizationRoleFixture, + permissions: ['org:read', 'org:write'], + }; + fetchOnce(updatedRoleFixture); + + const role = await workos.authorization.setOrganizationRolePermissions( + testOrgId, + 'org-admin', + { permissions: ['org:read', 'org:write'] }, + ); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/roles/org-admin/permissions`, + ); + expect(fetchBody()).toEqual({ + permissions: ['org:read', 'org:write'], + }); + expect(role.permissions).toEqual( + expect.arrayContaining(['org:read', 'org:write']), + ); + }); + }); + + describe('addOrganizationRolePermission', () => { + it('adds a permission to an organization role', async () => { + const updatedRoleFixture = { + ...organizationRoleFixture, + permissions: ['org:manage', 'members:invite', 'billing:read'], + }; + fetchOnce(updatedRoleFixture); + + const role = await workos.authorization.addOrganizationRolePermission( + testOrgId, + 'org-admin', + { permissionSlug: 'billing:read' }, + ); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/roles/org-admin/permissions`, + ); + expect(fetchBody()).toEqual({ + slug: 'billing:read', + }); + expect(role.permissions).toEqual( + expect.arrayContaining(['billing:read']), + ); + }); + }); + + describe('removeOrganizationRolePermission', () => { + it('removes a permission from an organization role', async () => { + fetchOnce({}, { status: 200 }); + + await workos.authorization.removeOrganizationRolePermission( + testOrgId, + 'org-admin', + { permissionSlug: 'members:invite' }, + ); + + expect(fetchURL()).toContain( + `/authorization/organizations/${testOrgId}/roles/org-admin/permissions/members:invite`, + ); + }); + }); + + describe('createPermission', () => { + it('creates a permission', async () => { + fetchOnce(permissionFixture, { status: 201 }); + + const permission = await workos.authorization.createPermission({ + slug: 'users:read', + name: 'Read Users', + description: 'Allows reading user data', + }); + + expect(fetchURL()).toContain('/authorization/permissions'); + expect(fetchBody()).toEqual({ + slug: 'users:read', + name: 'Read Users', + description: 'Allows reading user data', + }); + expect(permission).toMatchObject({ + object: 'permission', + id: 'perm_01HXYZ123ABC456DEF789GHI', + slug: 'users:read', + name: 'Read Users', + description: 'Allows reading user data', + system: false, + }); + }); + + it('creates a permission without description', async () => { + fetchOnce({ ...permissionFixture, description: null }, { status: 201 }); + + const permission = await workos.authorization.createPermission({ + slug: 'users:read', + name: 'Read Users', + }); + + expect(fetchBody()).toEqual({ + slug: 'users:read', + name: 'Read Users', + }); + expect(permission.description).toBeNull(); + }); + }); + + describe('listPermissions', () => { + it('returns permissions', async () => { + fetchOnce(listPermissionsFixture); + + const { data, object, listMetadata } = + await workos.authorization.listPermissions(); + + expect(fetchURL()).toContain('/authorization/permissions'); + expect(object).toEqual('list'); + expect(data).toHaveLength(2); + expect(data).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + object: 'permission', + id: 'perm_01HXYZ123ABC456DEF789GHI', + slug: 'users:read', + name: 'Read Users', + }), + expect.objectContaining({ + object: 'permission', + id: 'perm_01HXYZ123ABC456DEF789GHJ', + slug: 'users:write', + name: 'Write Users', + }), + ]), + ); + expect(listMetadata).toEqual({ + before: null, + after: 'perm_01HXYZ123ABC456DEF789GHJ', + }); + }); + + it('passes pagination parameters', async () => { + fetchOnce(listPermissionsFixture); + + await workos.authorization.listPermissions({ + limit: 10, + after: 'perm_01HXYZ123ABC456DEF789GHI', + order: 'desc', + }); + + expect(fetchSearchParams()).toEqual({ + limit: '10', + after: 'perm_01HXYZ123ABC456DEF789GHI', + order: 'desc', + }); + }); + }); + + describe('getPermission', () => { + it('gets a permission by slug', async () => { + fetchOnce(permissionFixture); + + const permission = await workos.authorization.getPermission('users:read'); + + expect(fetchURL()).toContain('/authorization/permissions/users:read'); + expect(permission).toMatchObject({ + object: 'permission', + id: 'perm_01HXYZ123ABC456DEF789GHI', + slug: 'users:read', + name: 'Read Users', + description: 'Allows reading user data', + system: false, + }); + }); + }); + + describe('updatePermission', () => { + it('updates a permission', async () => { + const updatedPermissionFixture = { + ...permissionFixture, + name: 'Read All Users', + description: 'Updated description', + }; + fetchOnce(updatedPermissionFixture); + + const permission = await workos.authorization.updatePermission( + 'users:read', + { + name: 'Read All Users', + description: 'Updated description', + }, + ); + + expect(fetchURL()).toContain('/authorization/permissions/users:read'); + expect(fetchBody()).toEqual({ + name: 'Read All Users', + description: 'Updated description', + }); + expect(permission).toMatchObject({ + name: 'Read All Users', + description: 'Updated description', + }); + }); + + it('clears description when set to null', async () => { + const updatedPermissionFixture = { + ...permissionFixture, + description: null, + }; + fetchOnce(updatedPermissionFixture); + + const permission = await workos.authorization.updatePermission( + 'users:read', + { + description: null, + }, + ); + + expect(fetchBody()).toEqual({ + description: null, + }); + expect(permission.description).toBeNull(); + }); + }); + + describe('deletePermission', () => { + it('deletes a permission', async () => { + fetchOnce({}, { status: 204 }); + + await workos.authorization.deletePermission('users:read'); + + expect(fetchURL()).toContain('/authorization/permissions/users:read'); + }); + }); }); diff --git a/src/authorization/authorization.ts b/src/authorization/authorization.ts index 509a91666..2cd92fa31 100644 --- a/src/authorization/authorization.ts +++ b/src/authorization/authorization.ts @@ -1,4 +1,10 @@ import { WorkOS } from '../workos'; +import { + Role, + RoleList, + OrganizationRoleResponse, + ListOrganizationRolesResponse, +} from '../roles/interfaces'; import { EnvironmentRole, EnvironmentRoleResponse, @@ -6,14 +12,33 @@ import { EnvironmentRoleListResponse, CreateEnvironmentRoleOptions, UpdateEnvironmentRoleOptions, - ListEnvironmentRolesOptions, SetEnvironmentRolePermissionsOptions, AddEnvironmentRolePermissionOptions, + OrganizationRole, + CreateOrganizationRoleOptions, + UpdateOrganizationRoleOptions, + SetOrganizationRolePermissionsOptions, + AddOrganizationRolePermissionOptions, + RemoveOrganizationRolePermissionOptions, + Permission, + PermissionResponse, + PermissionList, + PermissionListResponse, + CreatePermissionOptions, + UpdatePermissionOptions, + ListPermissionsOptions, } from './interfaces'; import { deserializeEnvironmentRole, serializeCreateEnvironmentRoleOptions, serializeUpdateEnvironmentRoleOptions, + deserializeRole, + deserializeOrganizationRole, + serializeCreateOrganizationRoleOptions, + serializeUpdateOrganizationRoleOptions, + deserializePermission, + serializeCreatePermissionOptions, + serializeUpdatePermissionOptions, } from './serializers'; export class Authorization { @@ -29,12 +54,9 @@ export class Authorization { return deserializeEnvironmentRole(data); } - async listEnvironmentRoles( - options?: ListEnvironmentRolesOptions, - ): Promise { + async listEnvironmentRoles(): Promise { const { data } = await this.workos.get( '/authorization/roles', - { query: options }, ); return { object: 'list', @@ -81,4 +103,139 @@ export class Authorization { ); return deserializeEnvironmentRole(data); } + + async createOrganizationRole( + organizationId: string, + options: CreateOrganizationRoleOptions, + ): Promise { + const { data } = await this.workos.post( + `/authorization/organizations/${organizationId}/roles`, + serializeCreateOrganizationRoleOptions(options), + ); + return deserializeOrganizationRole(data); + } + + async listOrganizationRoles(organizationId: string): Promise { + const { data } = await this.workos.get( + `/authorization/organizations/${organizationId}/roles`, + ); + return { + object: 'list', + data: data.data.map(deserializeRole), + }; + } + + async getOrganizationRole( + organizationId: string, + slug: string, + ): Promise { + const { data } = await this.workos.get( + `/authorization/organizations/${organizationId}/roles/${slug}`, + ); + return deserializeRole(data); + } + + async updateOrganizationRole( + organizationId: string, + slug: string, + options: UpdateOrganizationRoleOptions, + ): Promise { + const { data } = await this.workos.patch( + `/authorization/organizations/${organizationId}/roles/${slug}`, + serializeUpdateOrganizationRoleOptions(options), + ); + return deserializeOrganizationRole(data); + } + + async deleteOrganizationRole( + organizationId: string, + slug: string, + ): Promise { + await this.workos.delete( + `/authorization/organizations/${organizationId}/roles/${slug}`, + ); + } + + async setOrganizationRolePermissions( + organizationId: string, + slug: string, + options: SetOrganizationRolePermissionsOptions, + ): Promise { + const { data } = await this.workos.put( + `/authorization/organizations/${organizationId}/roles/${slug}/permissions`, + { permissions: options.permissions }, + ); + return deserializeOrganizationRole(data); + } + + async addOrganizationRolePermission( + organizationId: string, + slug: string, + options: AddOrganizationRolePermissionOptions, + ): Promise { + const { data } = await this.workos.post( + `/authorization/organizations/${organizationId}/roles/${slug}/permissions`, + { slug: options.permissionSlug }, + ); + return deserializeOrganizationRole(data); + } + + async removeOrganizationRolePermission( + organizationId: string, + slug: string, + options: RemoveOrganizationRolePermissionOptions, + ): Promise { + await this.workos.delete( + `/authorization/organizations/${organizationId}/roles/${slug}/permissions/${options.permissionSlug}`, + ); + } + + async createPermission( + options: CreatePermissionOptions, + ): Promise { + const { data } = await this.workos.post( + '/authorization/permissions', + serializeCreatePermissionOptions(options), + ); + return deserializePermission(data); + } + + async listPermissions( + options?: ListPermissionsOptions, + ): Promise { + const { data } = await this.workos.get( + '/authorization/permissions', + { query: options }, + ); + return { + object: 'list', + data: data.data.map(deserializePermission), + listMetadata: { + before: data.list_metadata.before, + after: data.list_metadata.after, + }, + }; + } + + async getPermission(slug: string): Promise { + const { data } = await this.workos.get( + `/authorization/permissions/${slug}`, + ); + return deserializePermission(data); + } + + async updatePermission( + slug: string, + options: UpdatePermissionOptions, + ): Promise { + const { data } = await this.workos.patch( + `/authorization/permissions/${slug}`, + serializeUpdatePermissionOptions(options), + ); + return deserializePermission(data); + } + + async deletePermission(slug: string): Promise { + await this.workos.delete(`/authorization/permissions/${slug}`); + } } diff --git a/src/authorization/fixtures/list-organization-roles.json b/src/authorization/fixtures/list-organization-roles.json new file mode 100644 index 000000000..0533606d2 --- /dev/null +++ b/src/authorization/fixtures/list-organization-roles.json @@ -0,0 +1,38 @@ +{ + "object": "list", + "data": [ + { + "object": "role", + "id": "role_01HXYZ123ABC456DEF789ENV", + "name": "Admin", + "slug": "admin", + "description": "Environment-level admin role", + "permissions": ["users:read", "users:write"], + "type": "EnvironmentRole", + "created_at": "2024-01-15T08:00:00.000Z", + "updated_at": "2024-01-15T08:00:00.000Z" + }, + { + "object": "role", + "id": "role_01HXYZ123ABC456DEF789ORG", + "name": "Org Admin", + "slug": "org-admin", + "description": "Organization administrator", + "permissions": ["org:manage", "members:invite"], + "type": "OrganizationRole", + "created_at": "2024-01-15T09:30:00.000Z", + "updated_at": "2024-01-15T09:30:00.000Z" + }, + { + "object": "role", + "id": "role_01HXYZ123ABC456DEF789MEM", + "name": "Org Member", + "slug": "org-member", + "description": null, + "permissions": ["projects:read"], + "type": "OrganizationRole", + "created_at": "2024-01-15T10:00:00.000Z", + "updated_at": "2024-01-15T10:00:00.000Z" + } + ] +} diff --git a/src/authorization/fixtures/list-permissions.json b/src/authorization/fixtures/list-permissions.json new file mode 100644 index 000000000..c9f4bc8a2 --- /dev/null +++ b/src/authorization/fixtures/list-permissions.json @@ -0,0 +1,29 @@ +{ + "object": "list", + "data": [ + { + "object": "permission", + "id": "perm_01HXYZ123ABC456DEF789GHI", + "slug": "users:read", + "name": "Read Users", + "description": "Allows reading user data", + "system": false, + "created_at": "2024-01-15T08:00:00.000Z", + "updated_at": "2024-01-15T08:00:00.000Z" + }, + { + "object": "permission", + "id": "perm_01HXYZ123ABC456DEF789GHJ", + "slug": "users:write", + "name": "Write Users", + "description": null, + "system": true, + "created_at": "2024-01-15T09:00:00.000Z", + "updated_at": "2024-01-15T09:00:00.000Z" + } + ], + "list_metadata": { + "before": null, + "after": "perm_01HXYZ123ABC456DEF789GHJ" + } +} diff --git a/src/authorization/fixtures/organization-role.json b/src/authorization/fixtures/organization-role.json new file mode 100644 index 000000000..0ae05d0cb --- /dev/null +++ b/src/authorization/fixtures/organization-role.json @@ -0,0 +1,11 @@ +{ + "object": "role", + "id": "role_01HXYZ123ABC456DEF789ORG", + "name": "Org Admin", + "slug": "org-admin", + "description": "Organization administrator", + "permissions": ["org:manage", "members:invite"], + "type": "OrganizationRole", + "created_at": "2024-01-15T09:30:00.000Z", + "updated_at": "2024-01-15T09:30:00.000Z" +} diff --git a/src/authorization/fixtures/permission.json b/src/authorization/fixtures/permission.json new file mode 100644 index 000000000..d8759fba1 --- /dev/null +++ b/src/authorization/fixtures/permission.json @@ -0,0 +1,10 @@ +{ + "object": "permission", + "id": "perm_01HXYZ123ABC456DEF789GHI", + "slug": "users:read", + "name": "Read Users", + "description": "Allows reading user data", + "system": false, + "created_at": "2024-01-15T08:00:00.000Z", + "updated_at": "2024-01-15T08:00:00.000Z" +} diff --git a/src/authorization/interfaces/add-organization-role-permission-options.interface.ts b/src/authorization/interfaces/add-organization-role-permission-options.interface.ts new file mode 100644 index 000000000..1fc26296c --- /dev/null +++ b/src/authorization/interfaces/add-organization-role-permission-options.interface.ts @@ -0,0 +1,3 @@ +export interface AddOrganizationRolePermissionOptions { + permissionSlug: string; +} diff --git a/src/authorization/interfaces/create-organization-role-options.interface.ts b/src/authorization/interfaces/create-organization-role-options.interface.ts new file mode 100644 index 000000000..09b397e69 --- /dev/null +++ b/src/authorization/interfaces/create-organization-role-options.interface.ts @@ -0,0 +1,11 @@ +export interface CreateOrganizationRoleOptions { + slug: string; + name: string; + description?: string; +} + +export interface SerializedCreateOrganizationRoleOptions { + slug: string; + name: string; + description?: string; +} diff --git a/src/authorization/interfaces/create-permission-options.interface.ts b/src/authorization/interfaces/create-permission-options.interface.ts new file mode 100644 index 000000000..d69437fb5 --- /dev/null +++ b/src/authorization/interfaces/create-permission-options.interface.ts @@ -0,0 +1,11 @@ +export interface CreatePermissionOptions { + slug: string; + name: string; + description?: string; +} + +export interface SerializedCreatePermissionOptions { + slug: string; + name: string; + description?: string; +} diff --git a/src/authorization/interfaces/index.ts b/src/authorization/interfaces/index.ts index 9750d53bc..e605c9351 100644 --- a/src/authorization/interfaces/index.ts +++ b/src/authorization/interfaces/index.ts @@ -1,6 +1,15 @@ export * from './environment-role.interface'; export * from './create-environment-role-options.interface'; export * from './update-environment-role-options.interface'; -export * from './list-environment-roles-options.interface'; export * from './set-environment-role-permissions-options.interface'; export * from './add-environment-role-permission-options.interface'; +export * from './organization-role.interface'; +export * from './create-organization-role-options.interface'; +export * from './update-organization-role-options.interface'; +export * from './set-organization-role-permissions-options.interface'; +export * from './add-organization-role-permission-options.interface'; +export * from './remove-organization-role-permission-options.interface'; +export * from './permission.interface'; +export * from './create-permission-options.interface'; +export * from './update-permission-options.interface'; +export * from './list-permissions-options.interface'; diff --git a/src/authorization/interfaces/list-environment-roles-options.interface.ts b/src/authorization/interfaces/list-environment-roles-options.interface.ts deleted file mode 100644 index ea95542f5..000000000 --- a/src/authorization/interfaces/list-environment-roles-options.interface.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ListEnvironmentRolesOptions { - expand?: 'permissions'; -} diff --git a/src/authorization/interfaces/list-permissions-options.interface.ts b/src/authorization/interfaces/list-permissions-options.interface.ts new file mode 100644 index 000000000..05628c604 --- /dev/null +++ b/src/authorization/interfaces/list-permissions-options.interface.ts @@ -0,0 +1,3 @@ +import { PaginationOptions } from '../../common/interfaces'; + +export type ListPermissionsOptions = PaginationOptions; diff --git a/src/authorization/interfaces/organization-role.interface.ts b/src/authorization/interfaces/organization-role.interface.ts new file mode 100644 index 000000000..d17f850f4 --- /dev/null +++ b/src/authorization/interfaces/organization-role.interface.ts @@ -0,0 +1,11 @@ +export interface OrganizationRole { + object: 'role'; + id: string; + name: string; + slug: string; + description: string | null; + permissions: string[]; + type: 'OrganizationRole'; + createdAt: string; + updatedAt: string; +} diff --git a/src/authorization/interfaces/permission.interface.ts b/src/authorization/interfaces/permission.interface.ts new file mode 100644 index 000000000..a70c14804 --- /dev/null +++ b/src/authorization/interfaces/permission.interface.ts @@ -0,0 +1,39 @@ +export interface Permission { + object: 'permission'; + id: string; + slug: string; + name: string; + description: string | null; + system: boolean; + createdAt: string; + updatedAt: string; +} + +export interface PermissionResponse { + object: 'permission'; + id: string; + slug: string; + name: string; + description: string | null; + system: boolean; + created_at: string; + updated_at: string; +} + +export interface PermissionList { + object: 'list'; + data: Permission[]; + listMetadata: { + before: string | null; + after: string | null; + }; +} + +export interface PermissionListResponse { + object: 'list'; + data: PermissionResponse[]; + list_metadata: { + before: string | null; + after: string | null; + }; +} diff --git a/src/authorization/interfaces/remove-organization-role-permission-options.interface.ts b/src/authorization/interfaces/remove-organization-role-permission-options.interface.ts new file mode 100644 index 000000000..80068249f --- /dev/null +++ b/src/authorization/interfaces/remove-organization-role-permission-options.interface.ts @@ -0,0 +1,3 @@ +export interface RemoveOrganizationRolePermissionOptions { + permissionSlug: string; +} diff --git a/src/authorization/interfaces/set-organization-role-permissions-options.interface.ts b/src/authorization/interfaces/set-organization-role-permissions-options.interface.ts new file mode 100644 index 000000000..09c563c2a --- /dev/null +++ b/src/authorization/interfaces/set-organization-role-permissions-options.interface.ts @@ -0,0 +1,3 @@ +export interface SetOrganizationRolePermissionsOptions { + permissions: string[]; +} diff --git a/src/authorization/interfaces/update-organization-role-options.interface.ts b/src/authorization/interfaces/update-organization-role-options.interface.ts new file mode 100644 index 000000000..a2fd4a314 --- /dev/null +++ b/src/authorization/interfaces/update-organization-role-options.interface.ts @@ -0,0 +1,9 @@ +export interface UpdateOrganizationRoleOptions { + name?: string; + description?: string | null; +} + +export interface SerializedUpdateOrganizationRoleOptions { + name?: string; + description?: string | null; +} diff --git a/src/authorization/interfaces/update-permission-options.interface.ts b/src/authorization/interfaces/update-permission-options.interface.ts new file mode 100644 index 000000000..600645607 --- /dev/null +++ b/src/authorization/interfaces/update-permission-options.interface.ts @@ -0,0 +1,9 @@ +export interface UpdatePermissionOptions { + name?: string; + description?: string | null; +} + +export interface SerializedUpdatePermissionOptions { + name?: string; + description?: string | null; +} diff --git a/src/authorization/serializers/create-organization-role-options.serializer.ts b/src/authorization/serializers/create-organization-role-options.serializer.ts new file mode 100644 index 000000000..f97bcebe0 --- /dev/null +++ b/src/authorization/serializers/create-organization-role-options.serializer.ts @@ -0,0 +1,12 @@ +import { + CreateOrganizationRoleOptions, + SerializedCreateOrganizationRoleOptions, +} from '../interfaces/create-organization-role-options.interface'; + +export const serializeCreateOrganizationRoleOptions = ( + options: CreateOrganizationRoleOptions, +): SerializedCreateOrganizationRoleOptions => ({ + slug: options.slug, + name: options.name, + description: options.description, +}); diff --git a/src/authorization/serializers/create-permission-options.serializer.ts b/src/authorization/serializers/create-permission-options.serializer.ts new file mode 100644 index 000000000..f3f0081ee --- /dev/null +++ b/src/authorization/serializers/create-permission-options.serializer.ts @@ -0,0 +1,12 @@ +import { + CreatePermissionOptions, + SerializedCreatePermissionOptions, +} from '../interfaces/create-permission-options.interface'; + +export const serializeCreatePermissionOptions = ( + options: CreatePermissionOptions, +): SerializedCreatePermissionOptions => ({ + slug: options.slug, + name: options.name, + description: options.description, +}); diff --git a/src/authorization/serializers/index.ts b/src/authorization/serializers/index.ts index 8aad90ac3..bbaf011f3 100644 --- a/src/authorization/serializers/index.ts +++ b/src/authorization/serializers/index.ts @@ -1,3 +1,9 @@ export * from './environment-role.serializer'; export * from './create-environment-role-options.serializer'; export * from './update-environment-role-options.serializer'; +export * from './organization-role.serializer'; +export * from './create-organization-role-options.serializer'; +export * from './update-organization-role-options.serializer'; +export * from './permission.serializer'; +export * from './create-permission-options.serializer'; +export * from './update-permission-options.serializer'; diff --git a/src/authorization/serializers/organization-role.serializer.ts b/src/authorization/serializers/organization-role.serializer.ts new file mode 100644 index 000000000..3e20278d8 --- /dev/null +++ b/src/authorization/serializers/organization-role.serializer.ts @@ -0,0 +1,28 @@ +import { Role, OrganizationRoleResponse } from '../../roles/interfaces'; +import { OrganizationRole } from '../interfaces'; + +export const deserializeRole = (role: OrganizationRoleResponse): Role => ({ + object: role.object, + id: role.id, + name: role.name, + slug: role.slug, + description: role.description, + permissions: role.permissions, + type: role.type, + createdAt: role.created_at, + updatedAt: role.updated_at, +}); + +export const deserializeOrganizationRole = ( + role: OrganizationRoleResponse, +): OrganizationRole => ({ + object: role.object, + id: role.id, + name: role.name, + slug: role.slug, + description: role.description, + permissions: role.permissions, + type: 'OrganizationRole', + createdAt: role.created_at, + updatedAt: role.updated_at, +}); diff --git a/src/authorization/serializers/permission.serializer.ts b/src/authorization/serializers/permission.serializer.ts new file mode 100644 index 000000000..a8b698f31 --- /dev/null +++ b/src/authorization/serializers/permission.serializer.ts @@ -0,0 +1,17 @@ +import { + Permission, + PermissionResponse, +} from '../interfaces/permission.interface'; + +export const deserializePermission = ( + permission: PermissionResponse, +): Permission => ({ + object: permission.object, + id: permission.id, + slug: permission.slug, + name: permission.name, + description: permission.description, + system: permission.system, + createdAt: permission.created_at, + updatedAt: permission.updated_at, +}); diff --git a/src/authorization/serializers/update-organization-role-options.serializer.ts b/src/authorization/serializers/update-organization-role-options.serializer.ts new file mode 100644 index 000000000..7bfc5571d --- /dev/null +++ b/src/authorization/serializers/update-organization-role-options.serializer.ts @@ -0,0 +1,11 @@ +import { + UpdateOrganizationRoleOptions, + SerializedUpdateOrganizationRoleOptions, +} from '../interfaces/update-organization-role-options.interface'; + +export const serializeUpdateOrganizationRoleOptions = ( + options: UpdateOrganizationRoleOptions, +): SerializedUpdateOrganizationRoleOptions => ({ + name: options.name, + description: options.description, +}); diff --git a/src/authorization/serializers/update-permission-options.serializer.ts b/src/authorization/serializers/update-permission-options.serializer.ts new file mode 100644 index 000000000..4ac4e67d0 --- /dev/null +++ b/src/authorization/serializers/update-permission-options.serializer.ts @@ -0,0 +1,11 @@ +import { + UpdatePermissionOptions, + SerializedUpdatePermissionOptions, +} from '../interfaces/update-permission-options.interface'; + +export const serializeUpdatePermissionOptions = ( + options: UpdatePermissionOptions, +): SerializedUpdatePermissionOptions => ({ + name: options.name, + description: options.description, +}); diff --git a/src/roles/interfaces/role.interface.ts b/src/roles/interfaces/role.interface.ts index 642311ec0..1cf8ed5e6 100644 --- a/src/roles/interfaces/role.interface.ts +++ b/src/roles/interfaces/role.interface.ts @@ -1,3 +1,8 @@ +import { + EnvironmentRole, + OrganizationRole, +} from '../../authorization/interfaces'; + export interface RoleResponse { slug: string; } @@ -35,17 +40,7 @@ export interface OrganizationRoleResponse { updated_at: string; } -export interface Role { - object: 'role'; - id: string; - name: string; - slug: string; - description: string | null; - permissions: string[]; - type: 'EnvironmentRole' | 'OrganizationRole'; - createdAt: string; - updatedAt: string; -} +export type Role = EnvironmentRole | OrganizationRole; export interface RoleList { object: 'list';