diff --git a/backend/backend.iml b/backend/backend.iml
deleted file mode 100644
index 49df094..0000000
--- a/backend/backend.iml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/backend/service/addCalDavRoutes.go b/backend/service/addCalDavRoutes.go
deleted file mode 100644
index 1b72e06..0000000
--- a/backend/service/addCalDavRoutes.go
+++ /dev/null
@@ -1,199 +0,0 @@
-//Calendar implementation for the HTWK Leipzig timetable. Evaluation and display of the individual dates in iCal format.
-//Copyright (C) 2024 HTWKalender support@htwkalender.de
-
-//This program is free software: you can redistribute it and/or modify
-//it under the terms of the GNU Affero General Public License as published by
-//the Free Software Foundation, either version 3 of the License, or
-//(at your option) any later version.
-
-//This program is distributed in the hope that it will be useful,
-//but WITHOUT ANY WARRANTY; without even the implied warranty of
-//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-//GNU Affero General Public License for more details.
-
-//You should have received a copy of the GNU Affero General Public License
-//along with this program. If not, see .
-
-package service
-
-import (
- "github.com/labstack/echo/v5"
- "github.com/pocketbase/pocketbase"
- "github.com/pocketbase/pocketbase/apis"
- "github.com/pocketbase/pocketbase/core"
- "htwkalender/service/db"
- "htwkalender/service/ical"
- "io"
- "net/http"
-)
-
-func addFeedRoutes(app *pocketbase.PocketBase) {
- app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
- _, err := e.Router.AddRoute(echo.Route{
- Method: http.MethodPost,
- Path: "/api/createFeed",
- Handler: func(c echo.Context) error {
- requestBody, _ := io.ReadAll(c.Request().Body)
- result, err := ical.CreateIndividualFeed(requestBody, app)
- if err != nil {
- return c.JSON(http.StatusInternalServerError, "Failed to create individual feed")
- }
- return c.JSON(http.StatusOK, result)
- },
- 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/feed",
- Handler: func(c echo.Context) error {
- token := c.QueryParam("token")
- result, err := ical.Feed(app, token)
- if err != nil {
- return c.JSON(http.StatusInternalServerError, "Failed to get feed")
- }
- var responseWriter = c.Response().Writer
- responseWriter.Header().Set("Content-type", "text/calendar")
- responseWriter.Header().Set("charset", "utf-8")
- responseWriter.Header().Set("Content-Disposition", "inline")
- responseWriter.Header().Set("filename", "calendar.ics")
-
- responseWriter.WriteHeader(http.StatusOK)
- _, err = responseWriter.Write([]byte(result))
- if err != nil {
- return c.JSON(http.StatusInternalServerError, "Failed to write feed")
- }
- c.Response().Writer = responseWriter
- return nil
- },
- 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.MethodDelete,
- Path: "/api/feed",
- Handler: func(c echo.Context) error {
- token := c.QueryParam("token")
- err := db.DeleteFeed(app.Dao(), token)
- if err != nil {
- return c.JSON(http.StatusNotFound, err)
- } else {
- return c.JSON(http.StatusOK, "Feed deleted")
- }
- },
- 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.MethodPut,
- Path: "/api/feed",
- Handler: func(c echo.Context) error {
- token := c.QueryParam("token")
- return c.JSON(http.StatusOK, "token: "+token)
- },
- Middlewares: []echo.MiddlewareFunc{
- apis.ActivityLogger(app),
- },
- })
- if err != nil {
- return err
- }
- return nil
- })
-
- // Route for Thunderbird to get calendar server information
- // Response is a 200 OK without additional content
- app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
- _, err := e.Router.AddRoute(echo.Route{
- Method: "PROPFIND",
- Path: "/",
- Handler: func(c echo.Context) error {
- return c.JSON(http.StatusOK, "")
- },
- Middlewares: []echo.MiddlewareFunc{
- apis.ActivityLogger(app),
- },
- })
- if err != nil {
- return err
- }
- return nil
- })
-
- // Route for Thunderbird to get calendar server information
- // Response is a 200 OK without additional content
- app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
- _, err := e.Router.AddRoute(echo.Route{
- Method: "PROPFIND",
- Path: "/.well-known/caldav",
- Handler: func(c echo.Context) error {
- return c.JSON(http.StatusOK, "")
- },
- 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: "PROPFIND",
- Path: "/api/feed",
- Handler: func(c echo.Context) error {
- return c.JSON(http.StatusOK, "")
- },
- 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.MethodHead,
- Path: "/api/feed",
- Handler: func(c echo.Context) error {
- return c.JSON(http.StatusOK, "")
- },
- Middlewares: []echo.MiddlewareFunc{
- apis.ActivityLogger(app),
- },
- })
- if err != nil {
- return err
- }
- return nil
- })
-}
diff --git a/docker-compose.yml b/docker-compose.yml
index 5b2ce9b..7196551 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -14,13 +14,11 @@
#You should have received a copy of the GNU Affero General Public License
#along with this program. If not, see .
-version: "3.9"
-
services:
htwkalender-backend:
build:
dockerfile: Dockerfile
- context: ./backend
+ context: ./services/backend
target: dev # prod
command: "--http=0.0.0.0:8090 --dir=/htwkalender/data/pb_data"
ports:
@@ -29,6 +27,13 @@ services:
- pb_data:/htwkalender/data # for production with volume
# - ./backend:/htwkalender/data # for development with bind mount from project directory
+ htwkalender-ical:
+ build:
+ dockerfile: Dockerfile
+ context: ./services/ical
+ target: dev # prod
+
+
htwkalender-frontend:
build:
dockerfile: Dockerfile
diff --git a/frontend/src/api/createFeed.ts b/frontend/src/api/createFeed.ts
index 7b8fcc4..81a897c 100644
--- a/frontend/src/api/createFeed.ts
+++ b/frontend/src/api/createFeed.ts
@@ -18,7 +18,7 @@ import { Module } from "../model/module.ts";
export async function createIndividualFeed(modules: Module[]): Promise {
try {
- const response = await fetch("/api/createFeed", {
+ const response = await fetch("/api/feed", {
method: "POST",
headers: {
"Content-Type": "application/json",
diff --git a/reverseproxy.local.conf b/reverseproxy.local.conf
index f520005..3804c59 100644
--- a/reverseproxy.local.conf
+++ b/reverseproxy.local.conf
@@ -52,6 +52,15 @@ http {
listen 80;
listen [::]:80;
+ location /api/feed {
+ proxy_pass http://htwkalender-ical:8091;
+ client_max_body_size 20m;
+ proxy_connect_timeout 600s;
+ proxy_read_timeout 600s;
+ proxy_send_timeout 600s;
+ send_timeout 600s;
+ }
+
location /api {
proxy_pass http://htwkalender-backend:8090;
client_max_body_size 20m;
diff --git a/backend/.gitignore b/services/backend/.gitignore
similarity index 100%
rename from backend/.gitignore
rename to services/backend/.gitignore
diff --git a/backend/Dockerfile b/services/backend/Dockerfile
similarity index 100%
rename from backend/Dockerfile
rename to services/backend/Dockerfile
diff --git a/backend/LICENSE b/services/backend/LICENSE
similarity index 100%
rename from backend/LICENSE
rename to services/backend/LICENSE
diff --git a/backend/README.md b/services/backend/README.md
similarity index 100%
rename from backend/README.md
rename to services/backend/README.md
diff --git a/backend/go.mod b/services/backend/go.mod
similarity index 100%
rename from backend/go.mod
rename to services/backend/go.mod
diff --git a/backend/go.sum b/services/backend/go.sum
similarity index 100%
rename from backend/go.sum
rename to services/backend/go.sum
diff --git a/backend/main.go b/services/backend/main.go
similarity index 100%
rename from backend/main.go
rename to services/backend/main.go
diff --git a/backend/migrations/1695150679_collections_snapshot.go b/services/backend/migrations/1695150679_collections_snapshot.go
similarity index 100%
rename from backend/migrations/1695150679_collections_snapshot.go
rename to services/backend/migrations/1695150679_collections_snapshot.go
diff --git a/backend/migrations/1695151278_add_admin_account.go b/services/backend/migrations/1695151278_add_admin_account.go
similarity index 100%
rename from backend/migrations/1695151278_add_admin_account.go
rename to services/backend/migrations/1695151278_add_admin_account.go
diff --git a/backend/migrations/1697532023_collections_snapshot.go b/services/backend/migrations/1697532023_collections_snapshot.go
similarity index 100%
rename from backend/migrations/1697532023_collections_snapshot.go
rename to services/backend/migrations/1697532023_collections_snapshot.go
diff --git a/backend/migrations/1697570688_collections_snapshot.go b/services/backend/migrations/1697570688_collections_snapshot.go
similarity index 100%
rename from backend/migrations/1697570688_collections_snapshot.go
rename to services/backend/migrations/1697570688_collections_snapshot.go
diff --git a/backend/migrations/1698017941_updated_events.go b/services/backend/migrations/1698017941_updated_events.go
similarity index 100%
rename from backend/migrations/1698017941_updated_events.go
rename to services/backend/migrations/1698017941_updated_events.go
diff --git a/backend/migrations/1698770845_updated_events.go b/services/backend/migrations/1698770845_updated_events.go
similarity index 100%
rename from backend/migrations/1698770845_updated_events.go
rename to services/backend/migrations/1698770845_updated_events.go
diff --git a/backend/migrations/1698770863_updated_events.go b/services/backend/migrations/1698770863_updated_events.go
similarity index 100%
rename from backend/migrations/1698770863_updated_events.go
rename to services/backend/migrations/1698770863_updated_events.go
diff --git a/backend/migrations/1698770891_collections_snapshot.go b/services/backend/migrations/1698770891_collections_snapshot.go
similarity index 100%
rename from backend/migrations/1698770891_collections_snapshot.go
rename to services/backend/migrations/1698770891_collections_snapshot.go
diff --git a/backend/migrations/1700512738_updated_feeds.go b/services/backend/migrations/1700512738_updated_feeds.go
similarity index 100%
rename from backend/migrations/1700512738_updated_feeds.go
rename to services/backend/migrations/1700512738_updated_feeds.go
diff --git a/backend/migrations/1700512916_collections_snapshot.go b/services/backend/migrations/1700512916_collections_snapshot.go
similarity index 100%
rename from backend/migrations/1700512916_collections_snapshot.go
rename to services/backend/migrations/1700512916_collections_snapshot.go
diff --git a/backend/migrations/1706827339_collections_snapshot.go b/services/backend/migrations/1706827339_collections_snapshot.go
similarity index 100%
rename from backend/migrations/1706827339_collections_snapshot.go
rename to services/backend/migrations/1706827339_collections_snapshot.go
diff --git a/backend/migrations/1706827586_updated_groups.go b/services/backend/migrations/1706827586_updated_groups.go
similarity index 100%
rename from backend/migrations/1706827586_updated_groups.go
rename to services/backend/migrations/1706827586_updated_groups.go
diff --git a/backend/model/eventModel.go b/services/backend/model/eventModel.go
similarity index 100%
rename from backend/model/eventModel.go
rename to services/backend/model/eventModel.go
diff --git a/backend-ical/model/eventModel_test.go b/services/backend/model/eventModel_test.go
similarity index 100%
rename from backend-ical/model/eventModel_test.go
rename to services/backend/model/eventModel_test.go
diff --git a/backend/model/feedModel.go b/services/backend/model/feedModel.go
similarity index 100%
rename from backend/model/feedModel.go
rename to services/backend/model/feedModel.go
diff --git a/backend/model/feedModel_test.go b/services/backend/model/feedModel_test.go
similarity index 100%
rename from backend/model/feedModel_test.go
rename to services/backend/model/feedModel_test.go
diff --git a/backend/model/icalModel.go b/services/backend/model/icalModel.go
similarity index 100%
rename from backend/model/icalModel.go
rename to services/backend/model/icalModel.go
diff --git a/backend/model/moduleModel.go b/services/backend/model/moduleModel.go
similarity index 100%
rename from backend/model/moduleModel.go
rename to services/backend/model/moduleModel.go
diff --git a/backend/model/moduleModel_test.go b/services/backend/model/moduleModel_test.go
similarity index 100%
rename from backend/model/moduleModel_test.go
rename to services/backend/model/moduleModel_test.go
diff --git a/backend/model/seminarGroup.go b/services/backend/model/seminarGroup.go
similarity index 100%
rename from backend/model/seminarGroup.go
rename to services/backend/model/seminarGroup.go
diff --git a/backend/model/seminarGroupXMLStruct.go b/services/backend/model/seminarGroupXMLStruct.go
similarity index 100%
rename from backend/model/seminarGroupXMLStruct.go
rename to services/backend/model/seminarGroupXMLStruct.go
diff --git a/backend/model/sportFetcherModel.go b/services/backend/model/sportFetcherModel.go
similarity index 100%
rename from backend/model/sportFetcherModel.go
rename to services/backend/model/sportFetcherModel.go
diff --git a/backend/openapi.yml b/services/backend/openapi.yml
similarity index 100%
rename from backend/openapi.yml
rename to services/backend/openapi.yml
diff --git a/backend/pb_schema.json b/services/backend/pb_schema.json
similarity index 100%
rename from backend/pb_schema.json
rename to services/backend/pb_schema.json
diff --git a/services/backend/service/addCalDavRoutes.go b/services/backend/service/addCalDavRoutes.go
new file mode 100644
index 0000000..02b0e4b
--- /dev/null
+++ b/services/backend/service/addCalDavRoutes.go
@@ -0,0 +1,76 @@
+//Calendar implementation for the HTWK Leipzig timetable. Evaluation and display of the individual dates in iCal format.
+//Copyright (C) 2024 HTWKalender support@htwkalender.de
+
+//This program is free software: you can redistribute it and/or modify
+//it under the terms of the GNU Affero General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//This program is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU Affero General Public License for more details.
+
+//You should have received a copy of the GNU Affero General Public License
+//along with this program. If not, see .
+
+package service
+
+import (
+ "github.com/labstack/echo/v5"
+ "github.com/pocketbase/pocketbase"
+ "github.com/pocketbase/pocketbase/apis"
+ "github.com/pocketbase/pocketbase/core"
+ "htwkalender/service/db"
+ "htwkalender/service/ical"
+ "io"
+ "net/http"
+)
+
+func addFeedRoutes(app *pocketbase.PocketBase) {
+ app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
+ _, err := e.Router.AddRoute(echo.Route{
+ Method: http.MethodPost,
+ Path: "/api/feed",
+ Handler: func(c echo.Context) error {
+ requestBody, _ := io.ReadAll(c.Request().Body)
+ result, err := ical.CreateIndividualFeed(requestBody, app)
+ if err != nil {
+ return c.JSON(http.StatusInternalServerError, "Failed to create individual feed")
+ }
+ return c.JSON(http.StatusOK, result)
+ },
+ 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.MethodDelete,
+ Path: "/api/feed",
+ Handler: func(c echo.Context) error {
+ token := c.QueryParam("token")
+ err := db.DeleteFeed(app.Dao(), token)
+ if err != nil {
+ return c.JSON(http.StatusNotFound, err)
+ } else {
+ return c.JSON(http.StatusOK, "Feed deleted")
+ }
+ },
+ Middlewares: []echo.MiddlewareFunc{
+ apis.ActivityLogger(app),
+ },
+ })
+ if err != nil {
+ return err
+ }
+ return nil
+ })
+
+}
diff --git a/backend/service/addRoute.go b/services/backend/service/addRoute.go
similarity index 100%
rename from backend/service/addRoute.go
rename to services/backend/service/addRoute.go
diff --git a/backend/service/addSchedule.go b/services/backend/service/addSchedule.go
similarity index 100%
rename from backend/service/addSchedule.go
rename to services/backend/service/addSchedule.go
diff --git a/backend/service/course/courseFunctions.go b/services/backend/service/course/courseFunctions.go
similarity index 100%
rename from backend/service/course/courseFunctions.go
rename to services/backend/service/course/courseFunctions.go
diff --git a/backend/service/date/dateFormat.go b/services/backend/service/date/dateFormat.go
similarity index 100%
rename from backend/service/date/dateFormat.go
rename to services/backend/service/date/dateFormat.go
diff --git a/backend/service/date/dateFormat_test.go b/services/backend/service/date/dateFormat_test.go
similarity index 100%
rename from backend/service/date/dateFormat_test.go
rename to services/backend/service/date/dateFormat_test.go
diff --git a/backend/service/db/dbEvents.go b/services/backend/service/db/dbEvents.go
similarity index 100%
rename from backend/service/db/dbEvents.go
rename to services/backend/service/db/dbEvents.go
diff --git a/backend/service/db/dbEvents_test.go b/services/backend/service/db/dbEvents_test.go
similarity index 100%
rename from backend/service/db/dbEvents_test.go
rename to services/backend/service/db/dbEvents_test.go
diff --git a/backend/service/db/dbFeeds.go b/services/backend/service/db/dbFeeds.go
similarity index 100%
rename from backend/service/db/dbFeeds.go
rename to services/backend/service/db/dbFeeds.go
diff --git a/backend/service/db/dbFeeds_test.go b/services/backend/service/db/dbFeeds_test.go
similarity index 100%
rename from backend/service/db/dbFeeds_test.go
rename to services/backend/service/db/dbFeeds_test.go
diff --git a/backend/service/db/dbFunctions.go b/services/backend/service/db/dbFunctions.go
similarity index 100%
rename from backend/service/db/dbFunctions.go
rename to services/backend/service/db/dbFunctions.go
diff --git a/backend/service/db/dbGroups.go b/services/backend/service/db/dbGroups.go
similarity index 100%
rename from backend/service/db/dbGroups.go
rename to services/backend/service/db/dbGroups.go
diff --git a/backend/service/db/dbRooms.go b/services/backend/service/db/dbRooms.go
similarity index 100%
rename from backend/service/db/dbRooms.go
rename to services/backend/service/db/dbRooms.go
diff --git a/backend/service/db/mockData/data.db b/services/backend/service/db/mockData/data.db
similarity index 100%
rename from backend/service/db/mockData/data.db
rename to services/backend/service/db/mockData/data.db
diff --git a/backend/service/db/mockData/logs.db b/services/backend/service/db/mockData/logs.db
similarity index 100%
rename from backend/service/db/mockData/logs.db
rename to services/backend/service/db/mockData/logs.db
diff --git a/backend/service/events/courseService.go b/services/backend/service/events/courseService.go
similarity index 100%
rename from backend/service/events/courseService.go
rename to services/backend/service/events/courseService.go
diff --git a/backend/service/events/courseService_test.go b/services/backend/service/events/courseService_test.go
similarity index 100%
rename from backend/service/events/courseService_test.go
rename to services/backend/service/events/courseService_test.go
diff --git a/backend/service/events/eventService.go b/services/backend/service/events/eventService.go
similarity index 100%
rename from backend/service/events/eventService.go
rename to services/backend/service/events/eventService.go
diff --git a/backend/service/events/eventService_test.go b/services/backend/service/events/eventService_test.go
similarity index 100%
rename from backend/service/events/eventService_test.go
rename to services/backend/service/events/eventService_test.go
diff --git a/backend/service/feed/feedFunctions.go b/services/backend/service/feed/feedFunctions.go
similarity index 100%
rename from backend/service/feed/feedFunctions.go
rename to services/backend/service/feed/feedFunctions.go
diff --git a/backend/service/feed/feedFunctions_test.go b/services/backend/service/feed/feedFunctions_test.go
similarity index 100%
rename from backend/service/feed/feedFunctions_test.go
rename to services/backend/service/feed/feedFunctions_test.go
diff --git a/backend/service/feed/mockData/data.db b/services/backend/service/feed/mockData/data.db
similarity index 100%
rename from backend/service/feed/mockData/data.db
rename to services/backend/service/feed/mockData/data.db
diff --git a/backend/service/feed/mockData/logs.db b/services/backend/service/feed/mockData/logs.db
similarity index 100%
rename from backend/service/feed/mockData/logs.db
rename to services/backend/service/feed/mockData/logs.db
diff --git a/backend/service/fetch/htmlDownloader.go b/services/backend/service/fetch/htmlDownloader.go
similarity index 100%
rename from backend/service/fetch/htmlDownloader.go
rename to services/backend/service/fetch/htmlDownloader.go
diff --git a/backend/service/fetch/sport/sportFetcher.go b/services/backend/service/fetch/sport/sportFetcher.go
similarity index 100%
rename from backend/service/fetch/sport/sportFetcher.go
rename to services/backend/service/fetch/sport/sportFetcher.go
diff --git a/backend/service/fetch/sport/sportFetcher_test.go b/services/backend/service/fetch/sport/sportFetcher_test.go
similarity index 100%
rename from backend/service/fetch/sport/sportFetcher_test.go
rename to services/backend/service/fetch/sport/sportFetcher_test.go
diff --git a/backend/service/fetch/v1/fetchSeminarEventService.go b/services/backend/service/fetch/v1/fetchSeminarEventService.go
similarity index 100%
rename from backend/service/fetch/v1/fetchSeminarEventService.go
rename to services/backend/service/fetch/v1/fetchSeminarEventService.go
diff --git a/backend/service/fetch/v1/fetchSeminarEventService_test.go b/services/backend/service/fetch/v1/fetchSeminarEventService_test.go
similarity index 100%
rename from backend/service/fetch/v1/fetchSeminarEventService_test.go
rename to services/backend/service/fetch/v1/fetchSeminarEventService_test.go
diff --git a/backend/service/fetch/v1/fetchSeminarGroupService.go b/services/backend/service/fetch/v1/fetchSeminarGroupService.go
similarity index 100%
rename from backend/service/fetch/v1/fetchSeminarGroupService.go
rename to services/backend/service/fetch/v1/fetchSeminarGroupService.go
diff --git a/backend/service/fetch/v1/fetchSeminarGroupService_test.go b/services/backend/service/fetch/v1/fetchSeminarGroupService_test.go
similarity index 100%
rename from backend/service/fetch/v1/fetchSeminarGroupService_test.go
rename to services/backend/service/fetch/v1/fetchSeminarGroupService_test.go
diff --git a/backend/service/fetch/v1/htmlParsingFunctions.go b/services/backend/service/fetch/v1/htmlParsingFunctions.go
similarity index 100%
rename from backend/service/fetch/v1/htmlParsingFunctions.go
rename to services/backend/service/fetch/v1/htmlParsingFunctions.go
diff --git a/backend/service/fetch/v2/eventParser.go b/services/backend/service/fetch/v2/eventParser.go
similarity index 100%
rename from backend/service/fetch/v2/eventParser.go
rename to services/backend/service/fetch/v2/eventParser.go
diff --git a/backend/service/fetch/v2/fetcher.go b/services/backend/service/fetch/v2/fetcher.go
similarity index 100%
rename from backend/service/fetch/v2/fetcher.go
rename to services/backend/service/fetch/v2/fetcher.go
diff --git a/backend/service/fetch/v2/fetcher_test.go b/services/backend/service/fetch/v2/fetcher_test.go
similarity index 100%
rename from backend/service/fetch/v2/fetcher_test.go
rename to services/backend/service/fetch/v2/fetcher_test.go
diff --git a/backend/service/fetch/v2/htmlParsingFunctions.go b/services/backend/service/fetch/v2/htmlParsingFunctions.go
similarity index 100%
rename from backend/service/fetch/v2/htmlParsingFunctions.go
rename to services/backend/service/fetch/v2/htmlParsingFunctions.go
diff --git a/backend/service/functions/semester.go b/services/backend/service/functions/semester.go
similarity index 100%
rename from backend/service/functions/semester.go
rename to services/backend/service/functions/semester.go
diff --git a/backend-ical/service/functions/semester_test.go b/services/backend/service/functions/semester_test.go
similarity index 100%
rename from backend-ical/service/functions/semester_test.go
rename to services/backend/service/functions/semester_test.go
diff --git a/backend-ical/service/functions/string.go b/services/backend/service/functions/string.go
similarity index 100%
rename from backend-ical/service/functions/string.go
rename to services/backend/service/functions/string.go
diff --git a/backend-ical/service/functions/string_test.go b/services/backend/service/functions/string_test.go
similarity index 100%
rename from backend-ical/service/functions/string_test.go
rename to services/backend/service/functions/string_test.go
diff --git a/backend-ical/service/functions/time/mockClock.go b/services/backend/service/functions/time/mockClock.go
similarity index 100%
rename from backend-ical/service/functions/time/mockClock.go
rename to services/backend/service/functions/time/mockClock.go
diff --git a/backend-ical/service/functions/time/parse.go b/services/backend/service/functions/time/parse.go
similarity index 100%
rename from backend-ical/service/functions/time/parse.go
rename to services/backend/service/functions/time/parse.go
diff --git a/backend-ical/service/functions/time/realClock.go b/services/backend/service/functions/time/realClock.go
similarity index 100%
rename from backend-ical/service/functions/time/realClock.go
rename to services/backend/service/functions/time/realClock.go
diff --git a/backend-ical/service/functions/time/time.go b/services/backend/service/functions/time/time.go
similarity index 100%
rename from backend-ical/service/functions/time/time.go
rename to services/backend/service/functions/time/time.go
diff --git a/backend/service/ical/ical.go b/services/backend/service/ical/ical.go
similarity index 57%
rename from backend/service/ical/ical.go
rename to services/backend/service/ical/ical.go
index d1cea64..ec604fc 100644
--- a/backend/service/ical/ical.go
+++ b/services/backend/service/ical/ical.go
@@ -17,60 +17,13 @@
package ical
import (
- "bytes"
"encoding/json"
- "htwkalender/model"
- "htwkalender/service/db"
- "htwkalender/service/feed"
- "time"
-
- "github.com/jordic/goics"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/apis"
+ "htwkalender/model"
+ "htwkalender/service/db"
)
-const expirationTime = 5 * time.Minute
-
-func Feed(app *pocketbase.PocketBase, token string) (string, error) {
- var result string
-
- icalFeed, err := db.FindFeedByToken(token, app)
- if icalFeed == nil && err != nil {
- return "", err
- }
-
- modules := make(map[string]model.FeedCollection)
- var modulesArray []model.FeedCollection
- _ = json.Unmarshal([]byte(icalFeed.Modules), &modulesArray)
-
- for _, module := range modulesArray {
- modules[module.UUID] = module
- }
-
- newFeed, createFeedErr := createFeedForToken(app, modules)
- if createFeedErr != nil {
- return "", createFeedErr
- }
- result = newFeed.Content
-
- return result, nil
-}
-
-func createFeedForToken(app *pocketbase.PocketBase, modules map[string]model.FeedCollection) (*model.FeedModel, error) {
- events, err := db.GetPlanForModules(app, modules)
- if err != nil {
- return nil, apis.NewNotFoundError("Could not fetch events", err)
- }
-
- // Combine Events
- events = feed.CombineEventsInFeed(events)
-
- b := bytes.Buffer{}
- goics.NewICalEncode(&b).Encode(IcalModel{Events: events, Mapping: modules})
- icalFeed := &model.FeedModel{Content: b.String(), ExpiresAt: time.Now().Add(expirationTime)}
- return icalFeed, nil
-}
-
func CreateIndividualFeed(requestBody []byte, app *pocketbase.PocketBase) (string, error) {
var modules []model.FeedCollection
diff --git a/backend/service/ical/icalFileGeneration.go b/services/backend/service/ical/icalFileGeneration.go
similarity index 100%
rename from backend/service/ical/icalFileGeneration.go
rename to services/backend/service/ical/icalFileGeneration.go
diff --git a/backend-ical/service/ical/icalFileGeneration_test.go b/services/backend/service/ical/icalFileGeneration_test.go
similarity index 100%
rename from backend-ical/service/ical/icalFileGeneration_test.go
rename to services/backend/service/ical/icalFileGeneration_test.go
diff --git a/backend-ical/service/ical/icsComponenter.go b/services/backend/service/ical/icsComponenter.go
similarity index 100%
rename from backend-ical/service/ical/icsComponenter.go
rename to services/backend/service/ical/icsComponenter.go
diff --git a/backend/service/names/userDefinedNameTemplates.go b/services/backend/service/names/userDefinedNameTemplates.go
similarity index 100%
rename from backend/service/names/userDefinedNameTemplates.go
rename to services/backend/service/names/userDefinedNameTemplates.go
diff --git a/backend-ical/service/names/userDefinedNameTemplates_test.go b/services/backend/service/names/userDefinedNameTemplates_test.go
similarity index 100%
rename from backend-ical/service/names/userDefinedNameTemplates_test.go
rename to services/backend/service/names/userDefinedNameTemplates_test.go
diff --git a/backend/service/room/roomService.go b/services/backend/service/room/roomService.go
similarity index 100%
rename from backend/service/room/roomService.go
rename to services/backend/service/room/roomService.go
diff --git a/backend/service/room/roomService_test.go b/services/backend/service/room/roomService_test.go
similarity index 100%
rename from backend/service/room/roomService_test.go
rename to services/backend/service/room/roomService_test.go
diff --git a/services/ical/Dockerfile b/services/ical/Dockerfile
new file mode 100644
index 0000000..5a6be0e
--- /dev/null
+++ b/services/ical/Dockerfile
@@ -0,0 +1,70 @@
+#Calendar implementation for the HTWK Leipzig timetable. Evaluation and display of the individual dates in iCal format.
+#Copyright (C) 2024 HTWKalender support@htwkalender.de
+
+#This program is free software: you can redistribute it and/or modify
+#it under the terms of the GNU Affero General Public License as published by
+#the Free Software Foundation, either version 3 of the License, or
+#(at your option) any later version.
+
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+#GNU Affero General Public License for more details.
+
+#You should have received a copy of the GNU Affero General Public License
+#along with this program. If not, see .
+
+# build stage
+FROM golang:alpine AS build
+
+WORKDIR /app
+
+# Copy the source from the current directory to the Working Directory inside the container
+COPY . ./
+# download needed modules
+RUN apk add --no-cache --update go gcc g++ && \
+ go mod download && \
+ CGO_ENABLED=1 GOOS=linux go build -o /htwkalender-ical
+
+# production stage
+FROM alpine:latest AS prod
+
+WORKDIR /htwkalender-ical
+
+ARG USER=ical
+RUN adduser -Ds /bin/sh $USER && \
+ chown $USER:$USER ./
+
+USER $USER
+RUN mkdir -p data
+
+# copies executable from build container
+COPY --chown=$USER:$USER --from=build /htwkalender-ical ./
+
+# Expose port 8090 to the outside world
+EXPOSE 8091
+
+ENTRYPOINT ["./htwkalender-ical"]
+
+
+FROM golang:1.21.6 AS dev
+
+# Set the Current Working Directory inside the container
+WORKDIR /htwkalender-ical
+
+# Copy go mod and sum files
+COPY go.mod go.sum ./
+RUN go mod download
+
+# Copy the source from the current directory to the Working Directory inside the container
+COPY *.go ./
+COPY . .
+
+# Build the Go app
+RUN CGO_ENABLED=1 GOOS=linux go build -o /htwkalender-ical
+
+# Expose port 8090 to the outside world
+EXPOSE 8090
+
+# Entry point
+ENTRYPOINT ["./htwkalender-ical"]
\ No newline at end of file
diff --git a/backend-ical/go.mod b/services/ical/go.mod
similarity index 100%
rename from backend-ical/go.mod
rename to services/ical/go.mod
diff --git a/backend-ical/go.sum b/services/ical/go.sum
similarity index 100%
rename from backend-ical/go.sum
rename to services/ical/go.sum
diff --git a/backend-ical/main.go b/services/ical/main.go
similarity index 77%
rename from backend-ical/main.go
rename to services/ical/main.go
index d2c9ef7..1b1dbf0 100644
--- a/backend-ical/main.go
+++ b/services/ical/main.go
@@ -22,16 +22,24 @@ import (
"htwkalender-ical/service"
)
-// main function for the backend-ical service
+// main function for the ical service
// uses rest api to get the data from the backend
// exposes rest api endpoints with fiber to serve the data for clients
func main() {
// Initialize a new Fiber app
- app := fiber.New()
+ webdavRequestMethods := []string{"PROPFIND", "MKCOL", "COPY", "MOVE"}
+
+ app := fiber.New(fiber.Config{
+ CaseSensitive: true,
+ StrictRouting: true,
+ ServerHeader: "Fiber",
+ AppName: "App Name",
+ RequestMethods: append(fiber.DefaultMethods[:], webdavRequestMethods...),
+ })
// Add routes to the app instance for the backend ical service
service.AddFeedRoutes(app)
- log.Fatal(app.Listen(":3000"))
+ log.Fatal(app.Listen(":8091"))
}
diff --git a/backend-ical/model/eventModel.go b/services/ical/model/eventModel.go
similarity index 100%
rename from backend-ical/model/eventModel.go
rename to services/ical/model/eventModel.go
diff --git a/backend/model/eventModel_test.go b/services/ical/model/eventModel_test.go
similarity index 100%
rename from backend/model/eventModel_test.go
rename to services/ical/model/eventModel_test.go
diff --git a/backend-ical/model/feedModel.go b/services/ical/model/feedModel.go
similarity index 100%
rename from backend-ical/model/feedModel.go
rename to services/ical/model/feedModel.go
diff --git a/backend-ical/model/icalModel.go b/services/ical/model/icalModel.go
similarity index 100%
rename from backend-ical/model/icalModel.go
rename to services/ical/model/icalModel.go
diff --git a/backend-ical/model/moduleModel.go b/services/ical/model/moduleModel.go
similarity index 100%
rename from backend-ical/model/moduleModel.go
rename to services/ical/model/moduleModel.go
diff --git a/backend-ical/service/connector/feedConnector.go b/services/ical/service/connector/feedConnector.go
similarity index 90%
rename from backend-ical/service/connector/feedConnector.go
rename to services/ical/service/connector/feedConnector.go
index 4e41d95..3f2dff5 100644
--- a/backend-ical/service/connector/feedConnector.go
+++ b/services/ical/service/connector/feedConnector.go
@@ -38,6 +38,15 @@ func parseResponse(response []byte) (model.FeedRecord, error) {
return feedRecord, nil
}
+func DeleteFeedRecord(token string) error {
+ err := DeleteRequestApi("/api/feed?token=" + token)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
func GetModuleWithEvents(module model.FeedModule) (model.Module, error) {
var modules model.Module
diff --git a/backend-ical/service/connector/restHandler.go b/services/ical/service/connector/restHandler.go
similarity index 51%
rename from backend-ical/service/connector/restHandler.go
rename to services/ical/service/connector/restHandler.go
index 8b8c573..5124bfd 100644
--- a/backend-ical/service/connector/restHandler.go
+++ b/services/ical/service/connector/restHandler.go
@@ -7,7 +7,7 @@ import (
func RequestApi(path string) (*client.Response, error) {
- var host = "http://localhost"
+ var host = "http://htwkalender-backend:8090"
cc := client.New()
cc.SetTimeout(5 * time.Second)
@@ -20,3 +20,19 @@ func RequestApi(path string) (*client.Response, error) {
return response, nil
}
+
+func DeleteRequestApi(path string) error {
+
+ var host = "http://htwkalender-backend:8090"
+
+ cc := client.New()
+ cc.SetTimeout(5 * time.Second)
+
+ // set retry to 0
+ _, err := cc.Delete(host + path)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/backend-ical/service/functions/semester.go b/services/ical/service/functions/semester.go
similarity index 100%
rename from backend-ical/service/functions/semester.go
rename to services/ical/service/functions/semester.go
diff --git a/backend/service/functions/semester_test.go b/services/ical/service/functions/semester_test.go
similarity index 100%
rename from backend/service/functions/semester_test.go
rename to services/ical/service/functions/semester_test.go
diff --git a/backend/service/functions/string.go b/services/ical/service/functions/string.go
similarity index 100%
rename from backend/service/functions/string.go
rename to services/ical/service/functions/string.go
diff --git a/backend/service/functions/string_test.go b/services/ical/service/functions/string_test.go
similarity index 100%
rename from backend/service/functions/string_test.go
rename to services/ical/service/functions/string_test.go
diff --git a/backend/service/functions/time/mockClock.go b/services/ical/service/functions/time/mockClock.go
similarity index 100%
rename from backend/service/functions/time/mockClock.go
rename to services/ical/service/functions/time/mockClock.go
diff --git a/backend/service/functions/time/parse.go b/services/ical/service/functions/time/parse.go
similarity index 100%
rename from backend/service/functions/time/parse.go
rename to services/ical/service/functions/time/parse.go
diff --git a/backend/service/functions/time/realClock.go b/services/ical/service/functions/time/realClock.go
similarity index 100%
rename from backend/service/functions/time/realClock.go
rename to services/ical/service/functions/time/realClock.go
diff --git a/backend/service/functions/time/time.go b/services/ical/service/functions/time/time.go
similarity index 100%
rename from backend/service/functions/time/time.go
rename to services/ical/service/functions/time/time.go
diff --git a/backend-ical/service/ical/ical.go b/services/ical/service/ical/ical.go
similarity index 89%
rename from backend-ical/service/ical/ical.go
rename to services/ical/service/ical/ical.go
index caa1ac1..6245b6b 100644
--- a/backend-ical/service/ical/ical.go
+++ b/services/ical/service/ical/ical.go
@@ -53,3 +53,11 @@ func FeedRecord(token string) (model.FeedRecord, error) {
return feedRecord, nil
}
+
+func DeleteFeedRecord(token string) error {
+ err := connector.DeleteFeedRecord(token)
+ if err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/backend-ical/service/ical/icalFileGeneration.go b/services/ical/service/ical/icalFileGeneration.go
similarity index 100%
rename from backend-ical/service/ical/icalFileGeneration.go
rename to services/ical/service/ical/icalFileGeneration.go
diff --git a/backend/service/ical/icalFileGeneration_test.go b/services/ical/service/ical/icalFileGeneration_test.go
similarity index 100%
rename from backend/service/ical/icalFileGeneration_test.go
rename to services/ical/service/ical/icalFileGeneration_test.go
diff --git a/backend/service/ical/icsComponenter.go b/services/ical/service/ical/icsComponenter.go
similarity index 100%
rename from backend/service/ical/icsComponenter.go
rename to services/ical/service/ical/icsComponenter.go
diff --git a/backend-ical/service/names/userDefinedNameTemplates.go b/services/ical/service/names/userDefinedNameTemplates.go
similarity index 100%
rename from backend-ical/service/names/userDefinedNameTemplates.go
rename to services/ical/service/names/userDefinedNameTemplates.go
diff --git a/backend/service/names/userDefinedNameTemplates_test.go b/services/ical/service/names/userDefinedNameTemplates_test.go
similarity index 100%
rename from backend/service/names/userDefinedNameTemplates_test.go
rename to services/ical/service/names/userDefinedNameTemplates_test.go
diff --git a/backend-ical/service/routes.go b/services/ical/service/routes.go
similarity index 52%
rename from backend-ical/service/routes.go
rename to services/ical/service/routes.go
index 4a13ea2..04856d2 100644
--- a/backend-ical/service/routes.go
+++ b/services/ical/service/routes.go
@@ -4,6 +4,7 @@ import (
"github.com/gofiber/fiber/v3"
"htwkalender-ical/service/ical"
"log/slog"
+ "net/http"
)
// add routes to the app instance for the backend ical service
@@ -42,4 +43,42 @@ func AddFeedRoutes(app *fiber.App) {
return c.JSON(results)
})
+
+ app.Delete("/api/feed", func(c fiber.Ctx) error {
+
+ token := c.Query("token")
+ err := ical.DeleteFeedRecord(token)
+ if err != nil {
+ slog.Error("Feed could not be deleted", "error", err)
+ return c.JSON(http.StatusNotFound, "Feed could not be deleted")
+ } else {
+ return c.JSON(http.StatusOK, "Feed deleted")
+ }
+ })
+
+ app.Put("/api/feed", func(c fiber.Ctx) error {
+ token := c.Query("token")
+ return c.JSON(http.StatusOK, "token: "+token)
+ })
+
+ app.Head("/api/feed", func(c fiber.Ctx) error {
+ return c.JSON(http.StatusOK, "")
+ })
+
+ app.Add([]string{"PROPFIND"}, "/api/feed", func(c fiber.Ctx) error {
+ return c.JSON(http.StatusOK, "")
+ })
+
+ // Route for Thunderbird to get calendar server information
+ // Response is a 200 OK without additional content
+ app.Add([]string{"PROPFIND"}, "/.well-known/caldav", func(c fiber.Ctx) error {
+ return c.JSON(http.StatusOK, "")
+ })
+
+ // Route for Thunderbird to get calendar server information
+ // Response is a 200 OK without additional content
+ app.Add([]string{"PROPFIND"}, "/", func(c fiber.Ctx) error {
+ return c.JSON(http.StatusOK, "")
+ })
+
}