diff --git a/backend/model/sportFetcherModel.go b/backend/model/sportFetcherModel.go index 600f6ba..6b9da82 100644 --- a/backend/model/sportFetcherModel.go +++ b/backend/model/sportFetcherModel.go @@ -9,6 +9,7 @@ type SportEntry struct { Title string Details EventDetails AdditionalNote string + ID string } // EventDetails represents detailed information about the event. diff --git a/backend/service/fetch/sport/sportFetcher.go b/backend/service/fetch/sport/sportFetcher.go index b70bbb0..47ba277 100644 --- a/backend/service/fetch/sport/sportFetcher.go +++ b/backend/service/fetch/sport/sportFetcher.go @@ -76,7 +76,7 @@ func formatEntriesToEvents(entries []model.SportEntry) []model.Event { var events []model.Event - for i, entry := range entries { + for _, entry := range entries { eventStarts, eventEnds := getWeekEvents(entry.Details.DateRange.Start, entry.Details.DateRange.End, entry.Details.Cycle) for j := range eventStarts { @@ -84,12 +84,12 @@ func formatEntriesToEvents(entries []model.SportEntry) []model.Event { end, _ := types.ParseDateTime(eventEnds[j].In(time.UTC)) var event = model.Event{ - UUID: uuid.NewSHA1(uuid.NameSpaceDNS, []byte(entry.Title+strconv.FormatInt(int64(i), 10)+entry.Details.Type)).String(), + UUID: uuid.NewSHA1(uuid.NameSpaceDNS, []byte(entry.Title+entry.ID+entry.Details.Type)).String(), Day: toGermanWeekdayString(entry.Details.DateRange.Start.Weekday()), Week: strconv.Itoa(23), Start: start, End: end, - Name: entry.Title + " " + entry.Details.Type, + Name: entry.Title + " " + entry.Details.Type + " (" + entry.ID + ")", EventType: entry.Details.Type, Prof: entry.Details.CourseLead.Name, Rooms: entry.Details.Location.Name, @@ -387,6 +387,7 @@ func htmlRequest(url string) (*goquery.Document, error) { // May be improved in the future. func fetchHtwkSportCourse(doc *goquery.Document) ([]model.SportEntry, error) { var events []model.SportEntry + germanTime, _ := time.LoadLocation("Europe/Berlin") if doc.Find("h1").Text() == "Aktuelle Sportangebote" { return nil, errors.New("not a sport course page") @@ -406,6 +407,8 @@ func fetchHtwkSportCourse(doc *goquery.Document) ([]model.SportEntry, error) { details.Type = strings.TrimSpace(titleParts[len(titleParts)-1]) } + event.ID = parseEventID(fullTitle) + s.NextFiltered("table.eventDetails").Find("tr").Each(func(i int, s *goquery.Selection) { key := strings.TrimSpace(s.Find("td").First().Text()) value := strings.TrimSpace(s.Find("td").Last().Text()) @@ -414,8 +417,8 @@ func fetchHtwkSportCourse(doc *goquery.Document) ([]model.SportEntry, error) { case "Zeitraum": dates := strings.Split(value, "-") if len(dates) == 2 { - startDate, _ := time.Parse("02.01.2006", strings.TrimSpace(dates[0])) - endDate, _ := time.Parse("02.01.2006", strings.TrimSpace(dates[1])) + startDate, _ := time.ParseInLocation("02.01.2006", strings.TrimSpace(dates[0]), germanTime) + endDate, _ := time.ParseInLocation("02.01.2006", strings.TrimSpace(dates[1]), germanTime) details.DateRange = model.DateRange{Start: startDate, End: endDate} } case "Zyklus": @@ -471,3 +474,22 @@ func fetchHtwkSportCourse(doc *goquery.Document) ([]model.SportEntry, error) { return events, nil } + +// parseEventID from fulltitle +// the event id is a number in the fulltitle thats not a time like HH:MM and shoudl be found after Nr. or Nr: +func parseEventID(fulltitle string) string { + var eventID string + var numberRegExp = regexp.MustCompile("[0-9]{1,4}") + var fulltitleParts = strings.Split(fulltitle, " ") + for i, part := range fulltitleParts { + if part == "Nr." || part == "Nr:" { + eventID = fulltitleParts[i+1] + break + } + } + if eventID == "" { + eventID = numberRegExp.FindString(fulltitle) + } + return eventID + +}