Skip to main content

zlayer_types/api/
groups.rs

1//! User group API DTOs.
2
3use serde::{Deserialize, Serialize};
4use utoipa::ToSchema;
5
6/// Body for `POST /api/v1/groups`.
7#[derive(Debug, Serialize, Deserialize, ToSchema)]
8pub struct CreateGroupRequest {
9    /// Group name.
10    pub name: String,
11    /// Free-form description.
12    #[serde(default)]
13    pub description: Option<String>,
14}
15
16/// Body for `PATCH /api/v1/groups/{id}`.
17#[derive(Debug, Serialize, Deserialize, ToSchema)]
18pub struct UpdateGroupRequest {
19    /// Updated name.
20    #[serde(default)]
21    pub name: Option<String>,
22    /// Updated description.
23    #[serde(default)]
24    pub description: Option<String>,
25}
26
27/// Body for `POST /api/v1/groups/{id}/members`.
28#[derive(Debug, Serialize, Deserialize, ToSchema)]
29pub struct AddMemberRequest {
30    /// The user id to add.
31    pub user_id: String,
32}
33
34/// Response for member list queries.
35#[derive(Debug, Serialize, Deserialize, ToSchema)]
36pub struct GroupMembersResponse {
37    /// Group id.
38    pub group_id: String,
39    /// List of user ids in the group.
40    pub members: Vec<String>,
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn test_create_group_request_deserialize() {
49        let json = r#"{"name": "developers"}"#;
50        let req: CreateGroupRequest = serde_json::from_str(json).unwrap();
51        assert_eq!(req.name, "developers");
52        assert!(req.description.is_none());
53    }
54
55    #[test]
56    fn test_create_group_request_with_description() {
57        let json = r#"{"name": "devs", "description": "Developer team"}"#;
58        let req: CreateGroupRequest = serde_json::from_str(json).unwrap();
59        assert_eq!(req.name, "devs");
60        assert_eq!(req.description.as_deref(), Some("Developer team"));
61    }
62
63    #[test]
64    fn test_update_group_request_partial() {
65        let req: UpdateGroupRequest = serde_json::from_str("{}").unwrap();
66        assert!(req.name.is_none());
67        assert!(req.description.is_none());
68    }
69
70    #[test]
71    fn test_add_member_request_deserialize() {
72        let json = r#"{"user_id": "u-123"}"#;
73        let req: AddMemberRequest = serde_json::from_str(json).unwrap();
74        assert_eq!(req.user_id, "u-123");
75    }
76}