125 lines
4.3 KiB
JSON
125 lines
4.3 KiB
JSON
{
|
|||
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||
|
|
"$id": "https://yovision.local/contracts/sense-device-audit-v2.schema.json",
|
||
|
|
"title": "Sense Device Audit Event v2",
|
||
|
|
"description": "v1 的向后兼容后继:增加脱敏设备配置受理事实,仍不定义 Bell relay。",
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": [
|
||
|
|
"event_id", "event_type", "tenant_id", "site_id", "device_id",
|
||
|
|
"actor", "reason", "trace_id", "aggregate_generation",
|
||
|
|
"projection_versions", "data", "occurred_at"
|
||
|
|
],
|
||
|
|
"properties": {
|
||
|
|
"event_id": {"type": "string", "pattern": "^audit_[0-9a-f]{32}$"},
|
||
|
|
"event_type": {
|
||
|
|
"enum": [
|
||
|
|
"device.created",
|
||
|
|
"device.desired_state.accepted",
|
||
|
|
"device.configuration.accepted"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"tenant_id": {"$ref": "#/$defs/logicalId"},
|
||
|
|
"site_id": {"$ref": "#/$defs/logicalId"},
|
||
|
|
"device_id": {"$ref": "#/$defs/logicalId"},
|
||
|
|
"actor": {
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["type", "id"],
|
||
|
|
"properties": {
|
||
|
|
"type": {"enum": ["user", "service", "system"]},
|
||
|
|
"id": {"type": "string", "minLength": 1, "maxLength": 200}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"reason": {"type": ["string", "null"], "maxLength": 500},
|
||
|
|
"trace_id": {"type": ["string", "null"], "maxLength": 128},
|
||
|
|
"aggregate_generation": {"type": "integer", "minimum": 1},
|
||
|
|
"projection_versions": {
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["quota_source_version", "area_policy_source_version"],
|
||
|
|
"properties": {
|
||
|
|
"quota_source_version": {"type": ["integer", "null"], "minimum": 1},
|
||
|
|
"area_policy_source_version": {"type": ["integer", "null"], "minimum": 1}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"data": {
|
||
|
|
"oneOf": [
|
||
|
|
{"$ref": "#/$defs/deviceCreatedData"},
|
||
|
|
{"$ref": "#/$defs/desiredStateData"},
|
||
|
|
{"$ref": "#/$defs/configurationData"}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"occurred_at": {"type": "string", "format": "date-time"}
|
||
|
|
},
|
||
|
|
"allOf": [
|
||
|
|
{
|
||
|
|
"if": {"properties": {"event_type": {"const": "device.created"}}},
|
||
|
|
"then": {"properties": {"data": {"$ref": "#/$defs/deviceCreatedData"}}}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"if": {"properties": {"event_type": {"const": "device.desired_state.accepted"}}},
|
||
|
|
"then": {"properties": {"data": {"$ref": "#/$defs/desiredStateData"}}}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"if": {"properties": {"event_type": {"const": "device.configuration.accepted"}}},
|
||
|
|
"then": {"properties": {"data": {"$ref": "#/$defs/configurationData"}}}
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"$defs": {
|
||
|
|
"logicalId": {
|
||
|
|
"type": "string",
|
||
|
|
"minLength": 1,
|
||
|
|
"maxLength": 128,
|
||
|
|
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
|
||
|
|
},
|
||
|
|
"desiredState": {"enum": ["disabled", "enabled"]},
|
||
|
|
"deviceCreatedData": {
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["kind", "area_id", "modality", "capabilities", "desired_state"],
|
||
|
|
"properties": {
|
||
|
|
"kind": {"const": "device_created"},
|
||
|
|
"area_id": {"$ref": "#/$defs/logicalId"},
|
||
|
|
"modality": {"enum": ["video", "radar", "contact", "button", "wearable", "other"]},
|
||
|
|
"capabilities": {
|
||
|
|
"type": "array",
|
||
|
|
"maxItems": 16,
|
||
|
|
"uniqueItems": true,
|
||
|
|
"items": {"enum": ["video_capture", "audio_capture", "spatial_rule", "telemetry"]}
|
||
|
|
},
|
||
|
|
"desired_state": {"$ref": "#/$defs/desiredState"}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"desiredStateData": {
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["kind", "previous_desired_state", "desired_state", "changed"],
|
||
|
|
"properties": {
|
||
|
|
"kind": {"const": "desired_state_accepted"},
|
||
|
|
"previous_desired_state": {"$ref": "#/$defs/desiredState"},
|
||
|
|
"desired_state": {"$ref": "#/$defs/desiredState"},
|
||
|
|
"changed": {"type": "boolean"}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"configurationData": {
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["kind", "changed", "changed_fields", "area_id"],
|
||
|
|
"properties": {
|
||
|
|
"kind": {"const": "configuration_accepted"},
|
||
|
|
"changed": {"type": "boolean"},
|
||
|
|
"changed_fields": {
|
||
|
|
"type": "array",
|
||
|
|
"maxItems": 5,
|
||
|
|
"uniqueItems": true,
|
||
|
|
"items": {
|
||
|
|
"enum": ["name", "area_id", "endpoint_ref", "credential_ref", "profile_token"]
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"area_id": {"$ref": "#/$defs/logicalId"}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|