Skip to main content

uqa_core/catalog_sequence/
security.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Durable sequence authority retains role identities independently of display names.
8
9use super::{SequenceAclEntry, SequencePrivileges};
10use crate::catalog_role::{BoundAclEntry, RoleIdentity};
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
14#[serde(deny_unknown_fields)]
15pub struct BoundSequenceSecurity {
16    pub role_owner: RoleIdentity,
17    /// Explicit null preserves default owner privileges; a missing current field is invalid.
18    #[serde(deserialize_with = "Deserialize::deserialize")]
19    pub acl: Option<Vec<BoundAclEntry<SequencePrivileges>>>,
20}
21
22impl BoundSequenceSecurity {
23    pub fn owner(role_owner: RoleIdentity) -> Self {
24        Self {
25            role_owner,
26            acl: None,
27        }
28    }
29}
30
31/// Named authority is accepted only as input to complete initial catalog restoration.
32#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
33#[serde(deny_unknown_fields)]
34pub struct LegacySequenceSecurity {
35    #[serde(default = "legacy_owner")]
36    pub role_owner: String,
37    #[serde(default, skip_serializing_if = "Option::is_none")]
38    pub acl: Option<Vec<SequenceAclEntry>>,
39}
40
41impl LegacySequenceSecurity {
42    pub fn owner(role_owner: impl Into<String>) -> Self {
43        Self {
44            role_owner: role_owner.into(),
45            acl: None,
46        }
47    }
48}
49
50fn legacy_owner() -> String {
51    "uqa".into()
52}