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