Merge branch '26-multiple-bugs' into 'main'

Resolve "multiple bugs"

Closes #26

See merge request ekresse/htwkalender!15
This commit is contained in:
ekresse
2024-02-04 00:31:35 +00:00
12 changed files with 88 additions and 19 deletions

View File

@@ -21,9 +21,7 @@ func main() {
// (the isGoRun check is to enable it only during development) // (the isGoRun check is to enable it only during development)
Automigrate: isGoRun, Automigrate: isGoRun,
}) })
service.AddRoutes(app) service.AddRoutes(app)
service.AddSchedules(app) service.AddSchedules(app)
if err := app.Start(); err != nil { if err := app.Start(); err != nil {

View File

@@ -187,6 +187,20 @@ paths:
responses: responses:
'200': '200':
description: Successful response description: Successful response
/api/courses/events:
get:
summary: Get Courses that have Events for specific semester
parameters:
- name: semester
in: query
description: semester
required: true
example: "ws"
schema:
type: string
responses:
'200':
description: Successful response
/api/collections/feeds/records/{id}: /api/collections/feeds/records/{id}:
get: get:
summary: Get Modules selected for iCal feed summary: Get Modules selected for iCal feed

View File

@@ -294,8 +294,14 @@ func AddRoutes(app *pocketbase.PocketBase) {
Method: http.MethodGet, Method: http.MethodGet,
Path: "/api/courses", Path: "/api/courses",
Handler: func(c echo.Context) error { Handler: func(c echo.Context) error {
courses := events.GetAllCourses(app) semester := c.QueryParam("semester")
return c.JSON(200, courses) if semester == "" {
courses := events.GetAllCourses(app)
return c.JSON(200, courses)
} else {
courses := events.GetAllCoursesForSemester(app, semester)
return c.JSON(200, courses)
}
}, },
Middlewares: []echo.MiddlewareFunc{ Middlewares: []echo.MiddlewareFunc{
apis.ActivityLogger(app), apis.ActivityLogger(app),
@@ -307,14 +313,21 @@ func AddRoutes(app *pocketbase.PocketBase) {
return nil return nil
}) })
// api end point to get all courses for a specific semester with courses that have events
app.OnBeforeServe().Add(func(e *core.ServeEvent) error { app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
_, err := e.Router.AddRoute(echo.Route{ _, err := e.Router.AddRoute(echo.Route{
Method: http.MethodGet, Method: http.MethodGet,
Path: "/api/courses", Path: "/api/courses/events",
Handler: func(c echo.Context) error { Handler: func(c echo.Context) error {
semester := c.QueryParam("semester") semester := c.QueryParam("semester")
courses := events.GetAllCoursesForSemester(app, semester) courses, err := events.GetAllCoursesForSemesterWithEvents(app, semester)
return c.JSON(200, courses)
if err != nil {
slog.Error("Failed to get courses for semester with events: %v", err)
return c.JSON(http.StatusBadRequest, "Failed to get courses for semester with events")
} else {
return c.JSON(200, courses)
}
}, },
Middlewares: []echo.MiddlewareFunc{ Middlewares: []echo.MiddlewareFunc{
apis.ActivityLogger(app), apis.ActivityLogger(app),

View File

@@ -82,13 +82,13 @@ func GetAllCourses(app *pocketbase.PocketBase) []string {
return courseArray return courseArray
} }
func GetAllCoursesForSemester(app *pocketbase.PocketBase, semester string) interface{} { func GetAllCoursesForSemester(app *pocketbase.PocketBase, semester string) []string {
var courses []struct { var courses []struct {
CourseShortcut string `db:"course" json:"course"` CourseShortcut string `db:"course" json:"course"`
} }
// get all rooms from event records in the events collection // get all courses for a specific semester
err := app.Dao().DB().Select("course").From("groups").Where(dbx.NewExp("semester = {:semester}", dbx.Params{"semester": semester})).All(&courses) err := app.Dao().DB().Select("course").From("groups").Where(dbx.NewExp("semester = {:semester}", dbx.Params{"semester": semester})).All(&courses)
if err != nil { if err != nil {
slog.Error("Error while getting groups from database: ", err) slog.Error("Error while getting groups from database: ", err)
@@ -104,3 +104,25 @@ func GetAllCoursesForSemester(app *pocketbase.PocketBase, semester string) inter
return courseArray return courseArray
} }
func GetAllCoursesForSemesterWithEvents(app *pocketbase.PocketBase, semester string) ([]string, error) {
var courses []struct {
CourseShortcut string `db:"course" json:"course"`
}
// get all courses from events distinct for a specific semester
err := app.Dao().DB().Select("course").From("events").Where(dbx.NewExp("semester = {:semester}", dbx.Params{"semester": semester})).Distinct(true).All(&courses)
if err != nil {
slog.Error("Error while getting groups from database: ", err)
return nil, err
}
var courseArray []string
for _, course := range courses {
courseArray = append(courseArray, course.CourseShortcut)
}
return courseArray, nil
}

View File

@@ -3,12 +3,35 @@ package events
import ( import (
"github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase"
"htwkalender/service/db" "htwkalender/service/db"
"htwkalender/service/functions"
) )
func GetAllCourses(app *pocketbase.PocketBase) []string { func GetAllCourses(app *pocketbase.PocketBase) []string {
return db.GetAllCourses(app) return db.GetAllCourses(app)
} }
func GetAllCoursesForSemester(app *pocketbase.PocketBase, semester string) interface{} { func GetAllCoursesForSemester(app *pocketbase.PocketBase, semester string) []string {
return db.GetAllCoursesForSemester(app, semester) return db.GetAllCoursesForSemester(app, semester)
} }
func GetAllCoursesForSemesterWithEvents(app *pocketbase.PocketBase, semester string) ([]string, error) {
courses, err := db.GetAllCoursesForSemesterWithEvents(app, semester)
if err != nil {
return nil, err
} else {
// remove empty courses
courses = removeEmptyCourses(courses)
return courses, nil
}
}
func removeEmptyCourses(courses []string) []string {
var filteredCourses []string
for index, course := range courses {
if functions.OnlyWhitespace(course) || len(course) == 0 {
filteredCourses = append(courses[:index], courses[index+1:]...)
}
}
return filteredCourses
}

View File

@@ -12,6 +12,9 @@ const disabledPages = [
"privacy-policy", "privacy-policy",
"edit", "edit",
"edit-calendar", "edit-calendar",
"rooms",
"free-rooms",
"room-schedule",
]; ];
const store = moduleStore(); const store = moduleStore();

View File

@@ -53,7 +53,6 @@ export async function saveIndividualFeed(
return feedResponse; return feedResponse;
}) })
.then((response: FeedResponse) => { .then((response: FeedResponse) => {
console.debug("response", response);
token = response.id; token = response.id;
}); });
return token; return token;

View File

@@ -24,7 +24,7 @@ export async function fetchCourseBySemester(
semester: string, semester: string,
): Promise<string[]> { ): Promise<string[]> {
const courses: string[] = []; const courses: string[] = [];
await fetch("/api/courses?semester=" + semester) await fetch("/api/courses/events?semester=" + semester)
.then((response) => { .then((response) => {
//check if response type is json //check if response type is json
const contentType = response.headers.get("content-type"); const contentType = response.headers.get("content-type");
@@ -35,7 +35,7 @@ export async function fetchCourseBySemester(
} }
}) })
.then((coursesResponse) => { .then((coursesResponse) => {
coursesResponse.forEach((course: string) => courses.push(course)); coursesResponse?.forEach((course: string) => courses.push(course));
}); });
return courses; return courses;
} }
@@ -70,7 +70,7 @@ export async function fetchModulesByCourseAndSemester(
} }
export async function fetchAllModules(): Promise<Module[]> { export async function fetchAllModules(): Promise<Module[]> {
let modules: Module[] = []; const modules: Module[] = [];
await fetch("/api/modules") await fetch("/api/modules")
.then((response) => { .then((response) => {
return response.json() as Promise<Module[]>; return response.json() as Promise<Module[]>;

View File

@@ -4,7 +4,6 @@ export async function requestFreeRooms(
from: string, from: string,
to: string, to: string,
): Promise<string[]> { ): Promise<string[]> {
console.debug("requestFreeRooms: from=" + from + ", to=" + to);
const rooms: string[] = []; const rooms: string[] = [];
await fetch("/api/rooms/free?from=" + from + "&to=" + to) await fetch("/api/rooms/free?from=" + from + "&to=" + to)
.then((response) => { .then((response) => {

View File

@@ -34,8 +34,7 @@ function rerouteIfTokenIsEmpty() {
function copyToClipboard() { function copyToClipboard() {
// Copy the text inside the text field // Copy the text inside the text field
navigator.clipboard.writeText(getLink()).then(show, (err) => { navigator.clipboard.writeText(getLink()).then(show, () => {
console.error("Could not copy text: ", err);
toast.add({ toast.add({
severity: "error", severity: "error",
summary: t("calendarLink.copyToastError"), summary: t("calendarLink.copyToastError"),

View File

@@ -60,7 +60,7 @@ async function getOccupation() {
calendar?.refetchEvents(); calendar?.refetchEvents();
}) })
.catch((error) => { .catch((error) => {
console.log(error); console.error(error);
}); });
} }

View File

@@ -45,7 +45,6 @@ const fetchedModules = async () => {
}; };
function deleteModule(module: Module) { function deleteModule(module: Module) {
console.debug(module);
moduleStore().removeModule(module); moduleStore().removeModule(module);
} }