diff --git a/backend/migrations/1697576446_updated_events.go b/backend/migrations/1697576446_updated_events.go new file mode 100644 index 0000000..f3b5b2a --- /dev/null +++ b/backend/migrations/1697576446_updated_events.go @@ -0,0 +1,52 @@ +package migrations + +import ( + "encoding/json" + + "github.com/pocketbase/dbx" + "github.com/pocketbase/pocketbase/daos" + m "github.com/pocketbase/pocketbase/migrations" + "github.com/pocketbase/pocketbase/models/schema" +) + +func init() { + m.Register(func(db dbx.Builder) error { + dao := daos.New(db); + + collection, err := dao.FindCollectionByNameOrId("7her4515qsmrxe8") + if err != nil { + return err + } + + // add + new_Compulsory := &schema.SchemaField{} + json.Unmarshal([]byte(`{ + "system": false, + "id": "vgmhhgcz", + "name": "Compulsory", + "type": "text", + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }`), new_Compulsory) + collection.Schema.AddField(new_Compulsory) + + return dao.SaveCollection(collection) + }, func(db dbx.Builder) error { + dao := daos.New(db); + + collection, err := dao.FindCollectionByNameOrId("7her4515qsmrxe8") + if err != nil { + return err + } + + // remove + collection.Schema.RemoveField("vgmhhgcz") + + return dao.SaveCollection(collection) + }) +} diff --git a/backend/model/eventModel.go b/backend/model/eventModel.go index daaf229..2d333e1 100644 --- a/backend/model/eventModel.go +++ b/backend/model/eventModel.go @@ -3,16 +3,17 @@ package model type Events []*Event type Event struct { - Day string `db:"Day" json:"day"` - Week string `db:"Week" json:"week"` - Start string `db:"Start" json:"start"` - End string `db:"End" json:"end"` - Name string `db:"Name" json:"name"` - EventType string `db:"EventType" json:"eventType"` - Prof string `db:"Prof" json:"prof"` - Rooms string `db:"Rooms" json:"rooms"` - Notes string `db:"Notes" json:"notes"` - BookedAt string `db:"BookedAt" json:"bookedAt"` - Course string `db:"course" json:"course"` - Semester string `db:"semester" json:"semester"` + Day string `db:"Day" json:"day"` + Week string `db:"Week" json:"week"` + Start string `db:"Start" json:"start"` + End string `db:"End" json:"end"` + Name string `db:"Name" json:"name"` + EventType string `db:"EventType" json:"eventType"` + Compulsory string `db:"Compulsory" json:"compulsory"` + Prof string `db:"Prof" json:"prof"` + Rooms string `db:"Rooms" json:"rooms"` + Notes string `db:"Notes" json:"notes"` + BookedAt string `db:"BookedAt" json:"bookedAt"` + Course string `db:"course" json:"course"` + Semester string `db:"semester" json:"semester"` } diff --git a/backend/service/db/dbEvents.go b/backend/service/db/dbEvents.go index 3079fbd..65432cd 100644 --- a/backend/service/db/dbEvents.go +++ b/backend/service/db/dbEvents.go @@ -1,11 +1,12 @@ package db import ( + "htwkalender/model" + "log" + "github.com/pocketbase/dbx" "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/models" - "htwkalender/model" - "log" ) func SaveEvents(seminarGroup []model.SeminarGroup, collection *models.Collection, app *pocketbase.PocketBase) ([]*models.Record, error) { @@ -41,6 +42,7 @@ func SaveEvents(seminarGroup []model.SeminarGroup, collection *models.Collection record.Set("End", event.End) record.Set("Name", event.Name) record.Set("EventType", event.EventType) + record.Set("Compulsory", event.Compulsory) record.Set("Prof", event.Prof) record.Set("Rooms", event.Rooms) record.Set("Notes", event.Notes) diff --git a/backend/service/fetch/fetchSeminarEventService.go b/backend/service/fetch/fetchSeminarEventService.go index 24e6baa..6ff1006 100644 --- a/backend/service/fetch/fetchSeminarEventService.go +++ b/backend/service/fetch/fetchSeminarEventService.go @@ -2,10 +2,6 @@ package fetch import ( "fmt" - "github.com/labstack/echo/v5" - "github.com/pocketbase/pocketbase" - "github.com/pocketbase/pocketbase/apis" - "golang.org/x/net/html" "htwkalender/model" "htwkalender/service/date" "htwkalender/service/db" @@ -15,6 +11,11 @@ import ( "strconv" "strings" "time" + + "github.com/labstack/echo/v5" + "github.com/pocketbase/pocketbase" + "github.com/pocketbase/pocketbase/apis" + "golang.org/x/net/html" ) func GetSeminarEvents(c echo.Context, app *pocketbase.PocketBase) error { @@ -81,6 +82,21 @@ func GetSeminarGroupsEventsFromHTML(seminarGroupsLabel []string) []model.Seminar return seminarGroups } +func splitEventType(events []model.Event) []model.Event { + + for i, event := range events { + matched, _ := regexp.Match("^(V|P|S)(w|p)$", []byte(event.EventType)) + if matched { + eventType := event.EventType + event.EventType = eventType[0:1] + event.Compulsory = eventType[1:2] + events[i] = event + } + } + + return events +} + func parseSeminarGroup(result string) model.SeminarGroup { doc, err := html.Parse(strings.NewReader(result)) if err != nil { @@ -102,6 +118,7 @@ func parseSeminarGroup(result string) model.SeminarGroup { semesterString := findFirstSpanWithClass(table, "header-0-2-0").FirstChild.Data semester, year := extractSemesterAndYear(semesterString) events = convertWeeksToDates(events, semester, year) + events = splitEventType(events) var seminarGroup = model.SeminarGroup{ University: findFirstSpanWithClass(table, "header-1-0-0").FirstChild.Data, Course: findFirstSpanWithClass(table, "header-2-0-1").FirstChild.Data, diff --git a/backend/service/fetch/fetchSeminarEventService_test.go b/backend/service/fetch/fetchSeminarEventService_test.go index b3d95d4..853fd22 100644 --- a/backend/service/fetch/fetchSeminarEventService_test.go +++ b/backend/service/fetch/fetchSeminarEventService_test.go @@ -119,3 +119,93 @@ func Test_replaceEmptyEventNames(t *testing.T) { }) } } + +func Test_splitEventType(t *testing.T) { + type args struct { + events []model.Event + } + tests := []struct { + name string + args args + want []model.Event + }{ + { + name: "Test 1", + args: args{ + events: []model.Event{ + { + EventType: "V", + }, + }, + }, + want: []model.Event{ + { + EventType: "V", + Compulsory: "", + }, + }, + }, + { + name: "Test 2", + args: args{ + events: []model.Event{ + { + EventType: "Vw", + }, + }, + }, + want: []model.Event{ + { + EventType: "V", + Compulsory: "w", + }, + }, + }, + { + name: "Test 3", + args: args{ + events: []model.Event{ + { + EventType: "Sperr", + }, + }, + }, + want: []model.Event{ + { + EventType: "Sperr", + Compulsory: "", + }, + }, + }, + { + name: "Test 4", + args: args{ + events: []model.Event{ + { + EventType: "Sperr", + }, + { + EventType: "Vw", + }, + }, + }, + want: []model.Event{ + { + EventType: "Sperr", + Compulsory: "", + }, + { + EventType: "V", + Compulsory: "w", + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := splitEventType(tt.args.events); !reflect.DeepEqual(got, tt.want) { + t.Errorf("splitEventType() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/backend/service/ical/icalFileGeneration.go b/backend/service/ical/icalFileGeneration.go index 14d64ba..f780e32 100644 --- a/backend/service/ical/icalFileGeneration.go +++ b/backend/service/ical/icalFileGeneration.go @@ -1,10 +1,12 @@ package ical import ( - "github.com/jordic/goics" "htwkalender/model" "htwkalender/service/functions" + "htwkalender/service/names" "time" + + "github.com/jordic/goics" ) // local type for EmitICal function @@ -33,7 +35,7 @@ func (icalModel IcalModel) EmitICal() goics.Componenter { s.AddProperty(k, v) k, v = goics.FormatDateTime("DTSTART;TZID=Europe/Berlin", timeStart) s.AddProperty(k, v) - s.AddProperty("SUMMARY", replaceNameIfUserDefined(event.Name, icalModel.Mapping)) + s.AddProperty("SUMMARY", replaceNameIfUserDefined(event, icalModel.Mapping)) s.AddProperty("DESCRIPTION", generateDescription(event)) s.AddProperty("LOCATION", event.Rooms) c.AddComponent(s) @@ -41,13 +43,13 @@ func (icalModel IcalModel) EmitICal() goics.Componenter { return c } -func replaceNameIfUserDefined(name string, mapping []model.FeedCollection) string { +func replaceNameIfUserDefined(event *model.Event, mapping []model.FeedCollection) string { for _, mapEntry := range mapping { - if mapEntry.Name == name && !functions.OnlyWhitespace(mapEntry.UserDefinedName) { - return mapEntry.UserDefinedName + if mapEntry.Name == event.Name && !functions.OnlyWhitespace(mapEntry.UserDefinedName) { + return names.ReplaceTemplateSubStrings(mapEntry.UserDefinedName, *event) } } - return name + return event.Name } func generateDescription(event *model.Event) string { diff --git a/backend/service/names/userDefinedNameTemplates.go b/backend/service/names/userDefinedNameTemplates.go new file mode 100644 index 0000000..489b120 --- /dev/null +++ b/backend/service/names/userDefinedNameTemplates.go @@ -0,0 +1,23 @@ +package names + +import ( + "htwkalender/model" + "regexp" +) + +func ReplaceTemplateSubStrings(rawString string, event model.Event) string { + re := regexp.MustCompile(`\%(.)`) + + return re.ReplaceAllStringFunc(rawString, func(match string) string { + switch match { + case "%%": + return "%" + case "%t": + return event.EventType + case "%p": + return event.Compulsory + default: + return match + } + }) +} diff --git a/backend/service/names/userDefinedNameTemplates_test.go b/backend/service/names/userDefinedNameTemplates_test.go new file mode 100644 index 0000000..7570a8e --- /dev/null +++ b/backend/service/names/userDefinedNameTemplates_test.go @@ -0,0 +1,78 @@ +package names + +import ( + "htwkalender/model" + "testing" +) + +func TestReplaceTemplateSubStrings(t *testing.T) { + type args struct { + rawString string + event model.Event + } + tests := []struct { + name string + args args + want string + }{ + { + name: "Test 1", + args: args{ + rawString: "%t", + event: model.Event{ + EventType: "Test", + }, + }, + want: "Test", + }, + { + name: "Test 2", + args: args{ + rawString: "%p", + event: model.Event{ + Compulsory: "Test", + }, + }, + want: "Test", + }, + { + name: "Test 3", + args: args{ + rawString: "%%", + event: model.Event{ + EventType: "Test", + }, + }, + want: "%", + }, + { + name: "Test 4", + args: args{ + rawString: "%t %p", + event: model.Event{ + EventType: "Test", + Compulsory: "Test", + }, + }, + want: "Test Test", + }, + { + name: "Test 5", + args: args{ + rawString: "%t %p %%", + event: model.Event{ + EventType: "Test", + Compulsory: "Test", + }, + }, + want: "Test Test %", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := ReplaceTemplateSubStrings(tt.args.rawString, tt.args.event); got != tt.want { + t.Errorf("ReplaceTemplateSubStrings() = %v, want %v", got, tt.want) + } + }) + } +}