diff --git a/services/data-manager/service/db/dbEvents.go b/services/data-manager/service/db/dbEvents.go index 4d43826..b34a2ac 100644 --- a/services/data-manager/service/db/dbEvents.go +++ b/services/data-manager/service/db/dbEvents.go @@ -22,6 +22,7 @@ import ( "github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/tools/types" "htwkalender/data-manager/model" + "htwkalender/data-manager/service/functions" "log/slog" "time" @@ -194,7 +195,12 @@ func NewEvent(collection *core.Collection, event model.Event) (*Event, error) { ev.SetBookedAt(event.BookedAt) ev.SetCourse(event.Course) ev.SetSemester(event.Semester) - ev.SetUUID(uuid.NewString()) + ev.SetCompulsory(event.Compulsory) + + if event.UUID == "" { + event.UUID = functions.GenerateUUID(event) + } + ev.SetUUID(event.UUID) return ev, nil } diff --git a/services/data-manager/service/events/eventService.go b/services/data-manager/service/events/eventService.go index 12d4338..025d0ea 100644 --- a/services/data-manager/service/events/eventService.go +++ b/services/data-manager/service/events/eventService.go @@ -20,7 +20,7 @@ import ( "github.com/pocketbase/pocketbase" "htwkalender/data-manager/model" "htwkalender/data-manager/service/db" - "htwkalender/data-manager/service/fetch/v1" + v1 "htwkalender/data-manager/service/fetch/v1" "htwkalender/data-manager/service/functions" "log/slog" "strconv" diff --git a/services/data-manager/service/fetch/v1/fetchSeminarEventService.go b/services/data-manager/service/fetch/v1/fetchSeminarEventService.go index 7634ada..e21d31a 100644 --- a/services/data-manager/service/fetch/v1/fetchSeminarEventService.go +++ b/services/data-manager/service/fetch/v1/fetchSeminarEventService.go @@ -18,7 +18,6 @@ package v1 import ( "fmt" - "github.com/google/uuid" "github.com/pocketbase/pocketbase/tools/types" "golang.org/x/net/html" "htwkalender/data-manager/model" @@ -122,7 +121,8 @@ func parseSeminarGroup(result string) model.SeminarGroup { splitEventsByWeekVal := splitEventsByWeek(eventsWithCombinedWeeks) events := splitEventsBySingleWeek(splitEventsByWeekVal) events = convertWeeksToDates(events, semester, year) - events = generateUUIDs(events, course) + events = addCourseToEvents(events, course) + events = functions.GenerateUUIDs(events) events, err = SplitEventType(events) if err != nil { @@ -139,11 +139,9 @@ func parseSeminarGroup(result string) model.SeminarGroup { return seminarGroup } -func generateUUIDs(events []model.Event, course string) []model.Event { - for i, event := range events { - // generate a hash value from the event name, course and semester - hash := uuid.NewSHA1(uuid.NameSpaceOID, []byte(event.Name+course)) - events[i].UUID = hash.String() +func addCourseToEvents(events model.Events, course string) model.Events { + for index := range events { + events[index].Course = course } return events } diff --git a/services/data-manager/service/fetch/v1/fetchSeminarEventService_test.go b/services/data-manager/service/fetch/v1/fetchSeminarEventService_test.go index 85ba1ac..42dc969 100644 --- a/services/data-manager/service/fetch/v1/fetchSeminarEventService_test.go +++ b/services/data-manager/service/fetch/v1/fetchSeminarEventService_test.go @@ -222,60 +222,6 @@ func TestSplitEventType(t *testing.T) { } } -func TestGenerateUUIDs(t *testing.T) { - type args struct { - events []model.Event - course string - } - tests := []struct { - name string - args args - want []model.Event - }{ - { - name: "Test 1", - args: args{ - events: []model.Event{ - { - Name: " Arbeitssicherheit / Rechtsformen von Unternehmen B435 SBB (wpf) & B348 BIB (pf) 5. FS", - }, - }, - course: "21BIB-2a", - }, - want: []model.Event{ - { - Name: " Arbeitssicherheit / Rechtsformen von Unternehmen B435 SBB (wpf) & B348 BIB (pf) 5. FS", - UUID: "3720afdc-10c7-5b72-9489-cffb70cb0c13", - }, - }, - }, - { - name: "Test 2", - args: args{ - events: []model.Event{ - { - Name: " Arbeitssicherheit / Rechtsformen von Unternehmen B435 SBB (wpf) & B348 BIB (pf) 5. FS", - }, - }, - course: "21BIB-2b", - }, - want: []model.Event{ - { - Name: " Arbeitssicherheit / Rechtsformen von Unternehmen B435 SBB (wpf) & B348 BIB (pf) 5. FS", - UUID: "81083480-bcf1-5452-af84-bb27d79282d8", - }, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := generateUUIDs(tt.args.events, tt.args.course); !reflect.DeepEqual(got, tt.want) { - t.Errorf("generateUUIDs() = %v, want %v", got, tt.want) - } - }) - } -} - func TestCreateTimeFromHourAndMinuteString(t *testing.T) { type args struct { tableTime string @@ -859,3 +805,129 @@ func sortEventsByStartDate(events []model.Event) { return events[i].Start.Time().Before(events[j].Start.Time()) }) } + +func Test_addCourseToEvents(t *testing.T) { + type args struct { + events model.Events + course string + } + tests := []struct { + name string + args args + want model.Events + }{ + { + name: "Test 1", + args: args{ + events: model.Events{ + { + UUID: "6ebe83db-f29e-5ddd-ae8f-8724b5ba8959", + Day: "Donnerstag", + Week: "44", + Start: parseDateTime("2024-10-31 06:00:00.000Z"), + End: parseDateTime("2024-10-31 23:00:00.000Z"), + Name: "Feiertage und lehrveranstaltungsfreie Tage", + Notes: "Reformationstag", + Prof: " ", + Rooms: " ", + BookedAt: "30/07/2024", + Course: "", + EventType: "Sperr", + Compulsory: "", + Semester: "ws", + }, + { + UUID: "6ebe83db-f29e-5ddd-ae8f-8724b5ba8959", + Day: "Freitag", + Week: "44", + Start: parseDateTime("2024-11-01 06:00:00.000Z"), + End: parseDateTime("2024-11-01 23:00:00.000Z"), + Name: "Feiertage und lehrveranstaltungsfreie Tage", + Notes: "Brückentag Reformationstag", + Prof: " ", + Rooms: " ", + BookedAt: "30/07/2024", + Course: "", + EventType: "Sperr", + Compulsory: "", + Semester: "ws", + }, + { + UUID: "15e6d285-5ecd-5039-b4b2-d6fcc3dbc1a7", + Day: "Dienstag", + Week: "42", + Start: parseDateTime("2024-10-15 09:15:00.000Z"), + End: parseDateTime("2024-10-15 10:45:00.000Z"), + Name: "3.2 Leitungskompetenzen II SA-M 3. FS (pf)", + Notes: "Leitungshandeln", + Prof: "Prof. Dr. phil. Grit Behse-Bartels", + Rooms: "LI119-S", + BookedAt: "13/06/2024", + Course: "", + EventType: "S", + Compulsory: "p", + Semester: "ws", + }, + }, + course: "23SAM", + }, + want: []model.Event{ + { + UUID: "6ebe83db-f29e-5ddd-ae8f-8724b5ba8959", + Day: "Donnerstag", + Week: "44", + Start: parseDateTime("2024-10-31 06:00:00.000Z"), + End: parseDateTime("2024-10-31 23:00:00.000Z"), + Name: "Feiertage und lehrveranstaltungsfreie Tage", + Notes: "Reformationstag", + Prof: " ", + Rooms: " ", + BookedAt: "30/07/2024", + Course: "23SAM", + EventType: "Sperr", + Compulsory: "", + Semester: "ws", + }, + { + UUID: "6ebe83db-f29e-5ddd-ae8f-8724b5ba8959", + Day: "Freitag", + Week: "44", + Start: parseDateTime("2024-11-01 06:00:00.000Z"), + End: parseDateTime("2024-11-01 23:00:00.000Z"), + Name: "Feiertage und lehrveranstaltungsfreie Tage", + Notes: "Brückentag Reformationstag", + Prof: " ", + Rooms: " ", + BookedAt: "30/07/2024", + Course: "23SAM", + EventType: "Sperr", + Compulsory: "", + Semester: "ws", + }, + { + UUID: "15e6d285-5ecd-5039-b4b2-d6fcc3dbc1a7", + Day: "Dienstag", + Week: "42", + Start: parseDateTime("2024-10-15 09:15:00.000Z"), + End: parseDateTime("2024-10-15 10:45:00.000Z"), + Name: "3.2 Leitungskompetenzen II SA-M 3. FS (pf)", + Notes: "Leitungshandeln", + Prof: "Prof. Dr. phil. Grit Behse-Bartels", + Rooms: "LI119-S", + BookedAt: "13/06/2024", + Course: "23SAM", + EventType: "S", + Compulsory: "p", + Semester: "ws", + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := addCourseToEvents(tt.args.events, tt.args.course); !reflect.DeepEqual(got, tt.want) { + t.Errorf("addCourseToEvents() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/services/data-manager/service/fetch/v2/fetcher.go b/services/data-manager/service/fetch/v2/fetcher.go index 877d963..b616d71 100644 --- a/services/data-manager/service/fetch/v2/fetcher.go +++ b/services/data-manager/service/fetch/v2/fetcher.go @@ -18,7 +18,6 @@ package v2 import ( "fmt" - "github.com/google/uuid" "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/core" "golang.org/x/net/html" @@ -169,7 +168,7 @@ func parseEventForOneSemester(url string) ([]model.Event, error) { return nil, err } events = switchNameAndNotesForExam(events) - events = generateUUIDs(events) + events = functions.GenerateUUIDs(events) return events, nil } @@ -194,14 +193,3 @@ func parseHTML(webpage string) (*html.Node, error) { } return doc, nil } - -// generateUUIDs generates a UUID for each event based on the event name, course and semester -// the UUID is used to identify the event in the database -func generateUUIDs(events []model.Event) []model.Event { - for i, event := range events { - // generate a hash value from the event name, course and semester - hash := uuid.NewSHA1(uuid.NameSpaceOID, []byte(event.Name+event.Course)) - events[i].UUID = hash.String() - } - return events -} diff --git a/services/data-manager/service/functions/event.go b/services/data-manager/service/functions/event.go new file mode 100644 index 0000000..a28f143 --- /dev/null +++ b/services/data-manager/service/functions/event.go @@ -0,0 +1,22 @@ +package functions + +import ( + "github.com/google/uuid" + "htwkalender/data-manager/model" +) + +// generateUUIDs generates a UUID for each event based on the event name, course and semester +// the UUID is used to identify the event in the database +func GenerateUUIDs(events []model.Event) []model.Event { + for i, event := range events { + // generate a hash value from the event name, course and semester + hash := GenerateUUID(event) + events[i].UUID = hash + } + return events +} + +func GenerateUUID(event model.Event) string { + hash := uuid.NewSHA1(uuid.NameSpaceOID, []byte(event.Name+event.Course)).String() + return hash +} diff --git a/services/data-manager/service/functions/event_test.go b/services/data-manager/service/functions/event_test.go new file mode 100644 index 0000000..5ec11f6 --- /dev/null +++ b/services/data-manager/service/functions/event_test.go @@ -0,0 +1,83 @@ +package functions + +import ( + "htwkalender/data-manager/model" + "reflect" + "testing" +) + +func Test_generateUUIDs(t *testing.T) { + type args struct { + events []model.Event + } + tests := []struct { + name string + args args + want []model.Event + }{ + { + name: "generate UUIDs for events", + args: args{ + events: []model.Event{ + { + EventType: "Vorlesung", + Name: "Computer Vision II", + Course: "Computer Vision", + UUID: "", + }, + { + EventType: "Pruefung", + Name: "C169 Digitale Bildverarbeitung MIM & INM 3. FS (wpf)", + Course: "23INM", + UUID: "", + }, + { + EventType: "Vorlesung", + Name: "C398 Visualisierung in NW und Technik IN-M & MI-M 2. FS (wpf)", + Course: "24INM", + UUID: "", + }, + { + EventType: "Vorlesung", + Name: "M947 Fluidenergiemaschinen EGB (pf) & MBB & SGB (wpf) 4.FS", + Course: "23EGB-EGTa", + UUID: "", + }, + }, + }, + want: []model.Event{ + { + EventType: "Vorlesung", + Name: "Computer Vision II", + Course: "Computer Vision", + UUID: "8ddd913c-27f0-58b2-be17-e50f2851d482", + }, + { + EventType: "Pruefung", + Name: "C169 Digitale Bildverarbeitung MIM & INM 3. FS (wpf)", + Course: "23INM", + UUID: "2a35348d-63ce-511c-8580-893321d104b9", + }, + { + EventType: "Vorlesung", + Name: "C398 Visualisierung in NW und Technik IN-M & MI-M 2. FS (wpf)", + Course: "24INM", + UUID: "6051ebd9-dd2b-5646-82c4-091667f414ee", + }, + { + EventType: "Vorlesung", + Name: "M947 Fluidenergiemaschinen EGB (pf) & MBB & SGB (wpf) 4.FS", + Course: "23EGB-EGTa", + UUID: "736764e1-fa78-5195-8280-76c996dc8b47", + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := GenerateUUIDs(tt.args.events); !reflect.DeepEqual(got, tt.want) { + t.Errorf("generateUUIDs() = %v, want %v", got, tt.want) + } + }) + } +}