allsource_core/application/dto/
schema_dto.rs

1use crate::domain::entities::{CompatibilityMode, Schema};
2use chrono::{DateTime, Utc};
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use uuid::Uuid;
6
7/// DTO for registering a new schema
8#[derive(Debug, Deserialize)]
9pub struct RegisterSchemaRequest {
10    pub subject: String,
11    pub schema: Value,
12    pub compatibility_mode: Option<CompatibilityModeDto>,
13    pub description: Option<String>,
14    pub tags: Option<Vec<String>>,
15}
16
17/// DTO for updating a schema
18#[derive(Debug, Deserialize)]
19pub struct UpdateSchemaRequest {
20    pub description: Option<String>,
21    pub tags: Option<Vec<String>>,
22    pub compatibility_mode: Option<CompatibilityModeDto>,
23}
24
25/// DTO for compatibility mode
26#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
27#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
28pub enum CompatibilityModeDto {
29    None,
30    Backward,
31    Forward,
32    Full,
33}
34
35impl From<CompatibilityMode> for CompatibilityModeDto {
36    fn from(mode: CompatibilityMode) -> Self {
37        match mode {
38            CompatibilityMode::None => CompatibilityModeDto::None,
39            CompatibilityMode::Backward => CompatibilityModeDto::Backward,
40            CompatibilityMode::Forward => CompatibilityModeDto::Forward,
41            CompatibilityMode::Full => CompatibilityModeDto::Full,
42        }
43    }
44}
45
46impl From<CompatibilityModeDto> for CompatibilityMode {
47    fn from(dto: CompatibilityModeDto) -> Self {
48        match dto {
49            CompatibilityModeDto::None => CompatibilityMode::None,
50            CompatibilityModeDto::Backward => CompatibilityMode::Backward,
51            CompatibilityModeDto::Forward => CompatibilityMode::Forward,
52            CompatibilityModeDto::Full => CompatibilityMode::Full,
53        }
54    }
55}
56
57/// DTO for schema response
58#[derive(Debug, Serialize)]
59pub struct SchemaDto {
60    pub id: Uuid,
61    pub subject: String,
62    pub version: u32,
63    pub schema: Value,
64    pub compatibility_mode: CompatibilityModeDto,
65    pub description: Option<String>,
66    pub tags: Vec<String>,
67    pub created_at: DateTime<Utc>,
68}
69
70impl From<&Schema> for SchemaDto {
71    fn from(schema: &Schema) -> Self {
72        Self {
73            id: schema.id(),
74            subject: schema.subject().to_string(),
75            version: schema.version(),
76            schema: schema.schema_definition().clone(),
77            compatibility_mode: schema.compatibility_mode().into(),
78            description: schema.description().map(String::from),
79            tags: schema.tags().to_vec(),
80            created_at: schema.created_at(),
81        }
82    }
83}
84
85impl From<Schema> for SchemaDto {
86    fn from(schema: Schema) -> Self {
87        SchemaDto::from(&schema)
88    }
89}
90
91/// Response for schema registration
92#[derive(Debug, Serialize)]
93pub struct RegisterSchemaResponse {
94    pub schema: SchemaDto,
95}
96
97/// Response for listing schemas
98#[derive(Debug, Serialize)]
99pub struct ListSchemasResponse {
100    pub schemas: Vec<SchemaDto>,
101    pub count: usize,
102}
103
104/// Request for validating an event against a schema
105#[derive(Debug, Deserialize)]
106pub struct ValidateEventRequest {
107    pub subject: String,
108    pub event: Value,
109}
110
111/// Response for event validation
112#[derive(Debug, Serialize)]
113pub struct ValidateEventResponse {
114    pub valid: bool,
115    pub errors: Option<Vec<String>>,
116}