Files
htwkalender-pwa/service/db/dbEvents.go
2023-08-24 19:53:46 +02:00

113 lines
3.3 KiB
Go

package db
import (
"github.com/jordic/goics"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/models"
"htwk-planner/model"
"strings"
"time"
)
func SaveEvents(seminarGroup []model.SeminarGroup, collection *models.Collection, app *pocketbase.PocketBase) error {
for _, seminarGroup := range seminarGroup {
for _, event := range seminarGroup.Events {
var err error = nil
record := models.NewRecord(collection)
record.Set("Day", event.Day)
record.Set("Week", event.Week)
record.Set("Start", event.Start)
record.Set("End", event.End)
record.Set("Name", event.Name)
record.Set("EventType", event.EventType)
record.Set("Prof", event.Prof)
record.Set("Rooms", event.Rooms)
record.Set("Notes", event.Notes)
record.Set("BookedAt", event.BookedAt)
record.Set("course", seminarGroup.Course)
record.Set("semester", event.Semester)
err = app.Dao().SaveRecord(record)
if err != nil {
println("Error while saving record: ", err.Error())
}
}
}
return nil
}
func contains(s []string, e string) bool {
for _, a := range s {
if a == e {
return true
}
}
return false
}
// GetRooms function to get all rooms from database that are stored as a string in the Event struct
func GetRooms(app *pocketbase.PocketBase) []string {
var events []struct {
Rooms string `db:"Rooms" json:"Rooms"`
}
// get all rooms from event records in the events collection
err := app.Dao().DB().Select("Rooms").From("events").All(&events)
if err != nil {
print("Error while getting rooms from database: ", err)
return nil
}
var roomArray []string
for _, event := range events {
var room = strings.Split(event.Rooms, " ")
//split string room by space and add each room to array if it is not already in there
for _, r := range room {
var text = strings.TrimSpace(r)
if !contains(roomArray, text) && !strings.Contains(text, " ") && len(text) >= 1 {
roomArray = append(roomArray, text)
}
}
}
return roomArray
}
type Events []*model.Event
// EmitICal implements the interface for goics
func (e Events) EmitICal() goics.Componenter {
c := goics.NewComponent()
c.SetType("VCALENDAR")
c.AddProperty("CALSCAL", "GREGORIAN")
for _, event := range e {
s := goics.NewComponent()
s.SetType("VEVENT")
timeEnd, _ := time.Parse("2024-01-07 07:00:00 +0000 UTC", event.End)
timeStart, _ := time.Parse("2024-01-07 07:00:00 +0000 UTC", event.Start)
k, v := goics.FormatDateTimeField("DTEND", timeEnd)
s.AddProperty(k, v)
k, v = goics.FormatDateTimeField("DTSTART", timeStart)
s.AddProperty(k, v)
s.AddProperty("SUMMARY", event.Name)
s.AddProperty("DESCRIPTION", event.Notes)
s.AddProperty("LOCATION", event.Rooms)
c.AddComponent(s)
}
return c
}
// GetPlanForCourseAndSemester gets all events for specific course and semester
func GetPlanForCourseAndSemester(app *pocketbase.PocketBase, course string, semester string) Events {
var events Events
// get all events from event records in the events collection
err := app.Dao().DB().Select("*").From("events").Where(dbx.NewExp("course = {:course} AND semester = {:semester}", dbx.Params{"course": course, "semester": semester})).All(&events)
if err != nil {
print("Error while getting events from database: ", err)
return nil
}
return events
}