use crate::domain::entities::{CompatibilityMode, Schema};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use uuid::Uuid;
#[derive(Debug, Deserialize)]
pub struct RegisterSchemaRequest {
pub subject: String,
pub schema: Value,
pub compatibility_mode: Option<CompatibilityModeDto>,
pub description: Option<String>,
pub tags: Option<Vec<String>>,
}
#[derive(Debug, Deserialize)]
pub struct UpdateSchemaRequest {
pub description: Option<String>,
pub tags: Option<Vec<String>>,
pub compatibility_mode: Option<CompatibilityModeDto>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum CompatibilityModeDto {
None,
Backward,
Forward,
Full,
}
impl From<CompatibilityMode> for CompatibilityModeDto {
fn from(mode: CompatibilityMode) -> Self {
match mode {
CompatibilityMode::None => CompatibilityModeDto::None,
CompatibilityMode::Backward => CompatibilityModeDto::Backward,
CompatibilityMode::Forward => CompatibilityModeDto::Forward,
CompatibilityMode::Full => CompatibilityModeDto::Full,
}
}
}
impl From<CompatibilityModeDto> for CompatibilityMode {
fn from(dto: CompatibilityModeDto) -> Self {
match dto {
CompatibilityModeDto::None => CompatibilityMode::None,
CompatibilityModeDto::Backward => CompatibilityMode::Backward,
CompatibilityModeDto::Forward => CompatibilityMode::Forward,
CompatibilityModeDto::Full => CompatibilityMode::Full,
}
}
}
#[derive(Debug, Serialize)]
pub struct SchemaDto {
pub id: Uuid,
pub subject: String,
pub version: u32,
pub schema: Value,
pub compatibility_mode: CompatibilityModeDto,
pub description: Option<String>,
pub tags: Vec<String>,
pub created_at: DateTime<Utc>,
}
impl From<&Schema> for SchemaDto {
fn from(schema: &Schema) -> Self {
Self {
id: schema.id(),
subject: schema.subject().to_string(),
version: schema.version(),
schema: schema.schema_definition().clone(),
compatibility_mode: schema.compatibility_mode().into(),
description: schema.description().map(String::from),
tags: schema.tags().to_vec(),
created_at: schema.created_at(),
}
}
}
impl From<Schema> for SchemaDto {
fn from(schema: Schema) -> Self {
SchemaDto::from(&schema)
}
}
#[derive(Debug, Serialize)]
pub struct RegisterSchemaResponse {
pub schema: SchemaDto,
}
#[derive(Debug, Serialize)]
pub struct ListSchemasResponse {
pub schemas: Vec<SchemaDto>,
pub count: usize,
}
#[derive(Debug, Deserialize)]
pub struct ValidateEventRequest {
pub subject: String,
pub event: Value,
}
#[derive(Debug, Serialize)]
pub struct ValidateEventResponse {
pub valid: bool,
pub errors: Option<Vec<String>>,
}