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, "") + }) + }