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