Skip to main content

Backend

Verwendete Technologien

Das Backend ist in Kotlin umgesetzt und nutzt Ktor als schlankes, asynchrones Server-Framework für Routing, Middleware und REST-APIs. Für den Datenzugriff kommt Exposed als Kotlin-ORM/SQL-DSL zum Einsatz, wodurch Datenbankabfragen typsicher und wartbar formuliert werden können. Als persistente Datenbank wird PostgreSQL verwendet, da es eine hohe Zuverlässigkeit, starke SQL-Unterstützung und gute Performance bietet.

Projektstruktur

Die Projektstruktur ist wie folgt organisiert:

rapla-backend/
├── src/
│ ├── main/kotlin/
│ │ ├── Application.kt # Ktor Application Konfiguration
│ │ ├── Routing.kt # REST API Endpoints und Routing
│ │ ├── Databases.kt # Datenbankverbindung und Initialisierung
│ │ ├── Serialization.kt # JSON Serialisierungskonfiguration
│ │ ├── dtos/ # Data Transfer Objects
│ │ │ ├── CalendarRequestDto.kt
│ │ │ ├── CalendarResponseDto.kt
│ │ │ ├── CalenderWithEvents.kt
│ │ │ └── UserDto.kt
│ │ ├── handlers/ # Business Logic Handler
│ │ │ ├── CalendarHandler.kt
│ │ │ ├── EventHandler.kt
│ │ │ └── UserHandler.kt
│ │ ├── database/ # Exposed Database Tabellen
│ │ │ └── tables/
│ │ ├── model/ # Domänenmodelle
│ │ │ └── serializers/
│ │ └── ical/ # iCal Parser
│ │ ├── IcalParser.kt
│ │ └── retrieveIcalFile.kt
│ ├── test/kotlin/ # Test Cases
│ │ ├── TestDatabase.kt
│ │ └── handlers/
│ └── resources/ # Konfigurationsdateien
│ ├── application.yaml
│ └── logback.xml
├── build.gradle.kts # Gradle Build Konfiguration
└── gradle/ # Gradle Wrapper

Modulbeschreibung

  • dtos/: Data Transfer Objects für die Kommunikation zwischen Frontend und Backend
  • handlers/: Geschäftslogik für Calendar, Event und User Operationen
  • database/: Exposed ORM Tabellendefinitionen
  • ical/: Parser für iCal/ics Dateien von Rapla Servern
  • model/: Domänenmodelle und Serializer für komplexe Datentypen

API Endpunkte

Auth

Register

POST: /api/auth/register: Erstellt einen neuen Benutzer

Payload:

{
"email": "test@example.com",
"password": "password"
}

Login

POST: /api/auth/login: Loggt einen Benutzer ein, gibt ein JWT Token zurück

Payload:

{
"email": "test@example.com",
"password": "password"
}

Search all Calendars

GET: /api/search?query=<query>: Durchsucht alle Kalender des Benutzers nach einem Term und gibt die passenden Events zurück

Response:

[
{
"uid": "<uid>",
"summary": "<summary>",
"location": "<location>",
"category": "<category>",
"start": "<start>",
"end": "<end>",
"calendarId": "<calendarId>"
}
]

Get search history

GET: /api/search/history: Gibt die Suchhistorie des Benutzers zurück

Response:

[
{
"query": "<query>",
"createdAt": "<createdAt>"
}
]

Calendar

Add new Calendar

POST: /api/calendars/add: Fügt einen neuen Kalender hinzu

Payload:

{
"url": "<url>",
"name": "<name>",
"color": "<color>"
}

Response:

{
"id": "<id>",
"name": "<name>",
"color": "<color>",
"url": "<url>"
}

Get all Calendars

GET: /api/calendars: Gibt alle Kalender (url, name, color) des Benutzers zurück

Response:

[
{
"id": "<id>",
"name": "<name>",
"color": "<color>",
"url": "<url>"
}
]

Update a specific Calendar

PUT: /api/calendars/<id>: Aktualisiert einen bestimmten Kalender des Benutzers

Payload:

{
"name": "<name>",
"url": "<url>",
"color": "<color>"
}

Response:

{
"id": "<id>",
"name": "<name>",
"color": "<color>",
"url": "<url>"
}

Delete a specific Calendar

DELETE: /api/calendars/<id>: Löscht einen bestimmten Kalender des Benutzers

Get all Events of a specific Calendar

GET: /api/calendars/<id>/events: Gibt die Events eines bestimmten Kalenders des Benutzers zurück.

Response:

[
{
"uid": "<uid>",
"summary": "<summary>",
"location": "<location>",
"category": "<category>",
"start": "<start>",
"end": "<end>"
}
]