schedule/controller.go
2023-07-14 16:05:57 +01:00

120 lines
2.4 KiB
Go

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
}