use chrono::{DateTime, Utc};
use rmcp::schemars;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Serialize, Deserialize, schemars::JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ItemType {
MultipleChoice,
MultipleSelect,
TrueFalse,
ShortAnswer,
Numeric,
Essay,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, schemars::JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum Difficulty {
Easy,
Medium,
Hard,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, schemars::JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum Cognitive {
Remember,
Understand,
Apply,
Analyze,
Evaluate,
Create,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct Item {
pub id: String,
pub stem: String,
pub itype: ItemType,
pub subject: String,
pub difficulty: Difficulty,
pub cognitive: Cognitive,
pub points: f64,
pub options: Vec<String>,
pub answer_key: Vec<String>,
pub tolerance: Option<f64>,
pub standard_ids: Vec<String>,
pub rubric_id: Option<String>,
pub created_by: String,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct Standard {
pub id: String,
pub code: String,
pub framework: String, pub subject: String,
pub grade: String,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct RubricCriterion {
pub name: String,
pub description: String,
pub max_points: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct Rubric {
pub id: String,
pub name: String,
pub criteria: Vec<RubricCriterion>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, schemars::JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum AssessmentStatus {
Draft,
Published,
Archived,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct Assessment {
pub id: String,
pub title: String,
pub subject: String,
pub status: AssessmentStatus,
pub item_ids: Vec<String>,
pub total_points: f64,
pub pass_threshold: f64,
pub created_by: String,
pub created_at: DateTime<Utc>,
pub published_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, schemars::JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum AttemptStatus {
InProgress,
Submitted,
Graded,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct ItemResponse {
pub item_id: String,
pub value: serde_json::Value,
pub awarded_points: Option<f64>,
pub correct: Option<bool>,
pub rubric_scores: Vec<f64>,
pub feedback: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct Attempt {
pub id: String,
pub assessment_id: String,
pub learner_id: String,
pub status: AttemptStatus,
pub responses: Vec<ItemResponse>,
pub score: Option<f64>,
pub max_score: f64,
pub percent: Option<f64>,
pub passed: Option<bool>,
pub started_at: DateTime<Utc>,
pub submitted_at: Option<DateTime<Utc>>,
pub graded_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct AuditEntry {
pub at: DateTime<Utc>,
pub actor: String,
pub action: String,
pub detail: String,
}