planner/item/event.go

112 lines
2.1 KiB
Go
Raw Normal View History

2024-09-20 07:09:30 +02:00
package item
import (
"encoding/json"
"fmt"
"time"
)
type EventBody struct {
2024-09-26 07:21:48 +02:00
Title string `json:"title"`
Start time.Time `json:"start"`
Duration time.Duration `json:"duration"`
2024-09-20 07:09:30 +02:00
}
func (e EventBody) MarshalJSON() ([]byte, error) {
type Alias EventBody
return json.Marshal(&struct {
2024-09-26 07:21:48 +02:00
Start string `json:"start"`
Duration string `json:"duration"`
2024-09-20 07:09:30 +02:00
*Alias
}{
2024-09-26 07:21:48 +02:00
Start: e.Start.UTC().Format(time.RFC3339),
Duration: e.Duration.String(),
Alias: (*Alias)(&e),
2024-09-20 07:09:30 +02:00
})
}
2024-09-26 07:21:48 +02:00
func (e *EventBody) UnmarshalJSON(data []byte) error {
type Alias EventBody
aux := &struct {
Start string `json:"start"`
Duration string `json:"duration"`
*Alias
}{
Alias: (*Alias)(e),
}
if err := json.Unmarshal(data, &aux); err != nil {
return err
}
var err error
if e.Start, err = time.Parse(time.RFC3339, aux.Start); err != nil {
return err
}
if e.Duration, err = time.ParseDuration(aux.Duration); err != nil {
return err
}
return nil
}
2024-09-20 07:09:30 +02:00
type Event struct {
2024-12-01 10:22:47 +01:00
ID string `json:"id"`
Recurrer *Recur `json:"recurrer"`
RecurNext time.Time `json:"recurNext"`
2024-09-20 07:09:30 +02:00
EventBody
}
func NewEvent(i Item) (Event, error) {
if i.Kind != KindEvent {
return Event{}, fmt.Errorf("item is not an event")
}
var e Event
if err := json.Unmarshal([]byte(i.Body), &e); err != nil {
return Event{}, fmt.Errorf("could not unmarshal item body: %v", err)
}
e.ID = i.ID
2024-12-01 10:22:47 +01:00
e.Recurrer = i.Recurrer
e.RecurNext = i.RecurNext
2024-09-20 07:09:30 +02:00
return e, nil
}
func (e Event) Item() (Item, error) {
body, err := json.Marshal(EventBody{
2024-09-26 07:21:48 +02:00
Title: e.Title,
Start: e.Start,
Duration: e.Duration,
2024-09-20 07:09:30 +02:00
})
if err != nil {
return Item{}, fmt.Errorf("could not marshal event to json")
}
return Item{
2024-12-01 10:22:47 +01:00
ID: e.ID,
Kind: KindEvent,
Recurrer: e.Recurrer,
RecurNext: e.RecurNext,
Body: string(body),
2024-09-20 07:09:30 +02:00
}, nil
}
2024-10-29 07:22:04 +01:00
func (e Event) Valid() bool {
if e.Title == "" {
return false
}
if e.Start.IsZero() || e.Start.Year() < 2024 {
return false
}
if e.Duration.Seconds() < 1 {
return false
}
2024-12-01 10:22:47 +01:00
if e.Recurrer != nil && !e.Recurrer.Valid() {
return false
}
2024-10-29 07:22:04 +01:00
return true
}