Files
htwkalender/backend/service/fetch/v3/fetchLunaApi.go
2024-03-24 01:08:41 +01:00

198 lines
5.4 KiB
Go

package v3
import (
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/tools/types"
"golang.org/x/net/http2"
"htwkalender/model"
"log/slog"
"net/http"
"strconv"
)
func FetchAllResources(app *pocketbase.PocketBase) (*[]model.Event, error) {
client := &http.Client{}
client.Transport = &http2.Transport{}
apiUrl := "https://luna.htwk-leipzig.de/api/"
seminarUrl := apiUrl + "studierendengruppen"
parsedSeminarGroups, err := parseSeminarGroups(seminarUrl, client)
if err != nil {
slog.Error("Error while fetching seminar groups", err)
return nil, err
}
slog.Info("Fetched seminar groups: " + strconv.Itoa(len(parsedSeminarGroups.Groups)) + " of " + strconv.Itoa(parsedSeminarGroups.TotalItems))
studyTypeUrl := apiUrl + "studiengaenge"
parsedStudyTypes, err := parseStudyTypes(studyTypeUrl, client)
if err != nil {
slog.Error("Error while fetching study types", err)
return nil, err
}
slog.Info("Fetched study types: " + strconv.Itoa(len(parsedStudyTypes)))
facultyUrl := apiUrl + "fakultaeten"
parsedFaculties, err := parseFaculties(facultyUrl, client)
if err != nil {
slog.Error("Error while fetching faculties", err)
return nil, err
}
slog.Info("Fetched faculties: " + strconv.Itoa(len(parsedFaculties.Faculties)))
moduleUrl := apiUrl + "module"
parsedModules, err := parseModules(moduleUrl, client)
if err != nil {
slog.Error("Error while fetching modules", err)
return nil, err
}
slog.Info("Fetched modules: " + strconv.Itoa(len(parsedModules.Modules)))
roomUrl := apiUrl + "raeume"
parsedRooms, err := parseRooms(roomUrl, client)
if err != nil {
slog.Error("Error while fetching rooms", err)
return nil, err
}
slog.Info("Fetched rooms: " + strconv.Itoa(len(parsedRooms.Rooms)))
profUrl := apiUrl + "dozierende"
parsedProfs, err := parseProfs(profUrl, client)
if err != nil {
slog.Error("Error while fetching profs", err)
return nil, err
}
slog.Info("Fetched profs: " + strconv.Itoa(len(parsedProfs.Professors)))
// map seminar groups to model seminar groups
for _, group := range parsedSeminarGroups.Groups {
var newGroup model.SeminarGroup
newGroup.University = "HTWK Leipzig"
newGroup.Course = group.SeminarGroup
newGroup.Faculty = group.Faculty
newGroup.Semester = group.Semester
// find corresponding study type by studiengang in parsedStudyTypes
for _, studyTypeItem := range parsedStudyTypes {
if studyTypeItem.ID == group.Studiengang {
newGroup.GroupShortcut = studyTypeItem.Description
newGroup.GroupId = studyTypeItem.GroupID
break
}
}
for _, facultyItem := range parsedFaculties.Faculties {
if facultyItem.ID == group.Faculty {
newGroup.FacultyId = facultyItem.ShortCut
newGroup.Faculty = facultyItem.Description
break
}
}
}
//Now fetch all events
eventUrl := apiUrl + "veranstaltungen"
parsedEvents, err := parseEvents(eventUrl, client)
slog.Info("Fetched events: " + strconv.Itoa(len(parsedEvents.Events)) + " of " + strconv.Itoa(parsedEvents.TotalItems))
if err != nil {
slog.Error("Error while fetching events", err)
return nil, err
}
//resolve course id in parsedEvents to course name
for i, event := range parsedEvents.Events {
for j, course := range event.Courses {
for _, group := range parsedStudyTypes {
if group.ID == course {
parsedEvents.Events[i].Courses[j] = group.GroupID
}
}
}
for _, group := range parsedSeminarGroups.Groups {
for courseItemId, seminarGroupItem := range event.SeminarGroups {
if group.ID == seminarGroupItem {
parsedEvents.Events[i].SeminarGroups[courseItemId] = group.SeminarGroup
}
}
}
for _, facultyItem := range parsedFaculties.Faculties {
if facultyItem.ID == event.Faculty {
parsedEvents.Events[i].Faculty = facultyItem.ShortCut
}
}
for _, module := range parsedModules.Modules {
if module.ID == event.Module {
parsedEvents.Events[i].Module = module.Name
}
}
for _, room := range parsedRooms.Rooms {
for roomPlace, roomID := range event.Rooms {
if room.ID == roomID {
parsedEvents.Events[i].Rooms[roomPlace] = room.ShortCut
}
}
}
for _, prof := range parsedProfs.Professors {
for profPlace, profID := range event.Professors {
if prof.ID == profID {
parsedEvents.Events[i].Professors[profPlace] = prof.Description1
}
}
}
}
// map events to model events
var events []model.Event
for _, event := range parsedEvents.Events {
for _, week := range event.CalendarWeeks {
for _, course := range event.Courses {
var newEvent model.Event
newEvent.UUID = ""
newEvent.Day = event.Day
newEvent.Week = strconv.Itoa(week)
newEvent.Start, _ = types.ParseDateTime(event.StartTime)
newEvent.End, _ = types.ParseDateTime(event.EndTime)
newEvent.Name = event.Module
newEvent.EventType = event.EventType
newEvent.Compulsory = ""
newEvent.Prof = concatStringArray(event.Professors, "|")
newEvent.Rooms = concatStringArray(event.Rooms, " ")
newEvent.Notes = event.Description
newEvent.BookedAt = event.BookedAt
newEvent.Course = course
newEvent.Semester = event.Semester
events = append(events, newEvent)
}
}
}
// return events
return &events, nil
}
func concatStringArray(array []string, concatChar string) string {
var result string
if len(array) == 0 {
return result
}
if len(array) > 1 {
for _, item := range array[:len(array)-1] {
result += item + concatChar
}
}
result += array[len(array)-1]
return result
}