143 lines
3.1 KiB
Go
143 lines
3.1 KiB
Go
package db
|
|
|
|
import "context"
|
|
|
|
/*
|
|
DDL
|
|
|
|
CREATE TABLE `courses` (
|
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
`name` varchar(100) NOT NULL,
|
|
`short_name` varchar(10) NOT NULL,
|
|
`category` varchar(100) NOT NULL,
|
|
`description` varchar(1000) DEFAULT NULL,
|
|
`image_url` varchar(255) DEFAULT NULL,
|
|
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
|
|
`updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
|
`deleted` tinyint(4) DEFAULT 0,
|
|
`prereq_id` int(11) DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `name` (`name`),
|
|
UNIQUE KEY `shortName` (`short_name`) USING BTREE
|
|
) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8mb4;
|
|
*/
|
|
|
|
type Course struct {
|
|
ObjectBase
|
|
Name string `json:"name"`
|
|
ShortName string `json:"short_name"`
|
|
Category string `json:"category"`
|
|
Description string `json:"description"`
|
|
ImageURL string `json:"image_url"`
|
|
|
|
PassedMembers []Member `json:"passed_members" gorm:"many2many:member_courses_pass;"`
|
|
FailedMembers []Member `json:"failed_members" gorm:"many2many:member_courses_fail;"`
|
|
Prerequisites []*Course `json:"prerequisites" gorm:"many2many:course_prerequisites;"`
|
|
TrainingEvents []TrainingEvent `json:"training_events"`
|
|
}
|
|
|
|
// Get one by id
|
|
func (c *Course) GetByID(id int) error {
|
|
db, err := GetDB()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = db.First(c, id).Error
|
|
return err
|
|
}
|
|
|
|
// Get one by name
|
|
func (c *Course) GetByName(name string) error {
|
|
db, err := GetDB()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = db.Where("name = ?", name).First(c).Error
|
|
return err
|
|
}
|
|
|
|
// Get all
|
|
func (c *Course) GetAll() ([]Course, error) {
|
|
db, err := GetDB()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var courses []Course
|
|
err = db.Find(&courses).Error
|
|
return courses, err
|
|
}
|
|
|
|
// Get all training events for a course
|
|
func (c *Course) GetTrainingEvents(ctx context.Context, id int) ([]TrainingEvent, error) {
|
|
db, err := GetDB()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var events []TrainingEvent
|
|
err = db.WithContext(ctx).Where("course_id = ?", id).Find(&events).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return events, nil
|
|
}
|
|
|
|
// Get all prerequisites for a course
|
|
func (c *Course) GetPrerequisites(ctx context.Context, id int) ([]Course, error) {
|
|
var prereqs []Course
|
|
db, err := GetDB()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = db.WithContext(ctx).Model(c).Where("id = ?", id).Association("Prerequisites").Find(&prereqs)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return prereqs, nil
|
|
}
|
|
|
|
// Create a new course
|
|
func (c *Course) Create(ctx context.Context, course Course) error {
|
|
db, err := GetDB()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = db.WithContext(ctx).Create(course).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Update a course
|
|
func (c *Course) Update(ctx context.Context, course Course) error {
|
|
db, err := GetDB()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = db.WithContext(ctx).Save(course).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Delete a course
|
|
func (c *Course) Delete(ctx context.Context, course Course) error {
|
|
db, err := GetDB()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = db.WithContext(ctx).Delete(course).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|