From f033161e57633b8d614763b5ae9b12585ff2be4a Mon Sep 17 00:00:00 2001 From: Elmar Kresse <18119527+masterElmar@users.noreply.github.com> Date: Mon, 26 Jun 2023 15:23:14 +0200 Subject: [PATCH] add fetcher for semgrp from xml --- addRoute.go | 21 +++++- main.go | 9 --- model/seminarGroup.go | 4 ++ model/seminarGroupXMLStruct.go | 29 ++++++++ service/fetchSeminarGroupService.go | 82 ++++++++++++++++++++++ fetchService.go => service/fetchService.go | 9 +-- 6 files changed, 137 insertions(+), 17 deletions(-) create mode 100644 model/seminarGroupXMLStruct.go create mode 100644 service/fetchSeminarGroupService.go rename fetchService.go => service/fetchService.go (97%) diff --git a/addRoute.go b/addRoute.go index 5591b58..a350f5c 100644 --- a/addRoute.go +++ b/addRoute.go @@ -5,6 +5,7 @@ import ( "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/apis" "github.com/pocketbase/pocketbase/core" + "htwk-planner/service" "net/http" ) @@ -15,7 +16,25 @@ func addRoutes(app *pocketbase.PocketBase) { Method: http.MethodGet, Path: "/api/fetchPlans", Handler: func(c echo.Context) error { - return fetchHTWK(c, app) + return service.FetchHTWK(c, app) + }, + Middlewares: []echo.MiddlewareFunc{ + apis.ActivityLogger(app), + }, + }) + if err != nil { + return err + } + + return nil + }) + + app.OnBeforeServe().Add(func(e *core.ServeEvent) error { + _, err := e.Router.AddRoute(echo.Route{ + Method: http.MethodGet, + Path: "/api/fetchGroups", + Handler: func(c echo.Context) error { + return service.FetchSeminarGroups(c, app) }, Middlewares: []echo.MiddlewareFunc{ apis.ActivityLogger(app), diff --git a/main.go b/main.go index 78c8f89..1b7e299 100644 --- a/main.go +++ b/main.go @@ -1,22 +1,13 @@ package main import ( - "github.com/labstack/echo/v5" "github.com/pocketbase/pocketbase" - "github.com/pocketbase/pocketbase/core" "log" ) func main() { app := pocketbase.New() - app.OnBeforeServe().Add(func(e *core.ServeEvent) error { - e.Router.GET("/api/hello", func(c echo.Context) error { - return c.String(200, "Hello world!") - }) - return nil - }) - addRoutes(app) if err := app.Start(); err != nil { diff --git a/model/seminarGroup.go b/model/seminarGroup.go index c9f1abd..014d19e 100644 --- a/model/seminarGroup.go +++ b/model/seminarGroup.go @@ -3,6 +3,10 @@ package model type SeminarGroup struct { University string GroupShortcut string + GroupId string + Course string + Faculty string + FacultyId string Events []Events } diff --git a/model/seminarGroupXMLStruct.go b/model/seminarGroupXMLStruct.go new file mode 100644 index 0000000..e1bb502 --- /dev/null +++ b/model/seminarGroupXMLStruct.go @@ -0,0 +1,29 @@ +package model + +import ( + "encoding/xml" +) + +type Studium struct { + XMLName xml.Name `xml:"studium"` + Fakultaet []Fakultaet `xml:"fakultaet"` +} + +type Fakultaet struct { + XMLName xml.Name `xml:"fakultaet"` + Name string `xml:"name,attr"` + ID string `xml:"id,attr"` + Studiengang []Studiengang `xml:"studiengang"` +} + +type Studiengang struct { + XMLName xml.Name `xml:"studiengang"` + Name string `xml:"name,attr"` + ID string `xml:"id,attr"` + Semgrp []Semgrp `xml:"semgrp"` +} + +type Semgrp struct { + XMLName xml.Name `xml:"semgrp"` + Name string `xml:"name,attr"` +} diff --git a/service/fetchSeminarGroupService.go b/service/fetchSeminarGroupService.go new file mode 100644 index 0000000..1147b5f --- /dev/null +++ b/service/fetchSeminarGroupService.go @@ -0,0 +1,82 @@ +package service + +import ( + "encoding/xml" + "fmt" + "htwk-planner/model" + "io" + "net/http" + + "github.com/labstack/echo/v5" + "github.com/pocketbase/pocketbase" +) + +func getSeminarHTML() (string, error) { + url := "https://stundenplan.htwk-leipzig.de/stundenplan/xml/public/semgrp_ss.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 FetchSeminarGroups(c echo.Context, app *pocketbase.PocketBase) error { + + result, _ := getSeminarHTML() + + println(result) + + var studium []model.SeminarGroup + + studium = parseSeminarGroups(result) + + return c.JSON(http.StatusOK, studium) +} + +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 +} diff --git a/fetchService.go b/service/fetchService.go similarity index 97% rename from fetchService.go rename to service/fetchService.go index 18d652c..f43e513 100644 --- a/fetchService.go +++ b/service/fetchService.go @@ -1,4 +1,4 @@ -package main +package service import ( "fmt" @@ -13,7 +13,7 @@ import ( "strings" ) -func fetchHTWK(c echo.Context, app *pocketbase.PocketBase) error { +func FetchHTWK(c echo.Context, app *pocketbase.PocketBase) error { var seminarGroups []model.SeminarGroup @@ -109,11 +109,6 @@ func toEvents(tables [][]*html.Node, days []string) []model.Events { Notes: getTextContent(tableData[7]), BookedAt: getTextContent(tableData[8]), }) - // Print the content of each element - //for _, td := range tableData { - // content := getTextContent(td) - // println(content) - //} } }