\newcommand{\newrequirementlist}[1]{
    % https://www.overleaf.com/learn/latex/Lists#Creating_a_new_list_with_enumitem
    \newlist{#1list}{enumerate}{1}
    \setlist[#1list, 1]
    {
        before=\leavevmode,
        label=\upshape\textlangle #1\arabic*\textrangle,
        ref=\upshape\textlangle #1\arabic*\textrangle,
        resume=#1list
    }
}

\newrequirementlist{RM}
\newrequirementlist{RS}
\newrequirementlist{RC}
\newrequirementlist{RW}

\section{Anforderungsanalyse}

\subsection{ Musskriterien }\label{r:musskriterien}

Musskriterien: unabdingbare Leistungen der Software.

\subsubsection*{ Funktionale Anforderungen }

\begin{RMlist}
    \item\label{r:login} Der Benutzer kann sich im Webfrontend mit einer
    E-Mail-Adresse und einem Pass\-wort erstmalig registrieren und bei
    abgeschlossener Registrierung fortan mit denselben Informationen
    anmelden.
    Für eine erfolgreiche Registrierung muss die angegebene
    E-Mail-Adresse zuerst verifiziert werden.\\
    \item\label{r:store} Die Liste der \Glspl{abo} eines Benutzers sowie
    der zeitliche Fortschritt beim Anhören(/Ansehen) von jeder begonnen
    \Gls{episode} werden für jeden Benutzer gespeichert.
    \item\label{r:sync} Die Liste der \Glspl{abo} eines Benutzers
    sowie der zeitliche Fortschritt beim Anhören(/Ansehen) von jeder
    begonnenen \Gls{episode} wird automatisch über alle von einem Benutzer
    verknüpften \Gls{podcatcher} aktualisiert.
    Dabei sind der zu synchronisierende Stand der \Glspl{abo} und der
    zeitliche Fortschritt jeweils definiert als derjenige Stand, der
    zeitlich am kürzesten zurückliegt.\\
    \item\label{r:ui} Das Webfrontend bietet dem Benutzer eine graphische
    Benutzeroberfläche zur Navigation und zur Ansteuerung einzelner
    Funktionalitäten.\\
    \item\label{r:reset-pw} Der Benutzer kann sein Passwort ändern und es
    gibt eine ,,Passwort vergessen''-Funktion.
    So kann ein angemeldeter Benutzer sein Passwort direkt im Webfrontend
    ändern.
    Im nicht angemeldeten Zustand kann der Benutzer sein Passwort über
    die registrierte E-Mail-Adresse zurücksetzen.\\
    \item\label{r:show-podcasts} Das Webfrontend bietet dem Benutzer die
    Möglichkeit, sich die Liste seiner \Glspl{abo} anzeigen zu
    lassen.
    Die dabei dargestellten Informationen beinhalten den Namen des
    \Glspl{abo} und eine gerundete Angabe darüber, wie lange es her ist,
    dass der Benutzer das letzte Mal eine \Gls{episode} dieses \Glspl{abo}
    konsumiert hat.\\
\end{RMlist}

\subsubsection*{ Nicht-funktionale Anforderungen }

\begin{RMlist}
    \item\label{r:requests} Der Synchronisations-Server kann mindestens
    50 Anfragen pro Sekunde verarbeiten.\\
    \item\label{r:desktop-first} Das Webfrontend ist primär für
    Desktop-Benutzer ausgelegt.
    \item\label{r:gpodder} Der Datenaustausch erfolgt über die Gpodder
    \Gls{rest-api} unter Verwendung des Datenformats \Gls{json}.
    \item\label{r:persistent-storage} Die Speicherung der Daten eines
    Benutzers \ref{r:store} über den Synchronisations-Server erfolgt
    persistent in einer \Gls{db}. Diese Daten des Benutzers sind die
    Liste seiner \Glspl{abo} und der zeitliche Fortschritt beim Anhören
    (/Ansehen) aller begonnenen \Glspl{episode}.
    \item\label{r:api-extension} Die \Gls{gpodder} wird um Funktionalitäten
    zur verbesserten Kommunikation zwischen Front- und Backend erweitert
    (siehe \ref{r:login}).\\
\end{RMlist}


\subsection{ Sollkriterien }\label{r:sollkriterien}

Sollkriterien: erstrebenswerte Leistungen.

\subsubsection*{ Funktionale Anforderungen }

\begin{RSlist}
    \item\label{r:man} Das Webfrontend bietet die Möglichkeit eine nicht
    ausgefüllte Benutzeranleitung für das Synchronisieren von \Glspl{podcast}
    anzuzeigen.\\
    \item\label{r:delete-acc} Der Benutzer kann seinen Account löschen.
    Daraufhin werden alle auf diesen Benutzer bezogenen Daten gelöscht.\\
\end{RSlist}

\subsubsection*{ Nicht-funktionale Anforderungen }

\begin{RSlist}
    \item\label{r:backend-libs} Das Backend wird in \Gls{java} unter Verwendung des
    quelloffenen Frameworks \Gls{spring} implementiert. Weiter wird für die
    \Gls{db} das relationale Open-Source Datenbankverwaltungssystem MariaDB
    eingesetzt.
    \item\label{r:ui-libs} Die Weboberfläche wird mithilfe der
    \Gls{ui-lib} React oder des Webframeworks Vue in JavaScript und
    mit dem Frontend-CSS-Framework Bootstrap entwickelt.
    \item\label{r:ui-source}
    Verwendete \Glspl{ui-lib} werden von einem \Gls{packagemanager}, wie dem Node
    Package Manager (npm) bezogen. Ein \Gls{bundler}, wie vite oder Webpack,
    stellt ein minimiertes Skript von den Teilen der Bibliotheken zusammen,
    die vom Code verwendet werden. Das minimierte Skript wird dann auf einem
    eigenen Server für die Weboberfläche bereitgestellt.
    \item\label{r:spa} Die Weboberfläche wird als \Gls{spa}
    entworfen und aktualisiert dynamisch ihren Inhalt, sobald es eine
    Antwort auf eine Anfrage an die \Gls{gpodder} \ref{r:api-compat} erhält.
    \item\label{r:parse-metadata} Das Backend kann die Metadaten von
    \Gls{podcast} aus
    deren \Gls{rss}-Feeds (XML-Dateien) für die Anzeige im Webfrontend
    \ref{r:show-podcasts} parsen.
    \item\label{r:pw-requirements} Verwendete Passwörter müssen mindestens 8 Zeichen,
    ein Sonderzeichen, eine Zahl sowie einen Klein- und einen Großbuchstaben
    enthalten.
    Diese Anforderungen gelten also insbesondere für über die Funktionen
    \ref{r:login} und \ref{r:reset-pw} neu gewählte Passwörter.\\
    \item\label{r:save-pw} Passwörter werden sicher mittels \Gls{salt-hash}
    gespeichert.
    \item\label{r:session} Im Webfrontend angemeldete Benutzer bleiben dort
    angemeldet. Hierfür wird eine Kombination aus einem \Gls{session-token} und
    einem \Gls{cookie} verwendet.\\
\end{RSlist}

\subsection{ Kannkriterien }

Kannkriterien: Leistungen, die enthalten sein können.

\subsubsection*{ Funktionale Anforderungen }

\begin{RClist}
    \item\label{r:subscribe} Ein Benutzer kann über die Weboberfläche einen
    abonnierten \Gls{podcast} über einen generierten Link teilen.
    Öffnet nun ein anderer Nutzer den Link wird dieser zur Weboberfläche
    weitergeleitet und mit einem Pop-up gefragt, ob dieser den
    \Gls{podcast} abonnieren
    möchte, falls noch nicht geschehen.
    Akzeptiert der Nutzer, so wird der \Gls{podcast} zur Liste der
    \Glspl{abo} des
    Nutzers hinzugefügt.
    Gegebenenfalls muss sich der Benutzer dafür zuerst anmelden.
    Der Link setzt sich dabei unter anderem aus der URL des Webfrontends oder
    einem \Gls{pseudoprotocol} und dem \Gls{podcast}-Link des Providers zusammen.
    \item\label{r:unsubscribe} Das Webfrontend bietet dem Benutzer die Möglichkeit,
    \Glspl{abo} zu entfernen beziehungsweise \Glspl{podcast} zu deabonnieren.
    \item\label{r:import} Das Importieren und Exportieren aller benutzerbezogenen
    Daten wird unterstützt (siehe \ref{r:dsgvo}).
    \item\label{r:import-other} Das Umsiedeln von anderen \Gls{gpodder}-Plattformen und
    damit insbesondere der damit verbundene Datenimport wird unterstützt.
    \item\label{r:api-compat} Die Weboberfläche ist kompatibel mit beliebigen
    \Glspl{gpodder}.
    \item\label{r:responsive} Die Weboberfläche ist \gls{responsive}.
    \item\label{r:admin} Es gibt Administrator Benutzerkonten. Eine angestrebte
    Funktionalität dieser privilegierten Konten ist das Einsehen von Statistiken,
    wie der Anzahl von Benutzern, und dem Abruf der Metadaten eines
    \Glspl{abo}.
\end{RClist}

\subsubsection*{ Nicht-funktionale Anforderungen }

\begin{RClist}
    \item\label{r:login-provider} Die Anmeldung im Webfrontend kann mit dem
    offenen Protokoll \Gls{oauth} 2.0 über Google, Apple oder Facebook erfolgen.
    Die bei der Verknüpfung eines \Gls{podcatcher}s mit dem Synchronisationsserver
    geforderten Anmeldedaten werden dann automatisch für den betreffenden
    Benutzer generiert.
    Diese kann er im Webfrontend einsehen.
    \item\label{r:live-update} Im Webfrontend angemeldete Benutzer bleiben dort
    angemeldet, wenn das Backend ein Update bekommt.
    \item\label{r:language} Die Benutzeroberfläche kann in mehreren Sprachen
    angezeigt werden, wobei neben der standardmäßig deutschen
    Benutzeroberfläche die zusätzliche Bereitstellung einer englischen
    Version gegenüber anderen Fremdsprachen priorisiert angestrebt wird.
    \item\label{r:dsgvo} Der Umgang mit personenbezogenen Daten ist konform mit
    der \\\Gls{dsgvo} der Europäischen Union.
    \item\label{r:docker} Die Benutzung von \Gls{docker} vereinfacht das Deployment auf
    einen Server, da Abhängigkeiten bereits im \Gls{docker}-Image enthalten sind.
    Außerdem bleibt bei einer Kompromittierung der Software das Host-System
    durch Virtualisierung der Container sicher.\\
\end{RClist}
