Implement task 006 site config versioning and audit events
This commit is contained in:
@@ -16,6 +16,11 @@ from src.domain.contracts import (
|
||||
)
|
||||
|
||||
|
||||
_VERSION_CREATED_EVENT_TYPE = "SCRIPT_CONFIG_VERSION_CREATED"
|
||||
_VERSION_ACTIVATED_EVENT_TYPE = "SCRIPT_CONFIG_VERSION_ACTIVATED"
|
||||
_VERSION_ROLLBACK_EVENT_TYPE = "SCRIPT_CONFIG_VERSION_ROLLBACK"
|
||||
|
||||
|
||||
def create_target_site(
|
||||
repository: object,
|
||||
request: TargetSiteConfigCreateRequest,
|
||||
@@ -40,6 +45,14 @@ def create_target_site(
|
||||
return TargetSiteConfigResponse(site=site)
|
||||
|
||||
|
||||
def get_target_site(
|
||||
repository: object,
|
||||
site_id: UUID,
|
||||
) -> TargetSiteConfigResponse:
|
||||
site = repository.target_sites.get_by_id(site_id)
|
||||
return TargetSiteConfigResponse(site=site)
|
||||
|
||||
|
||||
def update_target_site(
|
||||
repository: object,
|
||||
site_id: UUID,
|
||||
@@ -82,6 +95,16 @@ def create_script_config_version(
|
||||
request: ScriptConfigVersionCreateRequest,
|
||||
) -> ScriptConfigVersionResponse:
|
||||
repository.target_sites.get_by_id(site_id)
|
||||
|
||||
if request.rollback_target_version_id is not None:
|
||||
rollback_target = repository.script_config_versions.get_by_id(
|
||||
request.rollback_target_version_id
|
||||
)
|
||||
if str(rollback_target["target_site_id"]) != str(site_id):
|
||||
raise LookupError(
|
||||
f"Rollback target version is not for site: {request.rollback_target_version_id}"
|
||||
)
|
||||
|
||||
existing_versions = repository.script_config_versions.list_for_site(site_id)
|
||||
version = request.version or _next_version(existing_versions)
|
||||
now = _now()
|
||||
@@ -112,6 +135,24 @@ def create_script_config_version(
|
||||
target_site_id=site_id,
|
||||
version_id=version_id,
|
||||
activated_at=now,
|
||||
rollback_target_version_id=request.rollback_target_version_id,
|
||||
)
|
||||
repository.script_config_version_events.create(
|
||||
target_site_id=site_id,
|
||||
version_id=version_id,
|
||||
event_type=_VERSION_ACTIVATED_EVENT_TYPE,
|
||||
actor_user_id=current_user.id,
|
||||
payload={"action": "activate", "version": version},
|
||||
created_at=now,
|
||||
)
|
||||
else:
|
||||
repository.script_config_version_events.create(
|
||||
target_site_id=site_id,
|
||||
version_id=version_id,
|
||||
event_type=_VERSION_CREATED_EVENT_TYPE,
|
||||
actor_user_id=current_user.id,
|
||||
payload={"action": "create", "version": version},
|
||||
created_at=now,
|
||||
)
|
||||
|
||||
return ScriptConfigVersionResponse(version=_script_version_summary(row))
|
||||
@@ -122,6 +163,7 @@ def activate_script_config_version(
|
||||
*,
|
||||
site_id: UUID,
|
||||
version_id: UUID,
|
||||
current_user: CurrentUser,
|
||||
) -> ScriptConfigVersionResponse:
|
||||
repository.target_sites.get_by_id(site_id)
|
||||
row = repository.script_config_versions.activate(
|
||||
@@ -129,6 +171,54 @@ def activate_script_config_version(
|
||||
version_id=version_id,
|
||||
activated_at=_now(),
|
||||
)
|
||||
repository.script_config_version_events.create(
|
||||
target_site_id=site_id,
|
||||
version_id=version_id,
|
||||
event_type=_VERSION_ACTIVATED_EVENT_TYPE,
|
||||
actor_user_id=current_user.id,
|
||||
payload={"action": "activate", "version_id": str(version_id)},
|
||||
created_at=_now(),
|
||||
)
|
||||
return ScriptConfigVersionResponse(version=_script_version_summary(row))
|
||||
|
||||
|
||||
def rollback_script_config_version(
|
||||
repository: object,
|
||||
*,
|
||||
site_id: UUID,
|
||||
version_id: UUID,
|
||||
current_user: CurrentUser,
|
||||
) -> ScriptConfigVersionResponse:
|
||||
target_site = repository.target_sites.get_by_id(site_id)
|
||||
version_row = repository.script_config_versions.get_by_id(version_id)
|
||||
if str(version_row["target_site_id"]) != str(site_id):
|
||||
raise LookupError(
|
||||
f"Script config version not found for site: {site_id} {version_id}"
|
||||
)
|
||||
|
||||
rollback_target_id = target_site.active_script_config_version_id
|
||||
if rollback_target_id == version_id:
|
||||
rollback_target_id = None
|
||||
|
||||
row = repository.script_config_versions.activate(
|
||||
target_site_id=site_id,
|
||||
version_id=version_id,
|
||||
activated_at=_now(),
|
||||
rollback_target_version_id=rollback_target_id,
|
||||
)
|
||||
repository.script_config_version_events.create(
|
||||
target_site_id=site_id,
|
||||
version_id=version_id,
|
||||
event_type=_VERSION_ROLLBACK_EVENT_TYPE,
|
||||
actor_user_id=current_user.id,
|
||||
payload={
|
||||
"action": "rollback",
|
||||
"rollback_target_version_id": (
|
||||
str(rollback_target_id) if rollback_target_id is not None else None
|
||||
),
|
||||
},
|
||||
created_at=_now(),
|
||||
)
|
||||
return ScriptConfigVersionResponse(version=_script_version_summary(row))
|
||||
|
||||
|
||||
@@ -147,10 +237,13 @@ def _script_version_summary(row: dict[str, object]) -> ScriptConfigVersionSummar
|
||||
target_site_id=row["target_site_id"],
|
||||
version=row["version"],
|
||||
status=row["status"],
|
||||
diff=row["diff"],
|
||||
rollback_target_version_id=row["rollback_target_version_id"],
|
||||
publishing_yaml_hash=row["publishing_yaml_hash"],
|
||||
transform_script_hash=row["transform_script_hash"],
|
||||
created_by=row["created_by"],
|
||||
created_at=row["created_at"],
|
||||
activated_at=row["activated_at"],
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user