GoCalTui/storage.go

120 lines
2.4 KiB
Go

package main
import (
"git.skdevstudios.com/SK-Development-Studios/GoCalTui/calendar"
"fmt"
"path/filepath"
"os"
"github.com/dgraph-io/badger/v4"
"google.golang.org/protobuf/proto"
)
type EventInput struct {
Title string
Description string
Year int32
Month int32
Day int32
StartHour int32
EndHour int32
Color string
}
var db *badger.DB
func InitDB(path string) error {
if err := os.MkdirAll(path, 0755); err != nil {
return fmt.Errorf("create data dir: %w", err)
}
var err error
db, err = badger.Open(badger.DefaultOptions(filepath.Join(path, "events_db")).WithLogger(nil))
if err != nil {
return fmt.Errorf("open badger: %w", err)
}
return nil
}
func CloseDB() {
if db != nil {
db.Close()
}
}
func SaveEvent(input EventInput) error {
if db == nil {
return fmt.Errorf("badger DB is not initialized")
}
event := &calendar.Event{
Title: input.Title,
Description: input.Description,
Year: input.Year,
Month: input.Month,
Day: input.Day,
StartHour: input.StartHour,
EndHour: input.EndHour,
Color: input.Color,
}
data, err := proto.Marshal(event)
if err != nil {
return err
}
key := []byte(fmt.Sprintf("events/%04d-%02d-%02d/%02d", event.Year, event.Month, event.Day, event.StartHour))
return db.Update(func(txn *badger.Txn) error {
return txn.Set(key, data)
})
}
func GetEvent(year, month, day, hour int32) (*calendar.Event, error) {
var evt calendar.Event
key := []byte(fmt.Sprintf("events/%04d-%02d-%02d/%02d", year, month, day, hour))
err := db.View(func(txn *badger.Txn) error {
item, err := txn.Get(key)
if err != nil {
return err
}
return item.Value(func(val []byte) error {
return proto.Unmarshal(val, &evt)
})
})
return &evt, err
}
func GetEventsForDay(year, month, day int32) ([]*calendar.Event, error) {
prefix := []byte(fmt.Sprintf("events/%04d-%02d-%02d/", year, month, day))
var events []*calendar.Event
err := db.View(func(txn *badger.Txn) error {
it := txn.NewIterator(badger.DefaultIteratorOptions)
defer it.Close()
for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() {
item := it.Item()
err := item.Value(func(val []byte) error {
var e calendar.Event
if err := proto.Unmarshal(val, &e); err != nil {
return err
}
events = append(events, &e)
return nil
})
if err != nil {
return err
}
}
return nil
})
return events, err
}