mirror of
https://github.com/Dvorinka/Trackeep.git
synced 2026-06-03 20:12:58 +00:00
143 lines
5.8 KiB
Go
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
|
|
}
|