61 lines
2.3 KiB
JSON
61 lines
2.3 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://yovision.local/contracts/evidence/v1/evidence-reference.schema.json",
|
|
"title": "YoVision evidence logical reference v1",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"schema_version",
|
|
"evidence_id",
|
|
"owner_id",
|
|
"type",
|
|
"status",
|
|
"captured_at",
|
|
"status_updated_at"
|
|
],
|
|
"properties": {
|
|
"schema_version": {"const": "yovision.evidence-reference/v1"},
|
|
"evidence_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"},
|
|
"owner_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"},
|
|
"type": {"enum": ["snapshot", "clip"]},
|
|
"status": {"enum": ["pending", "processing", "success", "failed"]},
|
|
"captured_at": {"type": "string", "format": "date-time"},
|
|
"status_updated_at": {"type": "string", "format": "date-time"},
|
|
"expires_at": {"type": "string", "format": "date-time"},
|
|
"content_type": {"enum": ["image/jpeg", "image/png", "video/mp4"]},
|
|
"integrity": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["algorithm", "digest", "size_bytes"],
|
|
"properties": {
|
|
"algorithm": {"const": "sha256"},
|
|
"digest": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
|
|
"size_bytes": {"type": "integer", "minimum": 0}
|
|
}
|
|
},
|
|
"failure": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["code", "retryable"],
|
|
"properties": {
|
|
"code": {"enum": ["capture_failed", "processing_failed", "expired", "unavailable"]},
|
|
"retryable": {"type": "boolean"}
|
|
}
|
|
}
|
|
},
|
|
"allOf": [
|
|
{
|
|
"if": {"properties": {"status": {"const": "success"}}, "required": ["status"]},
|
|
"then": {"required": ["content_type", "integrity"], "not": {"required": ["failure"]}}
|
|
},
|
|
{
|
|
"if": {"properties": {"status": {"const": "failed"}}, "required": ["status"]},
|
|
"then": {"required": ["failure"], "not": {"anyOf": [{"required": ["content_type"]}, {"required": ["integrity"]}]}}
|
|
},
|
|
{
|
|
"if": {"properties": {"status": {"enum": ["pending", "processing"]}}, "required": ["status"]},
|
|
"then": {"not": {"anyOf": [{"required": ["content_type"]}, {"required": ["integrity"]}, {"required": ["failure"]}]}}
|
|
}
|
|
]
|
|
}
|