diff --git a/src/workos/fga.py b/src/workos/fga.py index 2c76a320..645a5662 100644 --- a/src/workos/fga.py +++ b/src/workos/fga.py @@ -1,3 +1,8 @@ +""" +DEPRECATED: This module is deprecated, use the Authorization module instead. +See src/workos/authorization.py +""" + import json from typing import Any, Mapping, Optional, Protocol, Sequence from workos.types.fga import ( diff --git a/src/workos/types/authorization/__init__.py b/src/workos/types/authorization/__init__.py index 609a4f2d..a405ec84 100644 --- a/src/workos/types/authorization/__init__.py +++ b/src/workos/types/authorization/__init__.py @@ -1,3 +1,7 @@ +from workos.types.authorization.authorization_resource import ( + AuthorizationResource, + AuthorizationResourceList, +) from workos.types.authorization.environment_role import ( EnvironmentRole, EnvironmentRoleList, @@ -12,3 +16,9 @@ Role, RoleList, ) +from workos.types.authorization.role_assignment import ( + RoleAssignment, + RoleAssignmentList, + RoleAssignmentResource, + RoleAssignmentRole, +) diff --git a/src/workos/types/authorization/authorization_resource.py b/src/workos/types/authorization/authorization_resource.py new file mode 100644 index 00000000..e5fefbf4 --- /dev/null +++ b/src/workos/types/authorization/authorization_resource.py @@ -0,0 +1,25 @@ +from typing import TYPE_CHECKING, Literal, Optional, Sequence + +from workos.types.workos_model import WorkOSModel + +if TYPE_CHECKING: + from workos.types.list_resource import ListMetadata + + +class AuthorizationResource(WorkOSModel): + object: Literal["authorization_resource"] + id: str + external_id: str + name: str + description: Optional[str] = None + resource_type_slug: str + organization_id: str + parent_resource_id: Optional[str] = None + created_at: str + updated_at: str + + +class AuthorizationResourceList(WorkOSModel): + object: Literal["list"] + data: Sequence[AuthorizationResource] + list_metadata: "ListMetadata" diff --git a/src/workos/types/authorization/role_assignment.py b/src/workos/types/authorization/role_assignment.py new file mode 100644 index 00000000..13ecad94 --- /dev/null +++ b/src/workos/types/authorization/role_assignment.py @@ -0,0 +1,31 @@ +from typing import TYPE_CHECKING, Literal, Sequence + +from workos.types.workos_model import WorkOSModel + +if TYPE_CHECKING: + from workos.types.list_resource import ListMetadata + + +class RoleAssignmentRole(WorkOSModel): + slug: str + + +class RoleAssignmentResource(WorkOSModel): + id: str + external_id: str + resource_type_slug: str + + +class RoleAssignment(WorkOSModel): + object: Literal["role_assignment"] + id: str + role: RoleAssignmentRole + resource: RoleAssignmentResource + created_at: str + updated_at: str + + +class RoleAssignmentList(WorkOSModel): + object: Literal["list"] + data: Sequence[RoleAssignment] + list_metadata: "ListMetadata" diff --git a/src/workos/types/list_metadata.py b/src/workos/types/list_metadata.py new file mode 100644 index 00000000..43315678 --- /dev/null +++ b/src/workos/types/list_metadata.py @@ -0,0 +1,10 @@ +from pydantic import BaseModel +from typing import Optional + + +class ListAfterMetadata(BaseModel): + after: Optional[str] = None + + +class ListMetadata(ListAfterMetadata): + before: Optional[str] = None diff --git a/tests/utils/fixtures/mock_authorization_resource.py b/tests/utils/fixtures/mock_authorization_resource.py new file mode 100644 index 00000000..1c25d35c --- /dev/null +++ b/tests/utils/fixtures/mock_authorization_resource.py @@ -0,0 +1,28 @@ +from typing import Optional + +from workos.types.authorization.authorization_resource import AuthorizationResource + + +class MockAuthorizationResource(AuthorizationResource): + def __init__( + self, + id: str = "authz_resource_01HXYZ123ABC456DEF789ABC", + external_id: str = "doc-456", + name: str = "Q4 Budget Report", + description: Optional[str] = "Financial report for Q4 2025", + resource_type_slug: str = "folder", + organization_id: str = "org_01HXYZ123ABC456DEF789ABC", + parent_resource_id: Optional[str] = None, + ): + super().__init__( + object="authorization_resource", + id=id, + external_id=external_id, + name=name, + description=description, + resource_type_slug=resource_type_slug, + organization_id=organization_id, + parent_resource_id=parent_resource_id, + created_at="2024-01-15T09:30:00.000Z", + updated_at="2024-01-15T09:30:00.000Z", + ) diff --git a/tests/utils/fixtures/mock_role_assignment.py b/tests/utils/fixtures/mock_role_assignment.py new file mode 100644 index 00000000..addf5246 --- /dev/null +++ b/tests/utils/fixtures/mock_role_assignment.py @@ -0,0 +1,28 @@ +class MockRoleAssignment: + def __init__( + self, + id: str = "role_assignment_01HXYZ123ABC456DEF789ABC", + role_slug: str = "editor", + resource_id: str = "resource_01HXYZ123ABC456DEF789XYZ", + resource_external_id: str = "doc-123", + resource_type_slug: str = "document", + ): + self.id = id + self.role_slug = role_slug + self.resource_id = resource_id + self.resource_external_id = resource_external_id + self.resource_type_slug = resource_type_slug + + def dict(self) -> dict: + return { + "object": "role_assignment", + "id": self.id, + "role": {"slug": self.role_slug}, + "resource": { + "id": self.resource_id, + "external_id": self.resource_external_id, + "resource_type_slug": self.resource_type_slug, + }, + "created_at": "2024-01-15T09:30:00.000Z", + "updated_at": "2024-01-15T09:30:00.000Z", + }