zlayer_types/api/
permissions.rs1use serde::{Deserialize, Serialize};
4use utoipa::{IntoParams, ToSchema};
5
6use crate::storage::{PermissionLevel, SubjectKind};
7
8#[derive(Debug, Deserialize, IntoParams)]
10pub struct ListPermissionsQuery {
11 #[serde(default)]
13 pub user: Option<String>,
14 #[serde(default)]
16 pub group: Option<String>,
17}
18
19#[derive(Debug, Deserialize, IntoParams)]
21pub struct ListByResourceQuery {
22 pub kind: String,
24 #[serde(default)]
26 pub id: Option<String>,
27}
28
29#[derive(Debug, Serialize, Deserialize, ToSchema)]
31pub struct GrantPermissionRequest {
32 pub subject_kind: SubjectKind,
34 pub subject_id: String,
36 pub resource_kind: String,
38 #[serde(default)]
40 pub resource_id: Option<String>,
41 pub level: PermissionLevel,
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48
49 #[test]
50 fn test_grant_permission_request_deserialize() {
51 let json = r#"{
52 "subject_kind": "user",
53 "subject_id": "u-1",
54 "resource_kind": "deployment",
55 "resource_id": "d-1",
56 "level": "write"
57 }"#;
58 let req: GrantPermissionRequest = serde_json::from_str(json).unwrap();
59 assert_eq!(req.subject_kind, SubjectKind::User);
60 assert_eq!(req.subject_id, "u-1");
61 assert_eq!(req.resource_kind, "deployment");
62 assert_eq!(req.resource_id.as_deref(), Some("d-1"));
63 assert_eq!(req.level, PermissionLevel::Write);
64 }
65
66 #[test]
67 fn test_grant_permission_request_wildcard() {
68 let json = r#"{
69 "subject_kind": "group",
70 "subject_id": "g-1",
71 "resource_kind": "project",
72 "level": "read"
73 }"#;
74 let req: GrantPermissionRequest = serde_json::from_str(json).unwrap();
75 assert_eq!(req.subject_kind, SubjectKind::Group);
76 assert!(req.resource_id.is_none());
77 assert_eq!(req.level, PermissionLevel::Read);
78 }
79
80 #[test]
81 fn test_list_permissions_query_user() {
82 let q: ListPermissionsQuery = serde_json::from_str(r#"{"user": "u-1"}"#).unwrap();
83 assert_eq!(q.user.as_deref(), Some("u-1"));
84 assert!(q.group.is_none());
85 }
86
87 #[test]
88 fn test_list_permissions_query_group() {
89 let q: ListPermissionsQuery = serde_json::from_str(r#"{"group": "g-1"}"#).unwrap();
90 assert!(q.user.is_none());
91 assert_eq!(q.group.as_deref(), Some("g-1"));
92 }
93}