Files
Tomas Dvorak d27cf14110 first test
2026-02-08 14:14:55 +01:00

143 lines
5.8 KiB
Go

package models
import (
"time"
"gorm.io/gorm"
)
// LearningPath represents a structured learning path
type LearningPath struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
// Basic information
Title string `json:"title" gorm:"not null"`
Description string `json:"description"`
Category string `json:"category" gorm:"not null"` // programming, design, business, etc.
Difficulty string `json:"difficulty" gorm:"default:beginner"` // beginner, intermediate, advanced
// Metadata
Duration string `json:"duration"` // estimated time to complete
Thumbnail string `json:"thumbnail"` // cover image
IsPublished bool `json:"is_published" gorm:"default:false"`
IsFeatured bool `json:"is_featured" gorm:"default:false"`
// Creator information
CreatorID uint `json:"creator_id" gorm:"not null;index"`
Creator User `json:"creator,omitempty" gorm:"foreignKey:CreatorID"`
// Relationships
Modules []LearningModule `json:"modules,omitempty" gorm:"foreignKey:LearningPathID"`
Courses []LearningPathCourse `json:"courses,omitempty" gorm:"foreignKey:LearningPathID"`
Tags []Tag `json:"tags,omitempty" gorm:"many2many:learning_path_tags;"`
Enrollments []Enrollment `json:"enrollments,omitempty" gorm:"foreignKey:LearningPathID"`
// Statistics
EnrollmentCount int `json:"enrollment_count" gorm:"default:0"`
Rating float64 `json:"rating" gorm:"default:0"`
ReviewCount int `json:"review_count" gorm:"default:0"`
}
// LearningModule represents a module within a learning path
type LearningModule struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
// Basic information
LearningPathID uint `json:"learning_path_id" gorm:"not null;index"`
LearningPath LearningPath `json:"learning_path,omitempty" gorm:"foreignKey:LearningPathID"`
Title string `json:"title" gorm:"not null"`
Description string `json:"description"`
Content string `json:"content" gorm:"type:text"`
Order int `json:"order" gorm:"not null"`
// Module type
ModuleType string `json:"module_type" gorm:"default:lesson"` // lesson, project, quiz, video, reading
// Resources
Resources []ModuleResource `json:"resources,omitempty" gorm:"foreignKey:LearningModuleID"`
// Completion tracking
EstimatedDuration string `json:"estimated_duration"`
IsRequired bool `json:"is_required" gorm:"default:true"`
}
// ModuleResource represents a resource within a learning module
type ModuleResource struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
LearningModuleID uint `json:"learning_module_id" gorm:"not null;index"`
LearningModule LearningModule `json:"learning_module,omitempty" gorm:"foreignKey:LearningModuleID"`
Title string `json:"title" gorm:"not null"`
URL string `json:"url"`
Type string `json:"type" gorm:"not null"` // video, article, book, tool, download
Description string `json:"description"`
Order int `json:"order" gorm:"not null"`
// External resource metadata
Thumbnail string `json:"thumbnail"`
Duration string `json:"duration"`
IsExternal bool `json:"is_external" gorm:"default:true"`
}
// Enrollment represents a user's enrollment in a learning path
type Enrollment struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
UserID uint `json:"user_id" gorm:"not null;index"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
LearningPathID uint `json:"learning_path_id" gorm:"not null;index"`
LearningPath LearningPath `json:"learning_path,omitempty" gorm:"foreignKey:LearningPathID"`
CourseID *uint `json:"course_id,omitempty"` // for direct course enrollment
Course *Course `json:"course,omitempty" gorm:"foreignKey:CourseID"`
// Enrollment status
Status string `json:"status" gorm:"default:enrolled"` // enrolled, in_progress, completed, dropped
StartedAt *time.Time `json:"started_at"`
CompletedAt *time.Time `json:"completed_at"`
// Progress tracking
Progress float64 `json:"progress" gorm:"default:0"` // percentage 0-100
CompletedModules []uint `json:"completed_modules" gorm:"serializer:json"`
CurrentModuleID *uint `json:"current_module_id"`
// User feedback
Rating *float64 `json:"rating"`
Review string `json:"review"`
ReviewDate *time.Time `json:"review_date"`
}
// Progress represents a user's progress in a specific module
type Progress struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
UserID uint `json:"user_id" gorm:"not null;index"`
EnrollmentID uint `json:"enrollment_id" gorm:"not null;index"`
LearningModuleID uint `json:"learning_module_id" gorm:"not null;index"`
// Progress status
Status string `json:"status" gorm:"default:not_started"` // not_started, in_progress, completed
StartedAt *time.Time `json:"started_at"`
CompletedAt *time.Time `json:"completed_at"`
// Progress details
TimeSpent int `json:"time_spent"` // minutes
ProgressData string `json:"progress_data" gorm:"type:json"` // additional progress data
}