package main import ( "time" "gorm.io/gorm" "gorm.io/gorm/clause" ) func GetScheduleItems(db *gorm.DB, fromDate time.Time, toDate time.Time) ([]ScheduleItem, error) { var items []ScheduleItem res := db.Preload("Tags").Where("date BETWEEN ? AND ?", fromDate.Format(time.DateOnly), toDate.Format(time.DateOnly)).Find(&items) return items, res.Error } func GetScheduleItem(db *gorm.DB, id int) (*ScheduleItem, error) { var item ScheduleItem res := db.Preload("Tags").First(&item, id) if res.RowsAffected < 1 { return nil, nil } return &item, res.Error } func DeleteScheduleItem(db *gorm.DB, id int) (bool, error) { res := db.Delete(&ScheduleItem{}, id) if res.Error != nil { return false, res.Error } if res.RowsAffected < 1 { return false, nil } return true, nil } func CreateScheduleItem(db *gorm.DB, name string, description *string, duration Duration, date time.Time, tagNames []string) (ScheduleItem, error) { var tags = []ScheduleTag{} var err error if len(tagNames) > 0 { tags, err = UpsertScheduleTags(db, tagNames) if err != nil { return ScheduleItem{}, err } } item := ScheduleItem{ Name: name, Description: description, Duration: duration, Date: date, Tags: tags, } res := db.Create(&item) return item, res.Error } func GetScheduleTags(db *gorm.DB) ([]ScheduleTag, error) { var tags []ScheduleTag res := db.Find(&tags) return tags, res.Error } func GetScheduleTag(db *gorm.DB, id int) (*ScheduleTag, error) { var tag ScheduleTag res := db.First(&tag, id) if res.RowsAffected < 1 { return nil, nil } return &tag, res.Error } func DeleteScheduleTag(db *gorm.DB, id int) (bool, error) { res := db.Delete(&ScheduleTag{}, id) if res.Error != nil { return false, res.Error } if res.RowsAffected < 1 { return false, nil } return true, nil } func CreateScheduleTag(db *gorm.DB, name string) (ScheduleTag, error) { tag := ScheduleTag{ Name: name, } res := db.Create(&tag) return tag, res.Error } func UpsertScheduleTags(db *gorm.DB, names []string) ([]ScheduleTag, error) { var tags = []ScheduleTag{} for _, name := range names { tags = append(tags, ScheduleTag{Name: name}) } res := db.Clauses(clause.OnConflict{DoNothing: true}).Create(&tags) return tags, res.Error } func Cleanup(db *gorm.DB) error { res := db.Exec("select * from schedule_tags where id not in (select schedule_tag_id from schedule_item_tags);") return res.Error }