mirror of
https://gitlab.dit.htwk-leipzig.de/htwk-software/htwkalender-pwa.git
synced 2025-08-02 17:59:16 +02:00
feat:#150 added slog for more functions and improved return signature
This commit is contained in:
@@ -49,7 +49,11 @@ func AddRoutes(app *pocketbase.PocketBase) {
|
|||||||
Method: http.MethodGet,
|
Method: http.MethodGet,
|
||||||
Path: "/api/fetch/groups",
|
Path: "/api/fetch/groups",
|
||||||
Handler: func(c echo.Context) error {
|
Handler: func(c echo.Context) error {
|
||||||
return v1.SeminarGroups(c, app)
|
groups, err := v1.FetchSeminarGroups(app)
|
||||||
|
if err != nil {
|
||||||
|
return c.JSON(http.StatusInternalServerError, "Failed to fetch seminar groups")
|
||||||
|
}
|
||||||
|
return c.JSON(http.StatusOK, groups)
|
||||||
},
|
},
|
||||||
Middlewares: []echo.MiddlewareFunc{
|
Middlewares: []echo.MiddlewareFunc{
|
||||||
apis.ActivityLogger(app),
|
apis.ActivityLogger(app),
|
||||||
|
@@ -8,6 +8,8 @@ import (
|
|||||||
"htwkalender/model"
|
"htwkalender/model"
|
||||||
"htwkalender/service/db"
|
"htwkalender/service/db"
|
||||||
"htwkalender/service/functions"
|
"htwkalender/service/functions"
|
||||||
|
"io"
|
||||||
|
"log/slog"
|
||||||
"net/http"
|
"net/http"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -21,9 +23,14 @@ import (
|
|||||||
// FetchAndUpdateSportEvents fetches all sport events from the HTWK sport website
|
// FetchAndUpdateSportEvents fetches all sport events from the HTWK sport website
|
||||||
// it deletes them first and then saves them to the database
|
// it deletes them first and then saves them to the database
|
||||||
// It returns all saved events
|
// It returns all saved events
|
||||||
func FetchAndUpdateSportEvents(app *pocketbase.PocketBase) []model.Event {
|
func FetchAndUpdateSportEvents(app *pocketbase.PocketBase) ([]model.Event, error) {
|
||||||
|
|
||||||
|
sportCourseLinks, err := fetchAllAvailableSportCourses()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
var sportCourseLinks = fetchAllAvailableSportCourses()
|
|
||||||
sportEntries := fetchHTWKSportCourses(sportCourseLinks)
|
sportEntries := fetchHTWKSportCourses(sportCourseLinks)
|
||||||
events := formatEntriesToEvents(sportEntries)
|
events := formatEntriesToEvents(sportEntries)
|
||||||
|
|
||||||
@@ -43,7 +50,7 @@ func FetchAndUpdateSportEvents(app *pocketbase.PocketBase) []model.Event {
|
|||||||
// get all events from database where name = Feiertage und lehrveranstaltungsfreie Tage
|
// get all events from database where name = Feiertage und lehrveranstaltungsfreie Tage
|
||||||
holidays, err := db.GetAllModulesByNameAndDateRange(app, "Feiertage und lehrveranstaltungsfreie Tage", earliestDate, latestDate)
|
holidays, err := db.GetAllModulesByNameAndDateRange(app, "Feiertage und lehrveranstaltungsfreie Tage", earliestDate, latestDate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove all events that have same year, month and day as items in holidays
|
// remove all events that have same year, month and day as items in holidays
|
||||||
@@ -60,17 +67,17 @@ func FetchAndUpdateSportEvents(app *pocketbase.PocketBase) []model.Event {
|
|||||||
// @TODO: delete and save events in one transaction and it only should delete events that are not in the new events list and save events that are not in the database
|
// @TODO: delete and save events in one transaction and it only should delete events that are not in the new events list and save events that are not in the database
|
||||||
err = db.DeleteAllEventsForCourse(app, "Sport", functions.GetCurrentSemesterString())
|
err = db.DeleteAllEventsForCourse(app, "Sport", functions.GetCurrentSemesterString())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// save events to database
|
// save events to database
|
||||||
savedEvents, err := db.SaveEvents(events, app)
|
savedEvents, err := db.SaveEvents(events, app)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return savedEvents
|
return savedEvents, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,13 +312,14 @@ func checkSemester(date time.Time) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// fetch the main page where all sport courses are listed and extract all links to the sport courses
|
// fetch the main page where all sport courses are listed and extract all links to the sport courses
|
||||||
func fetchAllAvailableSportCourses() []string {
|
func fetchAllAvailableSportCourses() ([]string, error) {
|
||||||
var url = "https://sport.htwk-leipzig.de/sportangebote"
|
var url = "https://sport.htwk-leipzig.de/sportangebote"
|
||||||
|
|
||||||
var doc, err = htmlRequest(url)
|
var doc, err = htmlRequest(url)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
slog.Error("Error while fetching sport courses from webpage", err)
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// link list of all sport courses
|
// link list of all sport courses
|
||||||
@@ -325,7 +333,7 @@ func fetchAllAvailableSportCourses() []string {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return links
|
return links, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// fetchAllHTWKSportCourses fetches all sport courses from the given links.
|
// fetchAllHTWKSportCourses fetches all sport courses from the given links.
|
||||||
@@ -372,7 +380,13 @@ func htmlRequest(url string) (*goquery.Document, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func(Body io.ReadCloser) {
|
||||||
|
readErr := Body.Close()
|
||||||
|
if readErr != nil {
|
||||||
|
slog.Error("Error while closing response body from html request", readErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}(resp.Body)
|
||||||
|
|
||||||
doc, err := goquery.NewDocumentFromReader(resp.Body)
|
doc, err := goquery.NewDocumentFromReader(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -3,13 +3,12 @@ package v1
|
|||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/labstack/echo/v5"
|
|
||||||
"github.com/pocketbase/pocketbase"
|
"github.com/pocketbase/pocketbase"
|
||||||
"github.com/pocketbase/pocketbase/apis"
|
|
||||||
"github.com/pocketbase/pocketbase/models"
|
"github.com/pocketbase/pocketbase/models"
|
||||||
"htwkalender/model"
|
"htwkalender/model"
|
||||||
"htwkalender/service/db"
|
"htwkalender/service/db"
|
||||||
"io"
|
"io"
|
||||||
|
"log/slog"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -41,12 +40,23 @@ func getSeminarHTML(semester string) (string, error) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func SeminarGroups(c echo.Context, app *pocketbase.PocketBase) error {
|
func FetchSeminarGroups(app *pocketbase.PocketBase) ([]*models.Record, error) {
|
||||||
var groups []model.SeminarGroup
|
var groups []model.SeminarGroup
|
||||||
|
|
||||||
resultSummer, _ := getSeminarHTML("ss")
|
resultSummer, err := getSeminarHTML("ss")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("Error while fetching seminar groups for winter semester", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
resultWinter, _ := getSeminarHTML("ws")
|
resultWinter, _ := getSeminarHTML("ws")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("Error while fetching seminar groups for summer semester", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
groups = parseSeminarGroups(resultSummer)
|
groups = parseSeminarGroups(resultSummer)
|
||||||
groups = append(groups, parseSeminarGroups(resultWinter)...)
|
groups = append(groups, parseSeminarGroups(resultWinter)...)
|
||||||
|
|
||||||
@@ -55,16 +65,18 @@ func SeminarGroups(c echo.Context, app *pocketbase.PocketBase) error {
|
|||||||
|
|
||||||
collection, dbError := db.FindCollection(app, "groups")
|
collection, dbError := db.FindCollection(app, "groups")
|
||||||
if dbError != nil {
|
if dbError != nil {
|
||||||
return apis.NewNotFoundError("Collection not found", dbError)
|
slog.Error("Error while searching collection groups", dbError)
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
var insertedGroups []*models.Record
|
var insertedGroups []*models.Record
|
||||||
|
|
||||||
insertedGroups, dbError = db.SaveGroups(groups, collection, app)
|
insertedGroups, dbError = db.SaveGroups(groups, collection, app)
|
||||||
if dbError != nil {
|
if dbError != nil {
|
||||||
return apis.NewNotFoundError("Records could not be saved", dbError)
|
slog.Error("Error while saving groups", dbError)
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.JSON(http.StatusOK, insertedGroups)
|
return insertedGroups, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func removeDuplicates(groups []model.SeminarGroup) []model.SeminarGroup {
|
func removeDuplicates(groups []model.SeminarGroup) []model.SeminarGroup {
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
package logger
|
|
Reference in New Issue
Block a user