feat: govern file lifecycle and connector writes

This commit is contained in:
2026-08-20 22:06:57 +02:00
parent 95aef18955
commit 6c3cf1c55e
27 changed files with 2721 additions and 65 deletions
@@ -14,6 +14,7 @@ from govoplan_files.backend.storage.connector_profiles import ConnectorProfile
SYNC_MODES = {"manual"}
WRITABLE_PROVIDERS = {"s3"}
def connector_space_owner_id(space: FileConnectorSpace) -> str:
@@ -40,6 +41,7 @@ def create_connector_space(
ensure_owner_access(session, tenant_id=tenant_id, owner_type=owner_type, owner_id=owner_id, user_id=user_id, is_admin=is_admin)
label = _normalize_label(label)
sync_mode = _normalize_sync_mode(sync_mode)
validate_connector_space_write_mode(profile, read_only=read_only)
remote_path = normalize_connector_browse_path(remote_path)
library_id = _clean_optional(library_id)
@@ -145,6 +147,7 @@ def update_connector_space(
library_id: str | None = None,
remote_path: str | None = None,
sync_mode: str | None = None,
read_only: bool | None = None,
is_active: bool | None = None,
metadata: Mapping[str, Any] | None = None,
is_admin: bool = False,
@@ -178,6 +181,8 @@ def update_connector_space(
space.remote_path = normalize_connector_browse_path(remote_path)
if sync_mode is not None:
space.sync_mode = _normalize_sync_mode(sync_mode)
if read_only is not None:
space.read_only = bool(read_only)
if is_active is not None:
space.is_active = bool(is_active)
if metadata is not None:
@@ -187,6 +192,17 @@ def update_connector_space(
return space
def validate_connector_space_write_mode(
profile: ConnectorProfile, *, read_only: bool
) -> None:
if read_only:
return
if profile.provider not in WRITABLE_PROVIDERS or "write" not in profile.capabilities:
raise FileStorageError(
"Two-way mode requires an S3 connection with the write capability enabled"
)
def soft_delete_connector_space(
session: Session,
space: FileConnectorSpace,