use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use uuid::Uuid;
use super::{CourseIdentifier, CourseInstance, EducationalCredential, Syllabus};
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct Course {
#[serde(default = "Uuid::new_v4")]
pub id: Uuid,
pub name: String,
#[serde(default)]
pub alternate_names: Vec<String>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub disambiguating_description: Option<String>,
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub image: Vec<String>,
#[serde(default)]
pub same_as: Vec<String>,
#[serde(default)]
pub keywords: Vec<String>,
#[serde(default)]
pub identifiers: Vec<CourseIdentifier>,
#[serde(default)]
pub additional_type: Option<String>,
#[serde(default = "default_true")]
pub active: bool,
#[serde(default)]
pub about: Vec<String>,
#[serde(default)]
pub audience: Option<String>,
#[serde(default)]
pub in_language: Vec<String>,
#[serde(default)]
pub license: Option<String>,
#[serde(default)]
pub typical_age_range: Option<String>,
#[serde(default)]
pub time_required: Option<String>,
#[serde(default)]
pub version: Option<String>,
#[serde(default)]
pub is_accessible_for_free: Option<bool>,
#[serde(default)]
pub teaches: Vec<String>,
#[serde(default)]
pub assesses: Vec<String>,
#[serde(default)]
pub competency_required: Vec<String>,
#[serde(default)]
pub educational_level: Option<EducationalLevel>,
#[serde(default)]
pub educational_use: Option<String>,
#[serde(default)]
pub learning_resource_type: Option<LearningResourceType>,
#[serde(default)]
pub interactivity_type: Option<InteractivityType>,
#[serde(default)]
pub course_code: Option<String>,
#[serde(default)]
pub number_of_credits: Option<u32>,
#[serde(default)]
pub course_prerequisites: Vec<String>,
#[serde(default)]
pub available_language: Vec<String>,
#[serde(default)]
pub financial_aid_eligible: Vec<String>,
#[serde(default)]
pub educational_credential_awarded: Option<EducationalCredential>,
#[serde(default)]
pub occupational_credential_awarded: Option<EducationalCredential>,
#[serde(default)]
pub total_historical_enrollment: Option<u64>,
#[serde(default)]
pub syllabus_sections: Vec<Syllabus>,
#[serde(default)]
pub instances: Vec<CourseInstance>,
#[serde(default)]
pub status: CourseStatus,
#[serde(default)]
pub links: Vec<CourseLink>,
#[serde(default)]
pub provider_id: Option<Uuid>,
#[serde(default)]
pub deleted_at: Option<DateTime<Utc>>,
#[serde(default = "Utc::now")]
pub created_at: DateTime<Utc>,
#[serde(default = "Utc::now")]
pub updated_at: DateTime<Utc>,
}
fn default_true() -> bool {
true
}
impl Course {
pub fn new(name: impl Into<String>) -> Self {
let now = Utc::now();
Self {
id: Uuid::new_v4(),
name: name.into(),
alternate_names: vec![],
description: None,
disambiguating_description: None,
url: None,
image: vec![],
same_as: vec![],
keywords: vec![],
identifiers: vec![],
additional_type: None,
active: true,
about: vec![],
audience: None,
in_language: vec![],
license: None,
typical_age_range: None,
time_required: None,
version: None,
is_accessible_for_free: None,
teaches: vec![],
assesses: vec![],
competency_required: vec![],
educational_level: None,
educational_use: None,
learning_resource_type: None,
interactivity_type: None,
course_code: None,
number_of_credits: None,
course_prerequisites: vec![],
available_language: vec![],
financial_aid_eligible: vec![],
educational_credential_awarded: None,
occupational_credential_awarded: None,
total_historical_enrollment: None,
syllabus_sections: vec![],
instances: vec![],
status: CourseStatus::default(),
links: vec![],
provider_id: None,
deleted_at: None,
created_at: now,
updated_at: now,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default, ToSchema)]
#[serde(rename_all = "lowercase")]
pub enum CourseStatus {
Draft,
#[default]
Published,
Archived,
Retired,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
pub enum EducationalLevel {
Beginner,
Intermediate,
Advanced,
Expert,
PrimaryEducation,
SecondaryEducation,
HigherEducation,
Undergraduate,
Graduate,
Postgraduate,
Vocational,
ProfessionalDevelopment,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
pub enum LearningResourceType {
Lecture,
Tutorial,
Workshop,
Assignment,
Reading,
Video,
Audio,
Exam,
Simulation,
Project,
Discussion,
Custom(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
#[serde(rename_all = "lowercase")]
pub enum InteractivityType {
Active,
Expositive,
Mixed,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CourseLink {
pub other_course_id: Uuid,
pub link_type: LinkType,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
#[serde(rename_all = "kebab-case")]
pub enum LinkType {
Replaces,
ReplacedBy,
Seealso,
Prerequisite,
Successor,
}