feat(project): add members types
zhenyi committed
Added lib/project/features/members/types.rs lib/project/features/members/types.rs +70 −0 View lib/project/features/members/types.rs
@@ -0,0 +1,70 @@
1use db::project::project_members::ProjectMemberRole as DbRole;
2use serde::{Deserialize, Serialize};
3use time::OffsetDateTime;
4use utoipa::ToSchema;
5use uuid::Uuid;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
8#[serde(rename_all = "snake_case")]
9pub enum MemberRole {
10 Owner,
11 Lead,
12 Contributor,
13 Viewer,
14}
15
16impl From<DbRole> for MemberRole {
17 fn from(r: DbRole) -> Self {
18 match r {
19 DbRole::Owner => Self::Owner,
20 DbRole::Lead => Self::Lead,
21 DbRole::Contributor => Self::Contributor,
22 DbRole::Viewer => Self::Viewer,
23 }
24 }
25}
26
27impl TryFrom<MemberRole> for DbRole {
28 type Error = crate::error::ProjectError;
29
30 fn try_from(r: MemberRole) -> Result<Self, Self::Error> {
31 match r {
32 MemberRole::Owner => Ok(DbRole::Owner),
33 MemberRole::Lead => Ok(DbRole::Lead),
34 MemberRole::Contributor => Ok(DbRole::Contributor),
35 MemberRole::Viewer => Ok(DbRole::Viewer),
36 }
37 }
38}
39
40#[derive(Debug, Clone, Deserialize, ToSchema)]
41pub struct AddMemberCmd {
42 pub user_id: Uuid,
43 #[serde(default = "default_role")]
44 pub role: MemberRole,
45}
46
47fn default_role() -> MemberRole {
48 MemberRole::Contributor
49}
50
51#[derive(Debug, Clone, Deserialize, ToSchema)]
52pub struct UpdateMemberCmd {
53 pub role: MemberRole,
54}
55
56#[derive(Debug, Clone, Serialize, ToSchema)]
57pub struct MemberView {
58 pub id: Uuid,
59 pub project_id: Uuid,
60 pub user_id: Uuid,
61 pub role: MemberRole,
62 pub joined_at: OffsetDateTime,
63 pub updated_at: Option<OffsetDateTime>,
64}
65
66#[derive(Debug, Clone, Serialize, ToSchema)]
67pub struct MemberPage {
68 pub total: u64,
69 pub items: Vec<MemberView>,
70}
No newline at end of file