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
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>"
}
]