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.

Mehr Infos

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;
  }