1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use aruna_rust_api::api::storage::models::v2::{permission::ResourceId, ResourceVariant};
use diesel_ulid::DieselUlid;
use std::str::FromStr;

#[derive(
    Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Clone, serde::Serialize, serde::Deserialize,
)]
pub enum Resource {
    Project(DieselUlid),
    Collection(DieselUlid),
    Dataset(DieselUlid),
    Object(DieselUlid),
}

impl TryFrom<ResourceId> for Resource {
    type Error = anyhow::Error;

    fn try_from(value: ResourceId) -> Result<Self, Self::Error> {
        match value {
            ResourceId::ProjectId(id) => Ok(Self::Project(DieselUlid::from_str(&id)?)),
            ResourceId::CollectionId(id) => Ok(Self::Collection(DieselUlid::from_str(&id)?)),
            ResourceId::DatasetId(id) => Ok(Self::Dataset(DieselUlid::from_str(&id)?)),
            ResourceId::ObjectId(id) => Ok(Self::Object(DieselUlid::from_str(&id)?)),
        }
    }
}

impl Resource {
    pub fn get_id(&self) -> DieselUlid {
        match self {
            Resource::Project(i) => *i,
            Resource::Collection(i) => *i,
            Resource::Dataset(i) => *i,
            Resource::Object(i) => *i,
        }
    }
    pub fn update_id(&self, new_id: DieselUlid) -> Resource {
        match self {
            Resource::Project(_) => Resource::Project(new_id),
            Resource::Collection(_) => Resource::Collection(new_id),
            Resource::Dataset(_) => Resource::Dataset(new_id),
            Resource::Object(_) => Resource::Object(new_id),
        }
    }

    pub fn get_type(&self) -> ResourceVariant {
        match self {
            Resource::Project(_) => ResourceVariant::Project,
            Resource::Collection(_) => ResourceVariant::Collection,
            Resource::Dataset(_) => ResourceVariant::Dataset,
            Resource::Object(_) => ResourceVariant::Object,
        }
    }
}

#[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Clone)]
pub enum ResourcePermission {
    Resource(Resource),
    GlobalAdmin,
    ServiceAccount,
}

impl From<Resource> for ResourcePermission {
    fn from(value: Resource) -> Self {
        ResourcePermission::Resource(value)
    }
}

#[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Clone)]
pub enum PubKey {
    DataProxy(String),
    Server(String),
}

#[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Clone)]
pub struct ResPath {
    pub project: (Resource, String),
    pub collection: Option<(Resource, String)>,
    pub dataset: Option<(Resource, String)>,
    pub object: (Resource, String),
}