add first ical implementation

This commit is contained in:
Elmar Kresse
2023-08-24 19:53:46 +02:00
parent 0686b9397f
commit 075bf3c899
13 changed files with 447 additions and 19 deletions

View File

@@ -1,10 +1,13 @@
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 {
@@ -24,6 +27,7 @@ func SaveEvents(seminarGroup []model.SeminarGroup, collection *models.Collection
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())
@@ -42,7 +46,7 @@ func contains(s []string, e string) bool {
return false
}
// GetRooms function to get all rooms from database that are stored as a string in the Events struct
// 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 {
@@ -70,3 +74,39 @@ func GetRooms(app *pocketbase.PocketBase) []string {
}
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
}