raisfast 0.2.23

The last backend you'll ever need. Rust-powered headless CMS with built-in blog, ecommerce, wallet, payment and 4 plugin engines.
use serde::{Deserialize, Serialize};
#[cfg(feature = "export-types")]
use ts_rs::TS;
use utoipa::ToSchema;
use validator::Validate;

use crate::models::user::UserRole;

use super::validate_id_vec;

#[cfg_attr(feature = "export-types", derive(TS))]
#[derive(Debug, Deserialize, Validate, ToSchema)]
pub struct BatchRequest {
    #[validate(length(min = 1))]
    pub action: String,
    #[validate(length(min = 1), custom(function = "validate_id_vec"))]
    pub ids: Vec<String>,
}

#[cfg_attr(feature = "export-types", derive(TS))]
#[derive(Debug, Deserialize, Validate, ToSchema)]
pub struct BatchRequestWithRole {
    #[validate(length(min = 1))]
    pub action: String,
    #[validate(length(min = 1), custom(function = "validate_id_vec"))]
    pub ids: Vec<String>,
    pub role: Option<UserRole>,
}

#[cfg_attr(feature = "export-types", derive(TS))]
#[derive(Debug, Serialize, ToSchema)]
pub struct BatchResponse {
    pub action: String,
    pub affected: usize,
}

impl BatchResponse {
    pub fn new(action: &str, affected: usize) -> Self {
        Self {
            action: action.to_string(),
            affected,
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn batch_request_valid() {
        let req = BatchRequest {
            action: "delete".to_string(),
            ids: vec!["1234567890".to_string()],
        };
        assert!(req.validate().is_ok());
    }

    #[test]
    fn batch_request_empty_action_fails() {
        let req = BatchRequest {
            action: "".to_string(),
            ids: vec!["1234567890".to_string()],
        };
        assert!(req.validate().is_err());
    }

    #[test]
    fn batch_request_empty_ids_fails() {
        let req = BatchRequest {
            action: "delete".to_string(),
            ids: vec![],
        };
        assert!(req.validate().is_err());
    }

    #[test]
    fn batch_request_with_role_valid() {
        let req = BatchRequestWithRole {
            action: "change_role".to_string(),
            ids: vec!["1234567890".to_string()],
            role: Some(UserRole::Author),
        };
        assert!(req.validate().is_ok());
    }

    #[test]
    fn batch_response_new() {
        let resp = BatchResponse::new("delete", 3);
        assert_eq!(resp.action, "delete");
        assert_eq!(resp.affected, 3);
    }
}