feat:#16 added uuid and fixed some pointer logic

This commit is contained in:
Elmar Kresse
2023-10-23 03:09:16 +02:00
parent f8a24aca1b
commit e20dde27fb
4 changed files with 97 additions and 19 deletions

View File

@@ -6,51 +6,59 @@ import (
"htwkalender/model"
)
func SaveEvents(seminarGroup []model.SeminarGroup, app *pocketbase.PocketBase) (model.Events, error) {
var toBeSavedEvents []struct {
model.Event
string
}
var savedRecords model.Events
func SaveEvents(seminarGroup []model.SeminarGroup, app *pocketbase.PocketBase) ([]model.Event, error) {
var toBeSavedEvents []model.Event
var savedRecords []model.Event
// check if event is already in database and add to toBeSavedEvents if not
for _, seminarGroup := range seminarGroup {
for _, event := range seminarGroup.Events {
event = event.SetCourse(seminarGroup.Course)
dbGroup, err := findEventByDayWeekStartEndNameCourse(event, seminarGroup.Course, app)
if dbGroup == nil && err.Error() == "sql: no rows in result set" {
toBeSavedEvents = append(toBeSavedEvents, struct {
model.Event
string
}{event, seminarGroup.Course})
} else if err != nil {
return nil, err
if dbGroup.UUID != "" && err.Error() == "sql: no rows in result set" && !containsEvent(toBeSavedEvents, event) {
toBeSavedEvents = append(toBeSavedEvents, event)
}
}
}
// create record for each event that's not already in the database
for _, event := range toBeSavedEvents {
event.MarkAsNew()
// auto mapping for event fields to record fields
err := app.Dao().Save(&event)
if err != nil {
return nil, err
} else {
savedRecords = append(savedRecords, &event.Event)
savedRecords = append(savedRecords, event)
}
}
return savedRecords, nil
}
func containsEvent(events []model.Event, event model.Event) bool {
for _, e := range events {
if e.Day == event.Day &&
e.Week == event.Week &&
e.Start == event.Start &&
e.End == event.End &&
e.Name == event.Name &&
e.Course == event.Course &&
e.Prof == event.Prof &&
e.Rooms == event.Rooms &&
e.EventType == event.EventType {
return true
}
}
return false
}
func findEventByDayWeekStartEndNameCourse(event model.Event, course string, app *pocketbase.PocketBase) (*model.Event, error) {
err := app.Dao().DB().Select("*").From("events").Where(
dbx.NewExp("Day = {:day} AND Week = {:week} AND Start = {:start} AND End = {:end} AND Name = {:name} AND course = {:course} AND Prof = {:prof} AND Rooms = {:rooms} AND EventType = {:eventType}",
dbx.Params{"day": event.Day, "week": event.Week, "start": event.Start, "end": event.End, "name": event.Name, "course": course, "prof": event.Prof, "rooms": event.Rooms, "eventType": event.EventType}),
).One(&event)
if err != nil {
return nil, err
}
return &event, err
}

View File

@@ -2,6 +2,7 @@ package fetch
import (
"fmt"
"github.com/google/uuid"
"github.com/labstack/echo/v5"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/apis"
@@ -97,6 +98,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 = generateUUIDs(events)
var seminarGroup = model.SeminarGroup{
University: findFirstSpanWithClass(table, "header-1-0-0").FirstChild.Data,
Course: findFirstSpanWithClass(table, "header-2-0-1").FirstChild.Data,
@@ -105,6 +107,16 @@ func parseSeminarGroup(result string) model.SeminarGroup {
return seminarGroup
}
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+event.Semester))
events[i].UUID = hash.String()
}
return events
}
func convertWeeksToDates(events []model.Event, semester string, year string) []model.Event {
var newEvents []model.Event
eventYear, _ := strconv.Atoi(year)