mirror of
https://gitlab.dit.htwk-leipzig.de/htwk-software/htwkalender-pwa.git
synced 2025-08-07 04:09:17 +02:00
Merge branch '26-multiple-bugs' into 'main'
Resolve "multiple bugs" Closes #26 See merge request ekresse/htwkalender!15
This commit is contained in:
@@ -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 {
|
||||||
|
@@ -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
|
||||||
|
@@ -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),
|
||||||
|
@@ -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
|
||||||
|
}
|
||||||
|
@@ -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
|
||||||
|
}
|
||||||
|
@@ -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();
|
||||||
|
@@ -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;
|
||||||
|
@@ -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[]>;
|
||||||
|
@@ -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) => {
|
||||||
|
@@ -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"),
|
||||||
|
@@ -60,7 +60,7 @@ async function getOccupation() {
|
|||||||
calendar?.refetchEvents();
|
calendar?.refetchEvents();
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
console.log(error);
|
console.error(error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,7 +45,6 @@ const fetchedModules = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function deleteModule(module: Module) {
|
function deleteModule(module: Module) {
|
||||||
console.debug(module);
|
|
||||||
moduleStore().removeModule(module);
|
moduleStore().removeModule(module);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user