use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use validator::Validate;
#[derive(Debug, Clone, Deserialize, Validate, ToSchema)]
pub struct LoginRequest {
#[validate(email(message = "Invalid email format"))]
pub email: String,
#[validate(length(min = 1, message = "Password is required"))]
pub password: String,
}
#[derive(Debug, Clone, Deserialize, Validate, ToSchema)]
pub struct RegisterRequest {
#[validate(email(message = "Invalid email format"))]
pub email: String,
#[validate(length(min = 8, message = "Password must be at least 8 characters"))]
pub password: String,
#[validate(length(min = 2, max = 100, message = "Name must be between 2 and 100 characters"))]
pub name: String,
}
#[derive(Debug, Clone, Deserialize, Validate, ToSchema)]
pub struct TokenRefreshRequest {
#[validate(length(min = 1, message = "Refresh token is required"))]
pub refresh_token: String,
}
#[derive(Debug, Clone, Serialize, ToSchema)]
pub struct AuthResponse {
pub access_token: String,
pub refresh_token: String,
pub token_type: String,
pub expires_in: u64,
pub user: AuthUserInfo,
}
#[derive(Debug, Clone, Serialize, ToSchema)]
pub struct AuthUserInfo {
pub id: String,
pub email: String,
pub name: String,
pub roles: Vec<String>,
}
#[derive(Debug, Clone, Deserialize, ToSchema)]
pub struct LogoutRequest {
pub refresh_token: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Validate, ToSchema)]
pub struct ChangePasswordRequest {
#[validate(length(min = 1, message = "Current password is required"))]
pub current_password: String,
#[validate(length(min = 8, message = "New password must be at least 8 characters"))]
pub new_password: String,
}
#[derive(Debug, Clone, Deserialize, Validate, ToSchema)]
pub struct PasswordResetRequest {
#[validate(email(message = "Invalid email format"))]
pub email: String,
}
#[derive(Debug, Clone, Deserialize, Validate, ToSchema)]
pub struct PasswordResetConfirm {
#[validate(length(min = 1, message = "Reset token is required"))]
pub token: String,
#[validate(length(min = 8, message = "New password must be at least 8 characters"))]
pub new_password: String,
}
#[derive(Debug, Clone, Serialize, ToSchema)]
pub struct MessageResponse {
pub message: String,
}
impl MessageResponse {
pub fn new(message: impl Into<String>) -> Self {
Self {
message: message.into(),
}
}
}