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

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.\\
        \emph{Tests: \ref{t:register}, \ref{t:login}}
    \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}n 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.\\
        \emph{Tests: \ref{t:sync-sub}, \ref{t:sync-unsub}, \ref{t:sync-episode}}
    \item\label{r:ui} Das Webfrontend bietet dem Benutzer eine graphische
        Benutzeroberfläche zur Navigation und zur Ansteuerung einzelner 
        Funktionalitäten.\\
        \emph{Implizit durch alle Testfälle geprüft.}
	\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.\\
        \emph{Tests: \ref{t:change-pw}, \ref{t:forgot-pw}}
    \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.\\
        \emph{Tests: \ref{t:sync-sub}, \ref{t:sync-unsub}}
\end{RMlist}

\subsubsection*{ Nicht-funktionale Anforderungen }

\begin{RMlist}
    \item\label{r:requests} Der Synchronisations-Server kann mindestens 
        50 Anfragen pro Sekunde verarbeiten.\\
        \emph{Test: \ref{t:lasttest}}
    \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 }

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 (Abbildung \ref{fig:help-desktop}).\\
        \emph{Test: \ref{t:man}}
    \item\label{r:delete-acc} Der Benutzer kann seinen Account löschen. 
        Daraufhin werden alle auf diesen Benutzer bezogenen Daten gelöscht.\\
        \emph{Test: \ref{t:delete-acc}}
\end{RSlist}

\subsubsection*{ Nicht-funktionale Anforderungen }

\begin{RSlist}
\item\label{r:backend-libs} Das Backend wird in \Gls{java} unter Verwendung des
        quelloffenen Frameworks 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.\\
        \emph{Test: \ref{t:pw-req}}
    \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 ein \Gls{session-token} in einem \Gls{cookie} gespeichert.\\
\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 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}

\subsection{ Abgrenzungskriterien }

Abgrenzungskriterien: Leistungen, die explizit nicht umgesetzt werden.

\begin{RWlist}
    \item\label{r:playback} Das Webfrontend stellt explizit keine Funktionalität
        zum Anhören von \Glspl{podcast} bereit und grenzt sich unter anderem dadurch
        von \Gls{podcatcher}-Software ab.
    \item\label{r:no-logs} Es werden explizit keine Logdateien für Benutzer-Aktionen
        gespeichert. Stattdessen wird nur genau die Liste der \Glspl{abo} eines 
                Benutzers und der zeitliche Fortschritt jeder \Gls{episode} aktuell gehalten.
   	\item\label{r:no-devices} Die benutzerdefinierte Synchronisation über 
   		verschiedene, für die Synchronisation differenzierte Geräte wird nicht 
        unterstützt. 
   		Das heißt, die gespeicherten Daten eines Benutzers werden über alle 
                mit seinem Account verbundenen \Gls{podcatcher} unabhängig vom Gerät auf den 
        gleichen, letzten Stand synchronisiert.
    \item\label{r:discovery} Das Webfrontend bietet keine Funktionalität zum
        Suchen von \Glspl{podcast} (\Gls{discovery}) an.
    \item\label{r:no-man} Im Webfrontend wird lediglich die Möglichkeit geboten,
        eine zunächst leere Benutzeranleitung \ref{r:man} anzuzeigen. Eine
        inhaltlich vollständig ausgeschriebene Benutzeranleitung wird
        ausdrücklich nicht bereitgestellt.
\end{RWlist}

