feat(backend): add Pydantic schemas
This commit is contained in:
126
backend/src/schemas/pattern.py
Normal file
126
backend/src/schemas/pattern.py
Normal file
@@ -0,0 +1,126 @@
|
||||
from typing import Any
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class PatternBase(BaseModel):
|
||||
"""Base pattern schema."""
|
||||
|
||||
name: str
|
||||
slug: str
|
||||
description: str | None = None
|
||||
when_to_use: str | None = None
|
||||
pattern_type: str | None = None
|
||||
display_order: int | None = None
|
||||
|
||||
|
||||
class PatternResponse(PatternBase):
|
||||
"""Pattern response schema."""
|
||||
|
||||
id: UUID
|
||||
question_count: int = 0
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
|
||||
class PatternListResponse(BaseModel):
|
||||
"""Response for pattern list."""
|
||||
|
||||
items: list[PatternResponse]
|
||||
|
||||
|
||||
class PatternDetailResponse(PatternBase):
|
||||
"""Pattern detail with related questions."""
|
||||
|
||||
id: UUID
|
||||
question_count: int = 0
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
|
||||
# Tutorial-specific schemas
|
||||
|
||||
|
||||
class CommonMistake(BaseModel):
|
||||
"""A common mistake when using a pattern."""
|
||||
|
||||
title: str
|
||||
description: str
|
||||
fix: str | None = None
|
||||
|
||||
|
||||
class PatternVariation(BaseModel):
|
||||
"""A variation of a pattern."""
|
||||
|
||||
name: str
|
||||
description: str
|
||||
example: str | None = None
|
||||
|
||||
|
||||
class RelatedPattern(BaseModel):
|
||||
"""Brief info about a related pattern."""
|
||||
|
||||
slug: str
|
||||
name: str
|
||||
description: str | None = None
|
||||
|
||||
|
||||
class LearningQuestion(BaseModel):
|
||||
"""Question for learning progression."""
|
||||
|
||||
id: UUID
|
||||
title: str
|
||||
slug: str
|
||||
difficulty: str
|
||||
leetcode_id: int | None = None
|
||||
is_optimal: bool = False
|
||||
|
||||
|
||||
class LearningProgression(BaseModel):
|
||||
"""Curated learning path for a pattern."""
|
||||
|
||||
warmup: list[LearningQuestion]
|
||||
core: list[LearningQuestion]
|
||||
challenge: list[LearningQuestion]
|
||||
|
||||
|
||||
class VisualizationExample(BaseModel):
|
||||
"""Interactive visualization example for a pattern."""
|
||||
|
||||
id: str
|
||||
title: str
|
||||
input: dict[str, Any] | None = None
|
||||
code: str
|
||||
steps: list[dict[str, Any]]
|
||||
|
||||
|
||||
class PatternTutorialResponse(PatternBase):
|
||||
"""Full pattern tutorial with all educational content."""
|
||||
|
||||
id: UUID
|
||||
question_count: int = 0
|
||||
|
||||
# Tutorial content
|
||||
metaphor: str | None = None
|
||||
core_concept: str | None = None
|
||||
visualization: str | None = None
|
||||
code_template: str | None = None
|
||||
|
||||
# Structured data
|
||||
recognition_signals: list[str] | None = None
|
||||
common_mistakes: list[CommonMistake] | None = None
|
||||
variations: list[PatternVariation] | None = None
|
||||
related_patterns: list[RelatedPattern] | None = None
|
||||
prerequisite_patterns: list[RelatedPattern] | None = None
|
||||
|
||||
# Difficulty level (1-5)
|
||||
difficulty_level: int | None = None
|
||||
|
||||
# Learning progression
|
||||
learning_progression: LearningProgression | None = None
|
||||
|
||||
# Interactive visualization examples
|
||||
visualization_examples: list[VisualizationExample] | None = None
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
Reference in New Issue
Block a user