koprogo_api/application/dto/
auth_dto.rs

1use serde::{Deserialize, Serialize};
2use utoipa::ToSchema;
3use validator::Validate;
4
5#[derive(Debug, Deserialize, Validate, ToSchema)]
6pub struct LoginRequest {
7    #[validate(email(message = "Email must be valid"))]
8    pub email: String,
9
10    #[validate(length(min = 6, message = "Password must be at least 6 characters"))]
11    pub password: String,
12}
13
14#[derive(Debug, Deserialize, Validate, ToSchema)]
15pub struct RegisterRequest {
16    #[validate(email(message = "Email must be valid"))]
17    pub email: String,
18
19    #[validate(length(min = 6, message = "Password must be at least 6 characters"))]
20    pub password: String,
21
22    #[validate(length(min = 2, message = "First name must be at least 2 characters"))]
23    pub first_name: String,
24
25    #[validate(length(min = 2, message = "Last name must be at least 2 characters"))]
26    pub last_name: String,
27
28    pub role: String,
29
30    pub organization_id: Option<uuid::Uuid>,
31}
32
33#[derive(Debug, Serialize, Clone)]
34pub struct LoginResponse {
35    pub token: String,
36    pub refresh_token: String,
37    pub user: UserResponse,
38}
39
40#[derive(Debug, Deserialize, ToSchema)]
41pub struct RefreshTokenRequest {
42    pub refresh_token: String,
43}
44
45#[derive(Debug, Serialize, Deserialize, Clone)]
46pub struct UserRoleSummary {
47    pub id: uuid::Uuid,
48    pub role: String,
49    pub organization_id: Option<uuid::Uuid>,
50    pub is_primary: bool,
51}
52
53#[derive(Debug, Serialize, Deserialize, Clone)]
54pub struct UserResponse {
55    pub id: uuid::Uuid,
56    pub email: String,
57    pub first_name: String,
58    pub last_name: String,
59    pub role: String,
60    pub organization_id: Option<uuid::Uuid>,
61    pub is_active: bool,
62    pub roles: Vec<UserRoleSummary>,
63    pub active_role: Option<UserRoleSummary>,
64}
65
66#[derive(Debug, Deserialize, ToSchema)]
67pub struct SwitchRoleRequest {
68    pub role_id: uuid::Uuid,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct Claims {
73    pub sub: String, // user id
74    pub email: String,
75    pub role: String,
76    pub organization_id: Option<uuid::Uuid>,
77    pub role_id: Option<uuid::Uuid>,
78    pub exp: i64, // expiration timestamp
79    pub iat: i64, // issued at
80}