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;
#[cfg(feature = "export-types")]
use ts_rs::TS;
use utoipa::ToSchema;
use validator::Validate;

use crate::models::comment::CommentStatus;

#[cfg_attr(feature = "export-types", derive(TS))]
#[derive(Debug, Deserialize, Validate, ToSchema)]
pub struct CreateCommentRequest {
    #[validate(length(min = 1, max = 5000))]
    pub content: String,
    #[validate(custom(function = "super::validate_optional_id"))]
    pub parent_id: Option<String>,
    #[validate(length(min = 1, max = 50))]
    pub nickname: Option<String>,
    #[validate(email)]
    pub email: Option<String>,
}

#[cfg_attr(feature = "export-types", derive(TS))]
#[derive(Debug, Deserialize, Validate, ToSchema)]
pub struct UpdateCommentStatusRequest {
    pub status: CommentStatus,
}

#[cfg_attr(feature = "export-types", derive(TS))]
#[derive(Debug, Deserialize)]
pub struct AdminCommentListQuery {
    pub page: Option<i64>,
    pub page_size: Option<i64>,
    pub status: Option<CommentStatus>,
}

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

    #[test]
    fn create_comment_valid() {
        let req = CreateCommentRequest {
            content: "Nice post!".to_string(),
            parent_id: None,
            nickname: Some("Guest".to_string()),
            email: None,
        };
        assert!(req.validate().is_ok());
    }

    #[test]
    fn create_comment_empty_content_fails() {
        let req = CreateCommentRequest {
            content: "".to_string(),
            parent_id: None,
            nickname: None,
            email: None,
        };
        assert!(req.validate().is_err());
    }

    #[test]
    fn update_status_valid() {
        let req = UpdateCommentStatusRequest {
            status: CommentStatus::Approved,
        };
        assert!(req.validate().is_ok());
    }
}