package fetch import ( "encoding/xml" "fmt" "github.com/labstack/echo/v5" "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/apis" "github.com/pocketbase/pocketbase/models" "htwk-planner/model" "htwk-planner/service/db" "io" "net/http" ) func getSeminarHTML(semester string) (string, error) { url := "https://stundenplan.htwk-leipzig.de/stundenplan/xml/public/semgrp_" + semester + ".xml" // Send GET request response, err := http.Get(url) if err != nil { fmt.Printf("Error occurred while making the request: %s\n", err.Error()) return "", err } defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { return } }(response.Body) // Read the response body body, err := io.ReadAll(response.Body) if err != nil { fmt.Printf("Error occurred while reading the response: %s\n", err.Error()) return "", err } return string(body), err } func SeminarGroups(c echo.Context, app *pocketbase.PocketBase) error { var groups []model.SeminarGroup resultSummer, _ := getSeminarHTML("ss") resultWinter, _ := getSeminarHTML("ws") groups = parseSeminarGroups(resultSummer) groups = append(groups, parseSeminarGroups(resultWinter)...) // filter duplicates groups = removeDuplicates(groups) collection, dbError := db.FindCollection(app, "groups") if dbError != nil { return apis.NewNotFoundError("Collection not found", dbError) } var insertedGroups []*models.Record insertedGroups, dbError = db.SaveGroups(groups, collection, app) if dbError != nil { return apis.NewNotFoundError("Records could not be saved", dbError) } return c.JSON(http.StatusOK, insertedGroups) } func removeDuplicates(groups []model.SeminarGroup) []model.SeminarGroup { var uniqueGroups []model.SeminarGroup for _, group := range groups { if !contains(uniqueGroups, group) { uniqueGroups = append(uniqueGroups, group) } } return uniqueGroups } func contains(groups []model.SeminarGroup, group model.SeminarGroup) bool { for _, a := range groups { if a.Course == group.Course { return true } } return false } func parseSeminarGroups(result string) []model.SeminarGroup { var studium model.Studium err := xml.Unmarshal([]byte(result), &studium) if err != nil { return nil } var seminarGroups []model.SeminarGroup for _, Fakultaet := range studium.Fakultaet { for _, Studiengang := range Fakultaet.Studiengang { for _, Studienrichtung := range Studiengang.Semgrp { seminarGroup := model.SeminarGroup{ University: "HTWK-Leipzig", GroupShortcut: Studiengang.Name, GroupId: Studiengang.ID, Course: Studienrichtung.Name, Faculty: Fakultaet.Name, FacultyId: Fakultaet.ID, } seminarGroups = append(seminarGroups, seminarGroup) } } } return seminarGroups }