Votingplattformen
Die Votingplattformen umfassen:
- Die Vita
- Koepfe des Jahres
- Skiawards
Genereller Ablauf
Das Grundprinzip eines Votings ist auf allen Plattformen das selbe. Lediglich die genutzte API ist bei der Vita-Plattform noch in PHP, während die anderen beiden die SMDCMS nutzen.
Grundvoraussetzungen:
- Umkompliziert für den Nutzer
- Eine Stimme alle 24 Stunden pro Nutzer und Kategorie
- So wenig persönliche Daten wie möglich
Auf der Plattform findet sich eine Liste an Kandidaten, die im Normalfall auch gefiltert werden können. Der Nutzer kann nun für einen Kandidaten abstimmen und wird vom Frontend dazu aufgefordert seine E-Mail-Adresse anzugeben. Anhand dieser wird dann ein Key generiert, der in der Datenbank hinterlegt wird. Gleichsam bekommt der Nutzer eine E-Mail mit einem Link, der ihn auf die Seite zurückführt und die Stimme bestätigt.
Solange die Stimme nicht mit dem Link bestätigt wird, kann er theoretisch auch noch seine Meinung ändern in dem er schlich bei einem anderen Kanditaten seine Stimme abgibt.
Im Normalfall gibt es für jede Abstimmung einen festen Zeitrahmen un dem abgestimmt werden kann, im Frontend und um der API sind die jeweiligen Zeitpunkte hinterlegt. Das Frontend zeigt ausserhalb der Votingzeiten eine entsprechende Meldung an, dass das Voting noch nicht begonnen hat oder bereits beendet ist.
Container
In den Repos besteht jede Plattform aus 3 Projekten/Unterordnern:
- api -> Die jeweilige API
- client -> Das Frontend
- container -> Der SSR-Container
Sveltekit funktioniert am besten wenn man es in Kombination mit Server-Side-Rendering benutzt. Theoretisch kann man beim Build auch eine statische Seite generieren, hat dann aber viele Einschränkungen und Probleme die via SSR direkt gelöst sind. Deshalb gibt es eine schmale Container-App, welche den Output des Build-Prozesses von Sveltekit rendert und ausliefert.
import polka from 'polka';
import { handler } from './build/handler.js';
const port = process.env.NODE_PORT || 4600;
const app = polka();
app.use(handler);
app.listen(port, () => {
console.log(`> Running on ${port}`);
});
Die Vita
API: PHP
Frontend: Sveltekit
Die Dateneintragung wird hier manuell gemacht und einfach die jeweiligen Einträge in der Tabelle participants
hinterlegt.
Die Sperre der Abstimmung passiert über eine Datumsabfrage und ein die().
Koepfe des Jahres & Skiawards
API: SMDCMS
Frontend: Sveltekit
Hier gibt es einen eigenen Adminbereich über den die jeweiligen Redakteure oder Zuständigen die Kandidaten eintragen können. Zudem werden hier via Web-Sockets Locks auf die Einträge gesetzt, sodass nicht mehrere Personen gleichzeitig an einem Eintrag arbeiten können. Bei Bedarf kann jemand aber auch einen Lock ignorieren, indem er auf den Beitrag klickt und den Lock entfernt.
Das System nutzt das Session/Auth
-Schema wie in der API-Doku beschrieben.
Im der Votes-View (src/views/votes.ts), findet sich in der post-Funktion die Logik für das Ende des Votings. Entweder werden wird dafür die Umgebungsvariable ENDING
genommen oder ein Standart-Datum.
// src/views/votes.ts
export const post = async function (req: http.IncomingMessage, res: http.ServerResponse, flowspace: Flowspace) {
if (Date.now() > Date.parse(process.env.ENDING || '3.1.2024 00:01:00')) {
res.statusCode = 404;
return;
}