mirror of
https://gitlab.dit.htwk-leipzig.de/htwk-software/htwkalender-pwa.git
synced 2025-07-16 09:38:51 +02:00
115 lines
2.7 KiB
Go
115 lines
2.7 KiB
Go
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"
|
|
"htwkalender/model"
|
|
"htwkalender/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
|
|
}
|