mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-08-28 13:17:14 +00:00
fix(cloud): track workspace membership provenance (#2406)
* fix(cloud): converge legacy revision-zero members * fix(cloud): track workspace membership provenance * test(persistence): track current migration head --------- Co-authored-by: Chan <dadachann@users.noreply.github.com>
This commit is contained in:
@@ -15,6 +15,7 @@ from ..entity.persistence.cloud_directory import DirectoryProjectionInbox, Direc
|
||||
from ..entity.persistence.user import AccountSource, AccountStatus, User
|
||||
from ..entity.persistence.workspace import (
|
||||
MembershipRole,
|
||||
MembershipSource,
|
||||
MembershipStatus,
|
||||
Workspace,
|
||||
WorkspaceExecutionSource,
|
||||
@@ -886,15 +887,15 @@ class DirectoryProjectionService:
|
||||
account_uuid=member.account_uuid,
|
||||
role=role,
|
||||
status=status,
|
||||
source=MembershipSource.CLOUD_PROJECTION.value,
|
||||
joined_at=joined_at,
|
||||
projection_revision=member.projection_revision,
|
||||
)
|
||||
)
|
||||
continue
|
||||
if membership.projection_revision == 0:
|
||||
# Revision zero is Core-owned collaboration state. Directory
|
||||
# projection seeds memberships, but must not overwrite later
|
||||
# invitation, role, or removal decisions made by Core.
|
||||
if membership.source != MembershipSource.CLOUD_PROJECTION.value:
|
||||
# Core-owned collaboration state is never adopted based on
|
||||
# account provenance, revision, or matching account identity.
|
||||
continue
|
||||
if membership.uuid != member.membership_uuid:
|
||||
raise DirectoryProjectionUnavailableError('Directory membership UUID changed for one account')
|
||||
@@ -906,11 +907,12 @@ class DirectoryProjectionService:
|
||||
raise DirectoryProjectionUnavailableError('Directory membership revision has conflicting contents')
|
||||
membership.role = role
|
||||
membership.status = status
|
||||
membership.source = MembershipSource.CLOUD_PROJECTION.value
|
||||
membership.joined_at = joined_at
|
||||
membership.projection_revision = member.projection_revision
|
||||
|
||||
for account_uuid, membership in existing.items():
|
||||
if account_uuid not in included_accounts and membership.projection_revision != 0:
|
||||
if account_uuid not in included_accounts and membership.source == MembershipSource.CLOUD_PROJECTION.value:
|
||||
membership.status = MembershipStatus.REMOVED.value
|
||||
membership.projection_revision = max(
|
||||
int(membership.projection_revision),
|
||||
|
||||
Reference in New Issue
Block a user