feat: add member property management - #324
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Sorry @henry-casper, your pull request is larger than the review limit of 150,000 diff characters
henry-casper
requested
a balanced review from Copilot
and removed request for
a team
September 1, 2026 03:59
Contributor
There was a problem hiding this comment.
Pull request overview
Adds member-facing property management across authorization, GraphQL, shared UI, routing, persistence, and verification layers.
Changes:
- Adds ownership-aware property creation, viewing, and editing.
- Introduces reusable property UI and member routes.
- Adds API, UI, and E2E authorization coverage.
Reviewed changes
Copilot reviewed 144 out of 148 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
apps/ui-community/mock-oidc.users.json |
Adds member test identities. |
apps/ui-community/package.json |
Adds member-route dependencies. |
apps/ui-community/src/App.tsx |
Registers member property routes. |
codegen.yml |
Includes member GraphQL operations. |
packages/ocom-verification/acceptance-api/src/contexts/member-property/notes/member-property-notes.ts |
Stores API scenario state. |
packages/ocom-verification/acceptance-api/src/contexts/member-property/questions/member-property-state.ts |
Queries API property state. |
packages/ocom-verification/acceptance-api/src/contexts/member-property/step-definitions/index.ts |
Exports API steps. |
packages/ocom-verification/acceptance-api/src/contexts/member-property/step-definitions/member-property.steps.ts |
Implements API scenarios. |
packages/ocom-verification/acceptance-api/src/contexts/member-property/tasks/arrange-member-property.ts |
Arranges property fixtures. |
packages/ocom-verification/acceptance-api/src/contexts/member-property/tasks/become-separate-own-property-member.ts |
Creates secondary member persona. |
packages/ocom-verification/acceptance-api/src/contexts/member-property/tasks/establish-member-property-community.ts |
Establishes test communities. |
packages/ocom-verification/acceptance-api/src/contexts/member-property/tasks/member-property-context.ts |
Configures request context. |
packages/ocom-verification/acceptance-api/src/contexts/member-property/tasks/member-property-operations.ts |
Executes property operations. |
packages/ocom-verification/acceptance-api/src/contexts/member-property/tasks/member-property-personas.ts |
Defines authorization personas. |
packages/ocom-verification/acceptance-api/src/servers/test-mongo-server.ts |
Supports property fixtures. |
packages/ocom-verification/acceptance-api/src/shared/abilities/index.ts |
Exports fixture ability. |
packages/ocom-verification/acceptance-api/src/shared/abilities/provision-member-property-fixture.ts |
Provisions member properties. |
packages/ocom-verification/acceptance-api/src/step-definitions/index.ts |
Registers member steps. |
packages/ocom-verification/acceptance-api/src/world.ts |
Adds member-property abilities. |
packages/ocom-verification/acceptance-ui/package.json |
Adds UI test dependencies. |
packages/ocom-verification/acceptance-ui/src/contexts/member-property/abilities/mock-member-property-backend.ts |
Mocks member GraphQL behavior. |
packages/ocom-verification/acceptance-ui/src/contexts/member-property/notes/member-property-ui-notes.ts |
Stores UI scenario state. |
packages/ocom-verification/acceptance-ui/src/contexts/member-property/questions/member-property-screen.ts |
Inspects property screens. |
packages/ocom-verification/acceptance-ui/src/contexts/member-property/step-definitions/index.ts |
Exports UI steps. |
packages/ocom-verification/acceptance-ui/src/contexts/member-property/step-definitions/member-property.steps.ts |
Implements UI scenarios. |
packages/ocom-verification/acceptance-ui/src/contexts/member-property/tasks/member-property-screen.tsx |
Renders property screens. |
packages/ocom-verification/acceptance-ui/src/step-definitions/index.ts |
Registers UI steps. |
packages/ocom-verification/acceptance-ui/tsconfig.json |
Configures UI tests. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/abilities/member-property-portal-page.ts |
Adds property page ability. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/interactions/open-member-property-detail.ts |
Opens property details. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/interactions/open-member-property-directory.ts |
Opens property directory. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/interactions/record-member-property-id.ts |
Records created property IDs. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/notes/member-property-notes.ts |
Stores E2E state. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/questions/member-property-screen.ts |
Inspects browser state. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/step-definitions/index.ts |
Exports E2E steps. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/step-definitions/member-property.steps.ts |
Implements E2E scenarios. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/tasks/arrange-member-property.ts |
Arranges browser fixtures. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/tasks/establish-member-property-community.ts |
Establishes E2E communities. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/tasks/member-property-personas.ts |
Configures E2E personas. |
packages/ocom-verification/e2e-tests/src/contexts/member-property/tasks/member-property-route.ts |
Navigates member routes. |
packages/ocom-verification/e2e-tests/src/servers/test-mongo-server.ts |
Supports E2E fixtures. |
packages/ocom-verification/e2e-tests/src/step-definitions/index.ts |
Registers E2E steps. |
packages/ocom-verification/verification-shared/src/pages/index.ts |
Exports property page objects. |
packages/ocom-verification/verification-shared/src/pages/member-properties-list.page.ts |
Defines list page contract. |
packages/ocom-verification/verification-shared/src/pages/member-property-read-only-detail.page.ts |
Defines read-only page contract. |
packages/ocom-verification/verification-shared/src/scenarios/property/member-property-authorization.feature |
Specifies authorization behavior. |
packages/ocom-verification/verification-shared/src/scenarios/property/member-property-management.feature |
Specifies management behavior. |
packages/ocom-verification/verification-shared/src/test-data/index.ts |
Exports property fixtures. |
packages/ocom-verification/verification-shared/src/test-data/member-property-fixtures.ts |
Defines shared fixtures. |
packages/ocom/application-services/src/contexts/property/index.ts |
Exports property services. |
packages/ocom/application-services/src/contexts/property/property/apply-property-fields.ts |
Applies role-safe updates. |
packages/ocom/application-services/src/contexts/property/property/create.ts |
Supports self-owned creation. |
packages/ocom/application-services/src/contexts/property/property/ensure-property-manageable.ts |
Centralizes management authorization. |
packages/ocom/application-services/src/contexts/property/property/ensure-property-viewable.ts |
Broadens property reads. |
packages/ocom/application-services/src/contexts/property/property/index.ts |
Exposes property operations. |
packages/ocom/application-services/src/contexts/property/property/property.application-service.test.ts |
Tests property authorization. |
packages/ocom/application-services/src/contexts/property/property/query-owner-options-by-community-id.ts |
Restricts owner options. |
packages/ocom/application-services/src/contexts/property/property/update.ts |
Adds ownership-aware updates. |
packages/ocom/application-services/src/index.test.ts |
Tests request passports. |
packages/ocom/application-services/src/index.ts |
Resolves member request identity. |
packages/ocom/domain/src/domain/contexts/property/index.ts |
Exports property authorization types. |
packages/ocom/domain/src/domain/contexts/property/property.passport.ts |
Defines property passport API. |
packages/ocom/domain/src/domain/contexts/property/property/features/property.aggregate.feature |
Specifies aggregate authorization. |
packages/ocom/domain/src/domain/contexts/property/property/property.aggregate.test.ts |
Tests aggregate behavior. |
packages/ocom/domain/src/domain/contexts/property/property/property.aggregate.ts |
Enforces ownership capabilities. |
packages/ocom/domain/src/domain/contexts/property/property/property.repository.ts |
Extends repository contract. |
packages/ocom/domain/src/domain/iam/guest/contexts/guest.property.passport.ts |
Denies guest property access. |
packages/ocom/domain/src/domain/iam/member/contexts/member.property.passport.ts |
Creates member property visas. |
packages/ocom/domain/src/domain/iam/member/contexts/member.property.visa.test.ts |
Tests member permissions. |
packages/ocom/domain/src/domain/iam/member/contexts/member.property.visa.ts |
Implements ownership authorization. |
packages/ocom/domain/src/domain/iam/system/contexts/system.property.passport.ts |
Supports system permissions. |
packages/ocom/domain/src/domain/iam/user/staff-user/contexts/staff-user.property.passport.ts |
Supports staff permissions. |
packages/ocom/graphql/src/schema/types/member.resolvers.additional.test.ts |
Tests member projections. |
packages/ocom/graphql/src/schema/types/property.resolvers.ts |
Exposes property operations. |
packages/ocom/graphql/src/schema/types/property.resolvers.unit.test.ts |
Tests property resolvers. |
packages/ocom/persistence/src/datasources/domain/property/property/property.repository.test.ts |
Tests persisted property behavior. |
packages/ocom/persistence/src/datasources/domain/property/property/property.repository.ts |
Populates and saves references. |
packages/ocom/persistence/src/datasources/readonly/community/member/member.read-repository.test.ts |
Tests member lookups. |
packages/ocom/persistence/src/datasources/readonly/community/member/member.read-repository.ts |
Adds identity-based lookup. |
packages/ocom/ui-community-route-admin/src/components/format-display-address.ts |
Reuses shared formatting. |
packages/ocom/ui-community-route-admin/src/components/properties-create.tsx |
Adapts shared create form. |
packages/ocom/ui-community-route-admin/src/components/properties-detail.tsx |
Adapts shared detail view. |
packages/ocom/ui-community-route-admin/src/components/properties-list.tsx |
Adapts shared property list. |
packages/ocom/ui-community-route-admin/src/components/property-form.tsx |
Re-exports shared form. |
packages/ocom/ui-community-route-admin/src/sub-page-layout.tsx |
Reuses shared layout. |
packages/ocom/ui-community-route-member/.storybook/main.ts |
Configures member Storybook. |
packages/ocom/ui-community-route-member/.storybook/preview.tsx |
Configures story rendering. |
packages/ocom/ui-community-route-member/package.json |
Adds route package tooling. |
packages/ocom/ui-community-route-member/src/archunit-tests/frontend-architecture.test.ts |
Enforces frontend architecture. |
packages/ocom/ui-community-route-member/src/archunit-tests/naming-conventions.test.ts |
Enforces naming conventions. |
packages/ocom/ui-community-route-member/src/components/member-properties-access-policy.test.ts |
Tests route-access decisions. |
packages/ocom/ui-community-route-member/src/components/member-properties-access-policy.ts |
Resolves member route access. |
packages/ocom/ui-community-route-member/src/components/member-properties-access.context.ts |
Provides selected membership. |
packages/ocom/ui-community-route-member/src/components/member-properties-create.container.graphql |
Defines create mutation. |
packages/ocom/ui-community-route-member/src/components/member-properties-create.container.stories.tsx |
Exercises create container. |
packages/ocom/ui-community-route-member/src/components/member-properties-create.container.tsx |
Executes property creation. |
packages/ocom/ui-community-route-member/src/components/member-properties-create.tsx |
Presents member create form. |
packages/ocom/ui-community-route-member/src/components/member-properties-detail.container.graphql |
Defines detail operations. |
packages/ocom/ui-community-route-member/src/components/member-properties-detail.container.tsx |
Loads and updates details. |
packages/ocom/ui-community-route-member/src/components/member-properties-detail.stories.tsx |
Exercises detail states. |
packages/ocom/ui-community-route-member/src/components/member-properties-detail.tsx |
Selects editable/read-only view. |
packages/ocom/ui-community-route-member/src/components/member-properties-list.container.graphql |
Defines property-list query. |
packages/ocom/ui-community-route-member/src/components/member-properties-list.container.tsx |
Loads member property list. |
packages/ocom/ui-community-route-member/src/components/member-properties-list.stories.tsx |
Exercises list states. |
packages/ocom/ui-community-route-member/src/components/member-properties-list.tsx |
Hides owner list data. |
packages/ocom/ui-community-route-member/src/components/member-properties-route-guard.container.graphql |
Queries route permissions. |
packages/ocom/ui-community-route-member/src/components/member-properties-route-guard.container.stories.tsx |
Exercises guard outcomes. |
packages/ocom/ui-community-route-member/src/components/member-properties-route-guard.container.tsx |
Guards property routes. |
packages/ocom/ui-community-route-member/src/components/member-property-graphql-contract.test.ts |
Tests GraphQL field restrictions. |
packages/ocom/ui-community-route-member/src/components/member-section-layout.tsx |
Adds member navigation. |
packages/ocom/ui-community-route-member/src/index.tsx |
Exports property pages. |
packages/ocom/ui-community-route-member/src/pages/member-home.stories.tsx |
Updates home stories. |
packages/ocom/ui-community-route-member/src/pages/member-home.tsx |
Links property management. |
packages/ocom/ui-community-route-member/src/pages/member-properties-create.stories.tsx |
Adds create-page stories. |
packages/ocom/ui-community-route-member/src/pages/member-properties-create.tsx |
Adds create page. |
packages/ocom/ui-community-route-member/src/pages/member-properties-detail.stories.tsx |
Adds detail-page stories. |
packages/ocom/ui-community-route-member/src/pages/member-properties-detail.tsx |
Adds detail page. |
packages/ocom/ui-community-route-member/src/pages/member-properties-list.stories.tsx |
Adds list-page stories. |
packages/ocom/ui-community-route-member/src/pages/member-properties-list.tsx |
Adds list page. |
packages/ocom/ui-community-route-member/src/pages/member-properties.stories.tsx |
Adds route-shell stories. |
packages/ocom/ui-community-route-member/src/pages/member-properties.tsx |
Adds guarded route shell. |
packages/ocom/ui-community-route-member/src/vite-env.d.ts |
Adds Vite typings. |
packages/ocom/ui-community-route-member/tsconfig.json |
Configures route compilation. |
packages/ocom/ui-community-route-member/tsconfig.vitest.json |
Configures Vitest typing. |
packages/ocom/ui-community-route-member/vitest.arch.config.ts |
Configures architecture tests. |
packages/ocom/ui-community-route-member/vitest.config.ts |
Configures unit tests. |
packages/ocom/ui-community-shared/package.json |
Adds shared UI dependencies. |
packages/ocom/ui-community-shared/src/components/property/address-options.ts |
Defines address options. |
packages/ocom/ui-community-shared/src/components/property/countries.ts |
Defines country data. |
packages/ocom/ui-community-shared/src/components/property/format-display-address.test.ts |
Tests address formatting. |
packages/ocom/ui-community-shared/src/components/property/format-display-address.ts |
Formats property addresses. |
packages/ocom/ui-community-shared/src/components/property/properties-detail.stories.tsx |
Documents detail states. |
packages/ocom/ui-community-shared/src/components/property/properties-detail.tsx |
Renders property details. |
packages/ocom/ui-community-shared/src/components/property/properties-list.stories.tsx |
Documents list states. |
packages/ocom/ui-community-shared/src/components/property/properties-list.tsx |
Renders property tables. |
packages/ocom/ui-community-shared/src/components/property/property-edit-policy.test.ts |
Tests edit policies. |
packages/ocom/ui-community-shared/src/components/property/property-edit-policy.ts |
Defines presentation capabilities. |
packages/ocom/ui-community-shared/src/components/property/property-form.stories.tsx |
Documents form variants. |
packages/ocom/ui-community-shared/src/components/property/property-form.tsx |
Implements shared property form. |
packages/ocom/ui-community-shared/src/components/property/property-form.validation.ts |
Validates property inputs. |
packages/ocom/ui-community-shared/src/components/property/property-input-mappers.test.ts |
Tests input allowlists. |
packages/ocom/ui-community-shared/src/components/property/property-input-mappers.ts |
Maps role-safe inputs. |
packages/ocom/ui-community-shared/src/components/property/property-read-only-detail.tsx |
Renders read-only details. |
packages/ocom/ui-community-shared/src/components/property/property-types.ts |
Defines shared property types. |
packages/ocom/ui-community-shared/src/components/property/sub-page-layout.tsx |
Adds reusable subpage layout. |
packages/ocom/ui-community-shared/src/index.tsx |
Exports property UI APIs. |
packages/ocom/ui-shared/src/components/organisms/dropdown-menu/member-admin-access.ts |
Refines member access typing. |
pnpm-lock.yaml |
Locks dependency changes. |
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
Suppressed comments (3)
packages/ocom/ui-community-route-member/src/components/member-properties-detail.container.graphql:7
MemberPropertyUpdateomits the required container segment from the<Layout><Container><Operation>mutation name. Include the fullMemberPropertiesDetailContaineridentity and regenerate the generated client API.
packages/ocom/ui-community-route-member/src/components/member-properties-detail.container.graphql:19- This fragment name omits the required container segment from the
<Layout><Container><Type>Fieldsconvention. Rename it to includeMemberPropertiesDetailContainerand regenerate all generated references.
packages/ocom/ui-community-route-member/src/components/member-properties-list.container.graphql:7 - This fragment name omits the required container segment from the
<Layout><Container><Type>Fieldsconvention. Rename it to includeMemberPropertiesListContainerand regenerate all generated references.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| export const isPropertyViewable = (passport: Domain.Passport, property: Domain.Contexts.Property.Property.PropertyEntityReference): boolean => { | ||
| return passport.property.forProperty(property).determineIf((permissions) => permissions.isSystemAccount || permissions.canManageProperties); | ||
| export const isPropertyViewable = (passport: Domain.Passport, property: PropertyAuthorizationSubject): boolean => { | ||
| return passport.property.forProperty(property).determineIf((permissions) => permissions.isSystemAccount || permissions.canManageProperties || permissions.canEditOwnProperty); |
| const endUser = await readonlyDataSource.User.EndUser.EndUserReadRepo.getByExternalId(verifiedJwt.sub); | ||
| const member = hints?.memberId ? await readonlyDataSource.Community.Member.MemberReadRepo.getByIdWithCommunityAndRoleAndUser(hints?.memberId) : null; | ||
| const community = hints?.communityId ? await readonlyDataSource.Community.Community.CommunityReadRepo.getById(hints?.communityId) : null; | ||
| const member = endUser && hints?.communityId ? await readonlyDataSource.Community.Member.MemberReadRepo.getByEndUserIdAndCommunityIdWithRole(endUser.id, hints.communityId) : null; |
| // A selected community is not an authentication claim, but it can | ||
| // scope the canonical membership lookup. The member ID header is | ||
| // intentionally never consulted as actor identity. | ||
| if (endUser && member && hasResolvedMemberRole(member)) { |
| * sections; the containers convert between GraphQL data/input shapes and | ||
| * {@link PropertyFormValues}. | ||
| */ | ||
| export const PropertyForm: React.FC<PropertyFormProps> = (props) => { |
| * manager-only deletion confirmation; this component only selects the | ||
| * editable or read-only presentation from an explicit policy. | ||
| */ | ||
| export const PropertyDetails: React.FC<PropertyDetailsProps> = (props) => { |
| children?: React.ReactNode; | ||
| } | ||
|
|
||
| export const SubPageLayout: React.FC<SubPageLayoutProps> = (props) => { |
| @@ -0,0 +1,15 @@ | |||
| mutation MemberPropertyCreate($input: PropertyCreateInput!) { | |||
| @@ -0,0 +1,28 @@ | |||
| query MemberPropertiesList($communityId: ObjectID!) { | |||
| @@ -0,0 +1,25 @@ | |||
| query MemberPropertiesRouteGuardMembersForCurrentEndUser { | |||
| @@ -0,0 +1,80 @@ | |||
| query MemberPropertyDetail($id: ObjectID!) { | |||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.