From 7fcdc1c788725f866de71fc9dfd8c4d1cb132b57 Mon Sep 17 00:00:00 2001 From: Orangerot Date: Fri, 24 May 2024 17:42:08 +0200 Subject: Initial commit --- 11-entwurfsheft-kolloquium/.gitignore | 302 +++++++ 11-entwurfsheft-kolloquium/.gitlab-ci.yml | 36 + 11-entwurfsheft-kolloquium/CHANGELOG.md | 34 + 11-entwurfsheft-kolloquium/Makefile | 18 + 11-entwurfsheft-kolloquium/README.md | 118 +++ 11-entwurfsheft-kolloquium/assets/.gitignore | 3 + 11-entwurfsheft-kolloquium/assets/.gitingnore | 3 + .../assets/KIT_Deckblatt.pdf | Bin 0 -> 11836 bytes .../assets/diagrams/backendComponentDiagram.puml | 61 ++ .../diagrams/classdiagram-authentication.puml | 112 +++ .../diagrams/classdiagram-episode-actions.puml | 84 ++ .../assets/diagrams/classdiagram-model.puml | 109 +++ .../diagrams/classdiagram-subscriptions.puml | 75 ++ .../assets/diagrams/classdiagram-util.puml | 43 + .../assets/diagrams/classdiagram.puml | 68 ++ .../assets/diagrams/componentdiagram.puml | 53 ++ 11-entwurfsheft-kolloquium/assets/diagrams/db.puml | 78 ++ .../assets/diagrams/deployment.puml | 59 ++ .../diagrams/sequencediagram-forgotAndResetPW.puml | 41 + .../sequencediagram-getEpisodeActions.puml | 38 + ...ncediagram-getEpisodeActionsOfPodcastSince.puml | 32 + .../diagrams/sequencediagram-getSubscriptions.puml | 36 + .../assets/diagrams/sequencediagram-register.puml | 26 + .../sequencediagram-uploadEpisodeActions.puml | 38 + .../sequencediagram-uploadSubscriptions.puml | 32 + 11-entwurfsheft-kolloquium/assets/episode.png | Bin 0 -> 10778 bytes 11-entwurfsheft-kolloquium/assets/help.png | Bin 0 -> 14423 bytes 11-entwurfsheft-kolloquium/assets/lastupdate.png | Bin 0 -> 9363 bytes 11-entwurfsheft-kolloquium/assets/logo.pdf | Bin 0 -> 11797 bytes 11-entwurfsheft-kolloquium/assets/logo.svg | 211 +++++ 11-entwurfsheft-kolloquium/assets/navbar.png | Bin 0 -> 8940 bytes .../assets/password-margin.png | Bin 0 -> 8701 bytes 11-entwurfsheft-kolloquium/assets/password.png | Bin 0 -> 8781 bytes 11-entwurfsheft-kolloquium/assets/subscription.png | Bin 0 -> 79929 bytes .../logos/banner_2020_kit.jpg | Bin 0 -> 96829 bytes 11-entwurfsheft-kolloquium/notizen | 40 + 11-entwurfsheft-kolloquium/presentation.tex | 52 ++ 11-entwurfsheft-kolloquium/presentation.tex.orig | 68 ++ 11-entwurfsheft-kolloquium/sdqbeamer.cls | 975 +++++++++++++++++++++ 11-entwurfsheft-kolloquium/slides/apiExtension.tex | 39 + 11-entwurfsheft-kolloquium/slides/architecture.tex | 7 + 11-entwurfsheft-kolloquium/slides/changes.tex | 22 + 11-entwurfsheft-kolloquium/slides/classdiagram.tex | 57 ++ 11-entwurfsheft-kolloquium/slides/frontend.tex | 21 + 11-entwurfsheft-kolloquium/slides/pattern.tex | 26 + 11-entwurfsheft-kolloquium/slides/sequence.tex | 7 + 46 files changed, 3024 insertions(+) create mode 100644 11-entwurfsheft-kolloquium/.gitignore create mode 100644 11-entwurfsheft-kolloquium/.gitlab-ci.yml create mode 100644 11-entwurfsheft-kolloquium/CHANGELOG.md create mode 100644 11-entwurfsheft-kolloquium/Makefile create mode 100644 11-entwurfsheft-kolloquium/README.md create mode 100644 11-entwurfsheft-kolloquium/assets/.gitignore create mode 100644 11-entwurfsheft-kolloquium/assets/.gitingnore create mode 100644 11-entwurfsheft-kolloquium/assets/KIT_Deckblatt.pdf create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/backendComponentDiagram.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-authentication.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-episode-actions.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-model.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-subscriptions.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-util.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/classdiagram.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/componentdiagram.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/db.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/deployment.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-forgotAndResetPW.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getEpisodeActions.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getEpisodeActionsOfPodcastSince.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getSubscriptions.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-register.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-uploadEpisodeActions.puml create mode 100644 11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-uploadSubscriptions.puml create mode 100644 11-entwurfsheft-kolloquium/assets/episode.png create mode 100644 11-entwurfsheft-kolloquium/assets/help.png create mode 100644 11-entwurfsheft-kolloquium/assets/lastupdate.png create mode 100644 11-entwurfsheft-kolloquium/assets/logo.pdf create mode 100644 11-entwurfsheft-kolloquium/assets/logo.svg create mode 100644 11-entwurfsheft-kolloquium/assets/navbar.png create mode 100644 11-entwurfsheft-kolloquium/assets/password-margin.png create mode 100644 11-entwurfsheft-kolloquium/assets/password.png create mode 100644 11-entwurfsheft-kolloquium/assets/subscription.png create mode 100644 11-entwurfsheft-kolloquium/logos/banner_2020_kit.jpg create mode 100644 11-entwurfsheft-kolloquium/notizen create mode 100644 11-entwurfsheft-kolloquium/presentation.tex create mode 100644 11-entwurfsheft-kolloquium/presentation.tex.orig create mode 100644 11-entwurfsheft-kolloquium/sdqbeamer.cls create mode 100644 11-entwurfsheft-kolloquium/slides/apiExtension.tex create mode 100644 11-entwurfsheft-kolloquium/slides/architecture.tex create mode 100644 11-entwurfsheft-kolloquium/slides/changes.tex create mode 100644 11-entwurfsheft-kolloquium/slides/classdiagram.tex create mode 100644 11-entwurfsheft-kolloquium/slides/frontend.tex create mode 100644 11-entwurfsheft-kolloquium/slides/pattern.tex create mode 100644 11-entwurfsheft-kolloquium/slides/sequence.tex (limited to '11-entwurfsheft-kolloquium') diff --git a/11-entwurfsheft-kolloquium/.gitignore b/11-entwurfsheft-kolloquium/.gitignore new file mode 100644 index 0000000..87ec682 --- /dev/null +++ b/11-entwurfsheft-kolloquium/.gitignore @@ -0,0 +1,302 @@ +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +*.pdf +!assets/*.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs +*.lzo +*.lzs +*.slg +*.slo +*.sls + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +*.ist + +# gnuplot +*.gnuplot +*.table + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.glog +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files +# *.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# newpax +*.newpax + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# svg +svg-inkscape/ + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# titletoc +*.ptc + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz + +# xwatermark package +*.xwm + +# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib +# option is specified. Footnotes are the stored in a file with suffix Notes.bib. +# Uncomment the next line to have this generated file ignored. +#*Notes.bib diff --git a/11-entwurfsheft-kolloquium/.gitlab-ci.yml b/11-entwurfsheft-kolloquium/.gitlab-ci.yml new file mode 100644 index 0000000..27d0617 --- /dev/null +++ b/11-entwurfsheft-kolloquium/.gitlab-ci.yml @@ -0,0 +1,36 @@ +plantuml: + stage: .pre + image: + name: plantuml/plantuml + entrypoint: [""] + script: + - java -jar plantuml.jar -tpdf assets/diagrams/*.puml + artifacts: + paths: + - assets + +tex: + stage: build + image: texlive/texlive + script: + - mkdir public + - make tex + - mv *.pdf public + artifacts: + paths: + - public + dependencies: + - plantuml + +pages: + stage: deploy + script: + - echo Hello, World! + artifacts: + paths: + - public + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + dependencies: + - tex + diff --git a/11-entwurfsheft-kolloquium/CHANGELOG.md b/11-entwurfsheft-kolloquium/CHANGELOG.md new file mode 100644 index 0000000..7671a41 --- /dev/null +++ b/11-entwurfsheft-kolloquium/CHANGELOG.md @@ -0,0 +1,34 @@ +# Changelog +Alle Änderungen an diesem Projekt werden in dieser Datei dokumentiert. +Die Versionsnummern folgt der Syntax in `sdqbeamer.cls`. + +## [2022-05-03 v3.1.3] +- Die Breite des Gruppennamens in der Fußzeile kann nun über `\groupnamewidth{}` gesteuert werden +- FIX: zweizeilige Fußzeilen haben nun gleichmäßigen vertikalen Abstand (Issue #16 in Gitlab) + +## [2021-08-10 v3.1.2] +- FIX: framesubtitle wird nun angezeigt (Issue #6 in Gitlab) + +## [2020-12-08 v3.1.1] +- FIX: Titelbild (Issue #4 in Gitlab) + +## [2020-12-07 v3.1] +- Umgebung ``contentblock`` (farbloser Block mit fetter Überschrift) hinzugefügt +- Farbboxen (``greenblock``, ``blueblock``, …) hinzugefügt +- Abstufungen der KIT-Farben in 10er-Schritten entsprechend der Gestaltungsrichtlinien eingeführt +- FIX: Navigationspunkte für Subsections in eine Zeile gesetzt, um vertikal Platz zu sparen +- FIX: ``inputenc`` an den Anfang von ``sdqbeamer.cls`` verschoben + +## [2020-11-16 v3.0] +- Seitenformat 16:10 hinzugefügt +- Umstellung auf KIT-Design vom 1. August 2020 + - Anpassung auf neues Farbschema und Maße + - neues Titelbild aus der KIT-Bildwelt +- Neue Optionen: + - durch `smallfoot` und `bigfoot` kann die Schriftgröße der Fußzeile gesteuert werden + - durch `navbarkit` kann eine Fußzeile nach KIT-Vorgaben erzwungen werden +- Deutsch (`de`) ist nun die Standard-Option +- Ordner `templates` wurde gelöscht und die Inhalte in `sdqbeamer.cls` integriert +- Globale Größe auf 10 pt verringert (vorher: 11 pt), da der beschreibbare Bereich im Vergleich zur 2009er Version kleiner geworden ist +- SDQ-spezifische Logos und Titelbilder entfernt. Diese sind ab sofort im Branch »sdq« verfügbar. +- Fix: Zeilenumbruch bei Titel in der Fußzeile repariert \ No newline at end of file diff --git a/11-entwurfsheft-kolloquium/Makefile b/11-entwurfsheft-kolloquium/Makefile new file mode 100644 index 0000000..67f5384 --- /dev/null +++ b/11-entwurfsheft-kolloquium/Makefile @@ -0,0 +1,18 @@ +MAIN = presentation +FLAGS = -pdf + +all: clean compile +compile: diagram tex +clean: clean-diagram clean-tex + +dev: + latexmk $(FLAGS) -pvc $(MAIN) +tex: + latexmk $(FLAGS) $(MAIN) +diagram: + java -jar plantuml.jar -tpdf assets/diagrams/*.puml +clean-tex: + latexmk -C +clean-diagram: + find assets/diagrams -type f -not -name '*.puml' -delete + diff --git a/11-entwurfsheft-kolloquium/README.md b/11-entwurfsheft-kolloquium/README.md new file mode 100644 index 0000000..6a5e9ea --- /dev/null +++ b/11-entwurfsheft-kolloquium/README.md @@ -0,0 +1,118 @@ +LaTeX-Vorlage für Präsentationen +================================ + +Das vorliegende Paket dient als Vorlage für Präsentationen im [Corporate Design des KIT](https://intranet.kit.edu/gestaltungsrichtlinien.php) (Fassung vom 1. August 2020). + +Es wird an der Forschungsgruppe [DSiS](https://dsis.kastel.kit.edu) an der KIT-Fakultät für Informatik entwickelt und basiert auf [LaTeX Beamer](https://ctan.org/pkg/beamer). + +Autor: [Dr.-Ing. Erik Burger](https://dsis.kastel.kit.edu/staff_erik_burger.php) +mit Beiträgen von Christian Hammer, Klaus Krogmann und Maximilian Schambach + +Siehe https://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen + +Hinweise, Verbesserungsvorschläge +================================= + +Bitte verwenden Sie das [Issue-Tracking-System von Gitlab](https://git.scc.kit.edu/i43/dokumentvorlagen/praesentationen/beamer/-/issues), um auf Probleme mit der Vorlage hinzuweisen oder Erweiterungswünsche zu äußern. Sie können gerne auch eine Änderung per Merge-Request vorschlagen. + +Verwendung +========== + +Optionen der Dokumentklasse `sdqbeamer` +----------------------------------------- +Durch die folgenden Optionen kann das Seitenverhältnis der Folien bestimmt werden: + +| Seitenverhältnis | Option | +| ---------------- | ------------------- | +| 16:9 | `16:9` (Standard) | +| 16:10 | `16:10` | +| 4:3 | `4:3` | + +Die Schriftgröße in der Fußzeile ist standardmäßig größer gewählt, als in den Gestaltungsrichtlinien vorgegeben. Diese Vorgabe kann durch die Option `smallfoot` erzwungen werden. + +| Schriftgröße Fußzeile | Option | +| ----------------------| -------------------- | +| etwas größer (12pt) | `bigfoot` (Standard) | +| KIT-Vorgabe (9pt) | `smallfoot` | + +Die Plazierung der Navigationsleiste kann durch folgende Optionen beeinflußt werden: + +| Position | Option | Bemerkung | +| ------------------------ | ---------------- | ------------------------------------------ | +| oberhalb der Trennlinie | `navbarinline` | Standard | +| unterhalb der Trennlinie | `navbarinfooter` | keine Subsection-Punkte, Größe `smallfoot` | +| Seitenleiste links | `navbarside` | keine Subsection-Punkte | +| keine Navigationsleiste | `navbaroff` | | +| KIT-Vorgabe | `navbarkit` | entspricht `navbaroff` und `smallfoot` | + +Als Sprache sind Deutsch und Englisch verfügbar. Durch die Sprachwahl werden automatisch die passenden Logos und Formate (z.B. Datum) gewählt. + +| Sprache | | +| -------- |---------------- | +| Deutsch | `de` (Standard) | +| Englisch | `en` | + +Beispiel: `\documentclass[de,16:9,navbarinline]{sdqbeamer}` + +Titelbild +--------- + +Das Bild auf der Titelfolie kann mit dem Befehl + +`\titleimage{myimage}` (ohne Dateiendung) + +gesetzt werden. Um ein eigenes Bild zu verwenden, bitte die Datei (z.B. `myimage.jpg`) ins `logos/`-Verzeichnis legen und den Befehl anpassen. Mitgeliefert wird ein generisches Bild aus der KIT-Bildwelt (https://intranet.kit.edu/gestaltungsrichtlinien.php) in der Datei `logos/banner_2020_kit.jpg`. Falls kein Titelbild eingefügt werden soll, bitte `\titleimage{}` setzen. + +Für 16:9-Folien sollte das Verhältnis des Bildes 160:37 betragen, für 4:3-Folien 63:20. Es können auch breitere Bilder verwendet werden, da das Titelbild auf die Höhe des Rahmens skaliert und zentriert wird. + +Logo und Name Abteilung/KIT-Fakultät/Institut +--------------------------------------------- + +Das Logo rechts oben auf der Titelfolie kann mit dem folgenden Befehl gesetzt werden: + +`\grouplogo{mylogo}` (ohne Dateiendung) + +Um ein eigenes Logo zu verwenden, bitte die Datei (z.B. `mylogo.pdf`) in das Verzeichnis `logos/` legen und den Befehl anpassen. Falls kein Logo eingefügt werden soll, bitte `\grouplogo{}` setzen. + +Der Gruppenname kann mit folgendem Befehl gesetzt werden: + +`\groupname{Software Design and Quality}` + +Der Gruppenname erscheint in der Fußzeile rechts unten. Lange Namen werden in zwei Zeilen umgebrochen. Falls der Gruppenname leer gelassen wird (`\groupname{}`), wird die volle Breite der Fußzeile für Autornamen und Titel verwendet. + +Die Standardbreite des Gruppennamens sind 50 mm. Sie kann mit + +`\groupnamewidth{80mm}` + +verändert werden, wodurch sich auch die Breite des Textfeldes mit Autor und Titel entsprechend ändert. Umbrüche sind mit `\\` möglich. Statt zweizeiliger Fußzeilen empfiehlt sich eventuell die Option `smallfoot`. + +LaTeX allgemein +--------------- +Siehe https://sdqweb.ipd.kit.edu/wiki/LaTeX + +Dateistruktur +============ +`presentation.tex` +------------------ +Hauptdatei des LaTeX-Dokuments. + +`presentation.bib` +------------- +Beispieldatei für BibTeX-Referenzen +https://sdqweb.ipd.kit.edu/wiki/BibTeX-Literaturlisten + +`sdqbeamer.cls` +----------------- +Dokumentklasse für Präsentationen im KIT-Design. + +`logos/` +-------- +In diesem Verzeichnis befinden das KIT-Logo als PDF sowie das Hintergrundbild der Titelfolie als JPG. + +`CHANGELOG.md` +-------------- +Dokumentation der Änderungen in den jeweiligen Versionen. + +`README.md` +----------- +Dieser Text. diff --git a/11-entwurfsheft-kolloquium/assets/.gitignore b/11-entwurfsheft-kolloquium/assets/.gitignore new file mode 100644 index 0000000..16252a4 --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/.gitignore @@ -0,0 +1,3 @@ +diagrams/* +!diagrams/*.puml + diff --git a/11-entwurfsheft-kolloquium/assets/.gitingnore b/11-entwurfsheft-kolloquium/assets/.gitingnore new file mode 100644 index 0000000..16252a4 --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/.gitingnore @@ -0,0 +1,3 @@ +diagrams/* +!diagrams/*.puml + diff --git a/11-entwurfsheft-kolloquium/assets/KIT_Deckblatt.pdf b/11-entwurfsheft-kolloquium/assets/KIT_Deckblatt.pdf new file mode 100644 index 0000000..7de8ed4 Binary files /dev/null and b/11-entwurfsheft-kolloquium/assets/KIT_Deckblatt.pdf differ diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/backendComponentDiagram.puml b/11-entwurfsheft-kolloquium/assets/diagrams/backendComponentDiagram.puml new file mode 100644 index 0000000..806522c --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/backendComponentDiagram.puml @@ -0,0 +1,61 @@ +@startuml +' skinparam linetype ortho + +'######################################################################### +'SubscriptionsAPI +component SubscriptionsAPI { + + component SubscriptionService + component SubscriptionController + component SubscriptionDataAccessLayer + + portout "Webserver" as wSub + portin "Database" as dSub + } + +dSub --0)- SubscriptionDataAccessLayer +SubscriptionDataAccessLayer --0)- SubscriptionService +SubscriptionService --0)- SubscriptionController +SubscriptionController --0)- wSub + +'######################################################################### + + +'######################################################################### +'EpisodeActionsAPI + +component EpisodeActionsAPI { + component EpisodeActionService + component EpisodeActionController + component EpisodeActionDataAccessLayer + + portout "Webserver" as wEpisode + portin "Database" as dEpisode +} + +dEpisode --0)- EpisodeActionDataAccessLayer +EpisodeActionController --0)- wEpisode +EpisodeActionDataAccessLayer --0)- EpisodeActionService +EpisodeActionService --0)- EpisodeActionController + +'######################################################################### + + +'######################################################################### +'AuthenticationAPI + +component AuthenticationAPI { + component AuthenticationService + component AuthenticationController + component AuthenticationDataAccessLayer + + portout "Webserver" as wAuth + portin "Database" as dAuth +} + +dAuth --0)- AuthenticationDataAccessLayer +AuthenticationController --0)- wAuth +AuthenticationDataAccessLayer --0)- AuthenticationService +AuthenticationService --0)- AuthenticationController + +@enduml diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-authentication.puml b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-authentication.puml new file mode 100644 index 0000000..a2b3518 --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-authentication.puml @@ -0,0 +1,112 @@ +@startuml + +package authenticationAPI <> { + package authenticationDataAccessLayer <> { + ' interface AuthenticationDao { + ' String login(String username) + ' int logout(String username) + ' } + + ' class AuthenticationDataAccessService <<@Respository>> { + ' <> AuthenticationDataAccessService(JpaTemplate jpaTemplate) + ' String login(String username) + ' int logout(String username) + ' } + + interface UserDetailsManager { + void createUser(UserDetails userDetails) + void changePassword(String oldPassword, String newPassword) + void deleteUser(String username) + void updateUser(UserDetails user) + boolean userExists(String username) + } + note left + Aus org.springframework.security.provisioning + - liefert Methoden zum Erstellen neuer User + und zum Aktualisieren bestehender. + end note + + class JdbcUserDetailsManager <<@Repository>> { + <> JdbcUserDetailsManager(DataSource dataSource) + void createUser(UserDetails user) + void changePassword(String oldPassword, String newPassword) + void deleteUser(String username) + void updateUser(UserDetails user) + boolean userExists(String username) + } + note right + User Management Service aus dem Paket + org.springframework.security.provisioning + der CRUD Operationen für User bereitstellt. + Hier sind nur die relevanten Methoden modelliert. + end note + } + + package authenticationService <> { + class AuthenticationService <<@Service>> { + -- + <> AuthenticationService(UserDetailsManager userDetailsManager) + List verifyLogin(String username) + int logout(String username) + int forgotPassword(ForgotPasswordRequest forgotPasswordRequest) + .. via JdbcUserDetailsManager .. + int resetPassword(String username, RequestWithPassword requestWithPassword) + int registerUser(UserDetails user) + int changePassword(String username, ChangePasswordRequest changePasswordRequest) + int deleteUser(String username, RequestWithPassword requestWithPassword) + } + + class JavaMailSenderImpl {} + note left + Aus org.springframework.mail.javamail. + Implementierung des JavaMailSender Interfaces, + welches das MailSender Interface durch Unterstützung + von MIME Nachrichten erweitert. + Das MailSender Interface definiert dabei eine + Strategie zum Versenden einfacher Mails. + Unterstützt sowohl JavaMail MimeMessages und + Spring SimpleMailMessages. + end note + } + + package authenticationController <> { + class AuthenticationController <<@Controller>> { + <> AuthenticationController(AuthenticationService authenticationService) + ResponseEntity> verifyLogin(String username) + ResponseEntity logout(String username) + ResponseEntity forgotPassword(ForgotPasswordRequest forgotPasswordRequest) + ResponseEntity resetPassword(String username, RequestWithPassword requestWithPassword) + ResponseEntity registerUser(UserDetails user) + ResponseEntity changePassword(String username, ChangePasswordRequest changePasswordRequest) + ResponseEntity deleteUser(String username, RequestWithPassword requestWithPassword) + } + + class ChangePasswordRequest { + <> ChangePasswordRequest(String oldPassword, String newPassword) + String getOldPassword() + String getNewPassword() + } + + class ForgotPasswordRequest { + <> ForgotPasswordRequest(String email) + String getEmail() + } + + class RequestWithPassword { + <> ResetPasswordRequest(String password) + String getPassword() + } + } +} + +' User <.. AuthenticationDataAccessService: DB +' User <.. JdbcUserDetailsManager: DB +UserDetailsManager <.. AuthenticationService: <> +' AuthenticationDao <.. AuthenticationService: <> +AuthenticationService --o AuthenticationController +' AuthenticationDao <|. AuthenticationDataAccessService: <> +UserDetailsManager <|. JdbcUserDetailsManager: <> +JavaMailSenderImpl <. AuthenticationService: <> + +@enduml + diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-episode-actions.puml b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-episode-actions.puml new file mode 100644 index 0000000..7a4530e --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-episode-actions.puml @@ -0,0 +1,84 @@ +@startuml + +package episodeActionsAPI <> { + package episodeActionDataAccessLayer <> { + class EpisodeActionDataAccessService <<@Repository>> { + <> EpisodeActionDataAccessService (JpaTemplate jpaTemplate) + long addEpisodeActions(String username, List episodeActionPosts) + List getEpisodeActions(String username) + List getEpisodeActionsOfPodcast(String username, String podcastURL) + List getEpisodeActionsSince(String username, LocalDateTime since) + List getEpisodeActionsOfPodcastSince(String username, String podcastURL, LocalDateTime since) + } + + interface EpisodeActionDao { + long addEpisodeActions(String username, List episodeActionPosts) + List getEpisodeActions(String username) + List getEpisodeActionsOfPodcast(String username, String podcastURL) + List getEpisodeActionsSince(String username, LocalDateTime since) + List getEpisodeActionsOfPodcastSince(String username, String podcastURL, LocalDateTime since) + } + } + + package episodeActionService <> { + class EpisodeActionService <<@Service>> { + <> EpisodeActionService (EpisodeActionDao episodeActionDao) + LocalDateTime addEpisodeActions(String username, List episodeActionPosts) + List getEpisodeActions(String username) + List getEpisodeActionsOfPodcast(String username, String podcastURL) + List getEpisodeActionsSince(String username, LocalDateTime since) + List getEpisodeActionsOfPodcastSince(String username, String podcastURL, LocalDateTime since) + } + } + + package episodeActionController <> { + class EpisodeActionController <<@Controller>>{ + <> EpisodeActionController (EpisodeActionService episodeActionService) + ResponseEntity addEpisodeActions(String username, EpisodeActionPostRequest episodeActionPostRequest) + ResponseEntity getEpisodeActions(String username, String deviceID, boolean aggregated) + ResponseEntity getEpisodeActionsOfPodcast(String username, String podcastURL, String deviceID, boolean aggregated) + ResponseEntity getEpisodeActionsSince(String username, String deviceID, long since, boolean aggregated) + ResponseEntity getEpisodeActionsOfPodcastSince(String username, String podcastURL, String deviceID, long since, boolean aggregated) + } + + class EpisodeActionPostResponse { + <> EpisodeActionPostResponse(List> updateURLs) + long getTimestamp() + List> getUpdatedURLs() + } + + class EpisodeActionPost { + <> EpisodeActionPost(String podcastURL, String episodeURL, Action action, LocalDateTime timestamp, int started, int position) + String getPodcastURL() + String getEpisodeURL() + int getGUID() + Action getAction() + LocalDateTime getTimestamp() + int getStarted() + int getPosition() + EpisodeAction getEpisodeAction() + } + + class EpisodeActionPostRequest { + <> EpisodeActionPostRequest(List episodeActionPosts) + List getEpisodeActionPosts() + } + + class EpisodeActionGetResponse { + <> EpisodeActionGetResponse(List episodeActionPosts) + List getEpisodeActionPosts() + long getTimestamp() + } + } +} + +EpisodeActionPost -o EpisodeActionGetResponse +EpisodeActionPost -o EpisodeActionPostRequest +' EpisodeAction <.. EpisodeActionDataAccessService: DB +' Episode <.. EpisodeActionDataAccessService: DB +EpisodeActionDao <.. EpisodeActionService: <> +EpisodeActionService --o EpisodeActionController +EpisodeActionDao <|. EpisodeActionDataAccessService: <> + +@enduml + diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-model.puml b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-model.puml new file mode 100644 index 0000000..72ad49f --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-model.puml @@ -0,0 +1,109 @@ +@startuml + +package model <> { + class Subscription { + <> Subscription(String url, String title) + int getID() + String getURL() + long getLastActionTimestamp() + String getTitle() + } + + class SubscriptionAction { + <> SubscriptionAction(int userID, int subscriptionID) + int getID() + int getUserID() + int getSubscriptionID() + long getTimestamp() + boolean getAdded() + } + + class Episode { + <> Episode(int subscriptionID, int id, String url, String title, String thumbnailURL, int total) + int getSubscriptionID() + int getID() + int getGUID() + String getURL() + String getTitle() + int getTotal() + } + + enum Action { + Download + Play + Delete + New + Flattr + String getJsonProperty() + } + + class EpisodeAction { + <> EpisodeAction(Action action, LocalDateTime timestamp, int started, int position) + int getEpisodeID() + Action getAction() + long getTimestamp() + int getStarted() + int getPosition() + void setEpisodeID() + EpisodeActionPost getEpisodeActionPost(String podcastURL, String episodeURL) + } + + interface UserDetails { + String getUsername() + String getPassword() + Collection getAuthorities() + boolean isAccountExpired() + boolean isAccountLocked() + boolean isCredentialsNonExpired() + boolean isEnabled() + } + note left + Aus org.springframework.security.core.userdetails. + Wird für die Schnittstelle UserDetailsManager benötigt. + Stellt wichtige Informationen eines Users bereit. + Diese werden nur indirekt von Spring Security + benutzt, indem sie vorher in Authentication Objekten + gekapselt werden. + end note + + class User { + -- + <> User(String username, String password) + int getID() + String getSessionToken() + boolean getEmailIsValidated() + .. interface methods .. + String getUsername() + String getPassword() + Collection getAuthorities() + boolean isAccountExpired() + boolean isAccountLocked() + boolean isCredentialsNonExpired() + boolean isEnabled() + } + + interface GrantedAuthority { + String getAuthority() + } + note right + Aus org.springframework.security.core. + Wird für die Schnittstelle UserDetails benötigt. + Repräsentiert eine Autorisierung, die einem + Authentication Objekt gewährt wird. + end note + + class Authority { + <> Authority() + String getAuthority() + } +} + +Subscription <. SubscriptionAction: ID +Action <-- EpisodeAction +EpisodeAction .> Episode: ID +UserDetails <|.. User: <> +User -> Authority +GrantedAuthority <|.. Authority: <> + +@enduml + diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-subscriptions.puml b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-subscriptions.puml new file mode 100644 index 0000000..432f185 --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-subscriptions.puml @@ -0,0 +1,75 @@ +@startuml + +package subscriptionsAPI <> { + package subscriptionDataAccessLayer <> { + class SubscriptionDataAccessService <<@Repository>> { + <> SubscriptionDataAccessService(JpaTemplate jpaTemplate) + int uploadSubscriptions(String username, List subscriptions) + List getSubscriptions(String username) + List getSubscriptionsSince(String username, LocalDateTime time) + int addSubscriptions(String username, List addedSubscriptions) + int removeSubscriptions(String username, List removedSubscriptions) + List getTitles(String username) + } + + interface SubscriptionDao { + int uploadSubscriptions(String username, List subscriptions) + List getSubscriptions(String username) + List getSubscriptionsSince(String username, LocalDateTime time) + int addSubscriptions(String username, List addedSubscriptions) + int removeSubscriptions(String username, List removedSubscriptions) + List getTitles(String username) + } + } + + package subscriptionService <> { + class SubscriptionService <<@Service>> { + <> SubscriptionService(SubscriptionDao subscriptionDao) + int uploadSubscriptions(String username, List subscriptions) + List getSubscriptions(String username) + List getSubscriptionsSince(String username, LocalDateTime time) + int addSubscriptions(String username, List addedSubscriptions) + int removeSubscriptions(String username, List removedSubscriptions) + List getTitles(String username) + } + } + + package subscriptionController <> { + class SubscriptionController <<@Controller>>{ + ' @Autowired + <> SubscriptionController(SubscriptionService subscriptionService) + ' @GetMapping + ResponseEntity> getSubscriptions(String username, String deviceID, String functionJSONP) + ' @PutMapping + ResponseEntity uploadSubscriptions(String username, String deviceID, List subscriptions) + ' @PostMapping + ResponseEntity applySubscriptionDelta(String username, String deviceID, SubscriptionDelta delta) + ' @GetMapping + ResponseEntity getSubscriptionDelta(String username, String deviceID, long since) + ResponseEntity> getTitles(String username, String deviceID) + } + + class SubscriptionTitles { + <> SubscriptionTitles(Subscription subscription, List episodeTitles) + Subscription getSubscription() + List getEpisodesTitles() + } + + class SubscriptionDelta { + <> SubscriptionDelta(List add, List remove) + List getRemove() + LocalDate getTimestamp() + List> getUpdate_urls() + } + } + +} + +' Subscription <.. SubscriptionDataAccessService: DB +' SubscriptionAction <.. SubscriptionDataAccessService: DB +SubscriptionService --o SubscriptionController +SubscriptionDao <.. SubscriptionService: <> +SubscriptionDao <|. SubscriptionDataAccessService: <> + +@enduml + diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-util.puml b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-util.puml new file mode 100644 index 0000000..03dfc9a --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram-util.puml @@ -0,0 +1,43 @@ +@startuml + +package util <> { + class RSSParser { + <> RSSParser(String subscriptionURL) + String getSubscriptionTitle() + List getEpisodes() + Episode getEpisodeForURL(String episodeURL) + } + note bottom + Verwendet intern Spring um + HTTP-Anfragen zu erstellen. + end note + + class CleanCronJob { + <> CleanCronJob(JdbcUserDetailsManager jdbcUserDetailsManager) + void cleanInvalidUsers() + } + note bottom + Hintergrundservice, der in periodischen Abständen + Nutzer, die ihre E-Mail-Adresse nicht nach 24 Stunden + bestätigt haben, wieder aus der Datenbank löscht. + (Auf die Assoziation zu JdbcUserDetailsManager wird + im Sinne der Übersichtlichkeit verzichtet.) + end note + + class ResponseEntity { + <> ResponseEntity(T body, HttpStatusCode status) + T getBody() + HttpStatusCode getStatusCode() + } + note bottom + Aus org.springframework.http. + Erweitert die Klasse HttpEntity, welche + ein HTTP Anfrage- oder Antwort-Objekt + repräsentiert, durch einen HttpStatusCode. + Wird von den Controller-Methoden als + Rückgabewert verwendet. + end note +} + +@enduml + diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram.puml b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram.puml new file mode 100644 index 0000000..f833aa2 --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/classdiagram.puml @@ -0,0 +1,68 @@ +@startuml +' skinparam linetype ortho +' skinparam groupInheritance 2 +allowmixing + +!include classdiagram-authentication.puml +!include classdiagram-episode-actions.puml +!include classdiagram-model.puml +!include classdiagram-subscriptions.puml +!include classdiagram-util.puml + +class SecurityConfigurationBasicAuth { + <> SecurityConfigurationBasicAuth() + PasswordEncoder encoder() + UserDetailsManager userDetailsService() + SecuryFilterChain fiterChain(HTTPSecurity http) throws Excpetion +} +note top + Erstellt einen Servlet Filter (springSecurityFilterChain) + der für die gesamte Sicherheit zuständig ist (Schutz der URLs, + Validierung von Anmeldedaten, Weiterleitung zur Anmeldung, etc.). +end note + +class PSEApplication { + <> PSEApplication() + void main(String[] args) +} + +database Datenbank +Datenbank <-[hidden]d- subscriptionsAPI +Datenbank <-[hidden]d- episodeActionsAPI +Datenbank <-[hidden]d- authenticationAPI +() SQL as SQLSub +() SQL as SQLAuth +() SQL as SQLEpisode + +Datenbank -- SQLSub +Datenbank -- SQLAuth +Datenbank -- SQLEpisode + +Subscription --o SubscriptionTitles +EpisodeActionPost -o SubscriptionTitles +UserDetailsManager <.. SecurityConfigurationBasicAuth: <> + +SubscriptionController ..o PSEApplication +AuthenticationController ..o PSEApplication +EpisodeActionController ..o PSEApplication +SecurityConfigurationBasicAuth ..o PSEApplication + +PSEApplication --() HTTP + +SQLSub )-- SubscriptionDataAccessService: JPA +' SQLAuth )-- AuthenticationDataAccessService: JPA +SQLAuth )-- JdbcUserDetailsManager: JDBC +SQLEpisode )-- EpisodeActionDataAccessService: JPA + +RSSParser <. SubscriptionDataAccessService: <> +RSSParser <. EpisodeActionDataAccessService: <> +' JdbcUserDetailsManager <-- CleanCronJob + +model .o Datenbank: ORM (User, SubscriptionAction, Subscription, EpisodeAction, Episode) +' Datenbank o.. Subscription: ORM +' Datenbank o.. SubscriptionAction: ORM +' Datenbank o.. Episode: ORM +' Datenbank o.. EpisodeAction: ORM +' Datenbank o.. User: ORM + +@enduml diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/componentdiagram.puml b/11-entwurfsheft-kolloquium/assets/diagrams/componentdiagram.puml new file mode 100644 index 0000000..dea4a1d --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/componentdiagram.puml @@ -0,0 +1,53 @@ +@startuml + +[App] as app +[VueRouter] as router +[NavbarComponent] as navbar +[LoginPage] as login_page +[SubscriptionsPage] as abo_page +[EpisodesPage] as episodes_page +[SettingsPage] as settings_page +[ForgotPasswordPage] as forgot_page +[ResetPasswordPage] as reset_page +note top + Wird in der E-Mail zum Zurücksetzen des Passworts mit dem JWT-Token verlinkt. + Sendet das alte und neue Passwort und den JWT an die API. +end note +[RegistrationPage] as registration_page + +[SubscriptionComponent] as sub +[EpisodeComponent] as episode +[LastUpdateComponent] as last_update +[PasswordValidatorComponent] as password + +app --> router + +app --> navbar +router --> login_page +router --> forgot_page +router --> reset_page +router --> registration_page +router --> abo_page +router --> episodes_page +router --> settings_page + +navbar -[hidden] router + +episodes_page -[hidden] abo_page +login_page -[hidden] forgot_page +registration_page -[hidden] reset_page +abo_page -[hidden] settings_page +forgot_page -[hidden] episodes_page +' forgot_page -[hidden] settings_page + +abo_page --> sub +episodes_page --> episode + +sub --> last_update +episode --> last_update + +settings_page --> password +reset_page --> password +registration_page --> password + +@enduml diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/db.puml b/11-entwurfsheft-kolloquium/assets/diagrams/db.puml new file mode 100644 index 0000000..bdefaea --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/db.puml @@ -0,0 +1,78 @@ +@startuml +' Type Symbol +' Zero or One |o-- +' Exactly One ||-- +' Zero or Many }o-- +' One or Many }|-- + +skinparam linetype ortho + +entity User { + * int id <> + * String email + * String password + * boolean verified + * long created_at +} + +entity SubscriptionAction { + * int id <> + * int user_id + * long timestamp + * int subscription_id + * boolean added +} + +entity Subscription { + * int id <> + * String url + * long timestamp + * String title +} + +entity Episode { + * int id <> + * int guid <> + * String url + * String title + * int total + * int subscription_id +} +note right + Wenn der Client eine GUID aus dem Feed mitsendet, wird + diese statt der URL verwendet um die Episode zu finden. + So wird die Episode auch noch gefunden, nachdem sich + die URL geändert hat. +end note +note bottom of Episode + Wenn für die Episoden-URL einer EpisodeAction noch keine Episode in der Datenbank steht, + dann schreibe dafür ein Dummy-Objekt in Datenbank und lade asynchron die Episoden der Subscription. + Ersetze dann die Dummy-Objekte durch die Episoden und setze den Timestamp der Subscription auf + die aktuelle Zeit. + Um DoS-Angriffe auf den Backend-Server abzuwenden, können die Episoden einer Subscription erst + nach einer Stunde erneut gefetched werden. Bis dahin werden für EpisodeActions, die sich auf noch + nicht geladene Episoden beziehen, nur Dummy-Objekte für die Episoden in die Datenbank geschrieben. + Es sei noch darauf hingewiesen, dass diese Dummy-Episoden bei Anfragen nicht mit ausgegeben werden. +end note + +entity EpisodeAction { + * int id <> + * int user_id + * int episode_id + * long timestamp + * int action + * int started + * int position +} +note right + Speichere für jede Episode + nur letzte Play-Action. +endnote + +User ||--o{ EpisodeAction +User ||--o{ SubscriptionAction +SubscriptionAction }|--|| Subscription +EpisodeAction }|--|| Episode +Subscription ||-right-|{ Episode + +@enduml diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/deployment.puml b/11-entwurfsheft-kolloquium/assets/diagrams/deployment.puml new file mode 100644 index 0000000..26918e2 --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/deployment.puml @@ -0,0 +1,59 @@ +@startuml + +node "<> \nBackend Server" as backendServer{ + database " <> \n MariaDB Server 10.6" as database { + rectangle rectangle1 [ + <> + User + ] + rectangle rectangle2 [ + <> + SubscriptionAction + ] + rectangle rectangle3 [ + <> + EpisodeAction + ] + rectangle rectangle4 [ + <> + Subscription + ] + rectangle rectangle5 [ + <> + Episode + ] + } + + node "<> \nJava Spring" as javaSpring{ + node " <> \n Tomcat Webserver" + } +} + +node "<> \nFrontend" as frontendServer { + +} + +node "<> \nEndgerät" as terminal { + node "<> \nBrowser" as browser + node "<> \nPodcatcher" as podcatcher +} + +backendServer "1" - "*" podcatcher + +node "<> \nFrontend Server" as frontendServer{ + node "<> \nVue.js" as vuejs { + + } +} + +podcatcher -[hidden] browser + +backendServer - "1" frontendServer + +database "1" -- "1" javaSpring + +browser "*" -- frontendServer + + + +@enduml diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-forgotAndResetPW.puml b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-forgotAndResetPW.puml new file mode 100644 index 0000000..603130c --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-forgotAndResetPW.puml @@ -0,0 +1,41 @@ +@startuml + +skinparam ParticipantPadding 30 + +participant AuthenticationController << (C, #ADD1B2) @Controller >> +-> AuthenticationController: ""POST /api/2/auth/forgot.json"" \n//@RequestBody ForgotPasswordRequest forgotPasswordRequest// \n\n-> forgotPassword(//forgotPasswordRequest//) +activate AuthenticationController +participant AuthenticationService << (C, #ADD1B2) @Service >> +AuthenticationController -> AuthenticationService: forgotPassword(//forgotPasswordRequest//) +activate AuthenticationService +participant JavaMailSenderImpl << (C, #ADD1B2) >> +AuthenticationService -> JavaMailSenderImpl: create link to reset password with JWT as URL parameter \n-> send(SimpleMailMessage simpleMessage) with link +activate JavaMailSenderImpl +<<- JavaMailSenderImpl: sends email with link containing a JWT to reset password +JavaMailSenderImpl --> AuthenticationService +deactivate JavaMailSenderImpl +AuthenticationService --> AuthenticationController: int indicating status +deactivate AuthenticationService +<-- AuthenticationController: ResponseEntity indicating status \n\n-> ""HTTP status code"" +deactivate AuthenticationController +||60|| +-> AuthenticationController: ""PUT /api/2/auth/{username}/resetpassword.json"" \n//@RequestParam String jwt// \n//@RequestBody ResetPasswordRequest resetPasswordRequest// \n\n-> login user (""username"") via JWT (//jwt//) \n-> resetPassword(""username"", //resetPasswordRequest//) +activate AuthenticationController +AuthenticationController -> AuthenticationService: resetPassword(""username"", //resetPasswordRequest//) +activate AuthenticationService +participant JdbcUserDetailsManager << (C, #ADD1B2) @Repository >> +AuthenticationService -> JdbcUserDetailsManager: String oldPassword = //resetPasswordRequest//.getOldPassword() \nString newPassword = //resetPasswordRequest//.getNewPassword() \n-> changePassword(newPassword, oldPassword) +activate JdbcUserDetailsManager +database Database +JdbcUserDetailsManager -> Database: change password of logged in user +activate Database +Database --> JdbcUserDetailsManager +deactivate Database +JdbcUserDetailsManager --> AuthenticationService: int indicating status +deactivate JdbcUserDetailsManager +AuthenticationService --> AuthenticationController: int indicating status +deactivate AuthenticationService +<-- AuthenticationController: ResponseEntity indicating status \n\n-> ""HTTP status code"" +deactivate AuthenticationController + +@enduml \ No newline at end of file diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getEpisodeActions.puml b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getEpisodeActions.puml new file mode 100644 index 0000000..47497d5 --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getEpisodeActions.puml @@ -0,0 +1,38 @@ +@startuml + +' title =**Get All Episode Actions** + +participant EpisodeActionController << (C, #ADD1B2) @Controller >> +-> EpisodeActionController: ""GET /api/2/episodes/{username}.json"" \n//@RequestParam("device") String deviceID// \n//@RequestParam("aggregated") boolean aggregated// \n\n-> getEpisodeActions(""username"", //deviceID//, //aggregated//) +note right + Die Parameter //deviceID// und //aggregated// werden ignoriert, + da nicht zwischen Geräten unterschieden und für jede + Episode sowieso nur die letzte Play-Action gespeichert + wird. Dies gilt für alle GET-Anfragen der Episode Actions API. +end note +activate EpisodeActionController +participant EpisodeActionService << (C, #ADD1B2) @Service >> +EpisodeActionController -> EpisodeActionService: getEpisodeActions(""username"") +activate EpisodeActionService +participant EpisodeActionDataAccessService << (C, #ADD1B2) @Repository >> +EpisodeActionService -> EpisodeActionDataAccessService: getEpisodeActions(""username"") +activate EpisodeActionDataAccessService +EpisodeActionDataAccessService -> EpisodeActionDataAccessService: getEpisodeActionsSince(""username"", \nLocalDateTime.MIN.toEpochSecond(ZoneOffset.UTC)) +database Database +activate EpisodeActionDataAccessService +EpisodeActionDataAccessService -> Database: get all EpisodeActions for all subscribed podcasts +activate Database +Database --> EpisodeActionDataAccessService: List selectedEpisodeActions \n-> then remove all older than LocalDateTime.MIN (none) +EpisodeActionDataAccessService -> Database: join EpisodeActions in selectedEpisodeActions with episodeURL of Episode +Database --> EpisodeActionDataAccessService +deactivate Database +EpisodeActionDataAccessService --> EpisodeActionDataAccessService: List episodeActionPosts +deactivate EpisodeActionDataAccessService +EpisodeActionDataAccessService --> EpisodeActionService: List episodeActionPosts +deactivate EpisodeActionDataAccessService +EpisodeActionService --> EpisodeActionController: List episodeActionPosts +deactivate EpisodeActionService +<-- EpisodeActionController: ResponseEntity response \n\n-> ""HTTP status code"" \n-> ""JSON"" +deactivate EpisodeActionController + +@enduml \ No newline at end of file diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getEpisodeActionsOfPodcastSince.puml b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getEpisodeActionsOfPodcastSince.puml new file mode 100644 index 0000000..d8797d1 --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getEpisodeActionsOfPodcastSince.puml @@ -0,0 +1,32 @@ +@startuml + +' title =**Get Episode Actions of Podcast Since** + +participant EpisodeActionController << (C, #ADD1B2) @Controller >> +-> EpisodeActionController: ""GET /api/2/episodes/{username}.json"" \n//@RequestParam("podcast") String podcastURL// \n//@RequestParam("device") String deviceID// \n//@RequestParam("since") long since// \n//@RequestParam("aggregated") boolean aggregated// \n\n-> getEpisodeActionsOfPodcastSince(""username"", //podcastURL//, //deviceID//, //since//, //aggregated//) +note right + Die Parameter //deviceID// und //aggregated// werden ignoriert. + Siehe Notiz in Sequenzdiagramm **Get All Episode Actions**. +end note +activate EpisodeActionController +participant EpisodeActionService << (C, #ADD1B2) @Service >> +EpisodeActionController -> EpisodeActionService: getEpisodeActionsOfPodcastSince(""username"", //podcastURL//, //since//) +activate EpisodeActionService +participant EpisodeActionDataAccessService << (C, #ADD1B2) @Repository >> +EpisodeActionService -> EpisodeActionDataAccessService: getEpisodeActionsOfPodcastSince(""username"", //podcastURL//, //since//) +activate EpisodeActionDataAccessService +database Database +EpisodeActionDataAccessService -> Database: get all EpisodeActions the given podcast (//podcastURL//) +activate Database +Database --> EpisodeActionDataAccessService: List selectedEpisodeActions \n-> then remove all older than //since// +EpisodeActionDataAccessService -> Database: join EpisodeActions in selectedEpisodeActions with episodeURL of Episode +Database --> EpisodeActionDataAccessService +deactivate Database +EpisodeActionDataAccessService --> EpisodeActionService: List episodeActionPosts +deactivate EpisodeActionDataAccessService +EpisodeActionService --> EpisodeActionController: List episodeActionPosts +deactivate EpisodeActionService +<-- EpisodeActionController: ResponseEntity response \n\n-> ""HTTP status code"" \n-> ""JSON"" +deactivate EpisodeActionController + +@enduml \ No newline at end of file diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getSubscriptions.puml b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getSubscriptions.puml new file mode 100644 index 0000000..6e6895f --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-getSubscriptions.puml @@ -0,0 +1,36 @@ +@startuml + +' title =**Get All Subscriptions** + +participant SubscriptionController << (C, #ADD1B2) @Controller >> +-> SubscriptionController: ""GET /subscriptions/{username}.json"" \n"" /subscriptions/{username}/{deviceid}.json"" \n//@RequestParam("jsonp") String functionJSONP// \n\n-> getSubscriptions(""username"", ""deviceid"", //functionJSONP//) +activate SubscriptionController +note right + Die Parameter ""deviceid"" und + //functionJSONP// werden ignoriert, + da nicht zwischen Geräten unterschieden + und JSONP nicht unterstützt wird. +end note +participant SubscriptionService << (C, #ADD1B2) @Service >> +SubscriptionController -> SubscriptionService: getSubscriptions(""username"") +activate SubscriptionService +participant SubscriptionDataAccessService << (C, #ADD1B2) @Repository >> +SubscriptionService -> SubscriptionDataAccessService: getSubscriptions(""username"") +activate SubscriptionDataAccessService +SubscriptionDataAccessService -> SubscriptionDataAccessService: getSubscriptionsSince(""username"", LocalDateTime.MIN) +database Database +activate SubscriptionDataAccessService +SubscriptionDataAccessService -> Database: get all Podcasts from Subscriptions for ""username"" +activate Database +Database --> SubscriptionDataAccessService: List subscribedPodcasts +deactivate Database +SubscriptionDataAccessService --> SubscriptionDataAccessService: List podcastURLs +deactivate SubscriptionDataAccessService +SubscriptionDataAccessService --> SubscriptionService: List podcastURLs +deactivate SubscriptionDataAccessService +SubscriptionService --> SubscriptionController: List podcastURLs +deactivate SubscriptionService +<-- SubscriptionController: ResponseEntity> podcastURLs \n \n-> ""HTTP status code"" \n-> ""JSON"" +deactivate SubscriptionController + +@enduml \ No newline at end of file diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-register.puml b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-register.puml new file mode 100644 index 0000000..b7b7aa1 --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-register.puml @@ -0,0 +1,26 @@ +@startuml + +' title =**Register** + +participant AuthenticationController << (C, #ADD1B2) @Controller >> +-> AuthenticationController: ""POST /api/2/auth/register.json"" \n//@RequestBody UserDetails user// \n\n-> registerUser(//user//) +activate AuthenticationController +participant AuthenticationService << (C, #ADD1B2) @Service >> +AuthenticationController -> AuthenticationService: registerUser(//user//) +activate AuthenticationService +participant JdbcUserDetailsManager << (C, #ADD1B2) @Repository >> +AuthenticationService -> JdbcUserDetailsManager: createUser(//user//) +activate JdbcUserDetailsManager +database Database +JdbcUserDetailsManager -> Database: create new User with given UserDetails (//user//) +activate Database +Database --> JdbcUserDetailsManager +deactivate Database +JdbcUserDetailsManager --> AuthenticationService: int indicating status +deactivate JdbcUserDetailsManager +AuthenticationService --> AuthenticationController: int indicating status +deactivate AuthenticationService +<-- AuthenticationController: ResponseEntity indicating status \n\n-> ""HTTP status code"" +deactivate AuthenticationController + +@enduml \ No newline at end of file diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-uploadEpisodeActions.puml b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-uploadEpisodeActions.puml new file mode 100644 index 0000000..d3dac57 --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-uploadEpisodeActions.puml @@ -0,0 +1,38 @@ +@startuml + +' title =**Upload Episode Actions** + +participant EpisodeActionController << (C, #ADD1B2) @Controller >> +-> EpisodeActionController: ""POST /api/2/episodes/{username}.json"" \n//@RequestBody EpisodeActionPostRequest episodeActionPostRequest// \n\n-> addEpisodeActions(""username"", //episodeActionPostRequest//) +activate EpisodeActionController +participant EpisodeActionService << (C, #ADD1B2) @Service >> +EpisodeActionController -> EpisodeActionService: addEpisodeActions(""username"", \nepisodeActionPosts = //episodeActionPostRequest//.getEpisodeActionPosts()) +activate EpisodeActionService +participant EpisodeActionDataAccessService << (C, #ADD1B2) @Repository >> +EpisodeActionService -> EpisodeActionDataAccessService: addEpisodeActions(""username"", episodeActionPosts) +database Database +activate EpisodeActionDataAccessService +loop for each EpisodeActionPost in episodeActionPosts -> episodeAction = episodeActionPost.getEpisodeAction() +opt episodeAction.getAction().equals(Action.PLAY) +EpisodeActionDataAccessService -> Database: set episodeID field of episodeAction for this ""username"" via podcastURL and episodeURL +activate Database +Database --> EpisodeActionDataAccessService +EpisodeActionDataAccessService -> Database: get last EpisodeAction with this episodeID if present +Database --> EpisodeActionDataAccessService: Optional lastEpisodeAction +opt lastEpisodeAction.isPresent() +EpisodeActionDataAccessService -> Database: replace lastEpisodeAction with episodeAction +else else +EpisodeActionDataAccessService -> Database: add episodeAction to DB as new entry +end +Database --> EpisodeActionDataAccessService +deactivate Database +end +end +EpisodeActionDataAccessService --> EpisodeActionService: long latestTimestamp +deactivate EpisodeActionDataAccessService +EpisodeActionService --> EpisodeActionController: LocalDateTime timestamp = LocalDateTime.ofEpochSecond(latestTimestamp, 0, ZoneOffset.UTC) +deactivate EpisodeActionService +<-- EpisodeActionController: ResponseEntity \n(with empty list for updateURLs) \n\n-> ""HTTP status code"" \n-> ""JSON"" +deactivate EpisodeActionController + +@enduml \ No newline at end of file diff --git a/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-uploadSubscriptions.puml b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-uploadSubscriptions.puml new file mode 100644 index 0000000..1edc8cf --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/diagrams/sequencediagram-uploadSubscriptions.puml @@ -0,0 +1,32 @@ +@startuml + +' title =**Upload Subscriptions** + +participant SubscriptionController << (C, #ADD1B2) @Controller >> +-> SubscriptionController: ""PUT /subscriptions/{username}/{deviceid}.json"" \n//@RequestBody List subscriptions// \n\n-> uploadSubscriptions(""username"", ""deviceid"", //subscriptions//) +activate SubscriptionController +participant SubscriptionService << (C, #ADD1B2) @Service >> +SubscriptionController -> SubscriptionService: uploadSubscriptions(""username"", //subscriptions//) +activate SubscriptionService +participant SubscriptionDataAccessService << (C, #ADD1B2) @Repository >> +SubscriptionService -> SubscriptionDataAccessService: uploadSubscriptions(""username"", //subscriptions//) +activate SubscriptionDataAccessService +database Database +SubscriptionDataAccessService -> Database: delete all subsciptions of ""username"" +activate Database +Database --> SubscriptionDataAccessService +SubscriptionDataAccessService -> SubscriptionDataAccessService: addSubscriptions(""username"", //subscriptions//) +activate SubscriptionDataAccessService +SubscriptionDataAccessService -> Database: upload all subscriptions (//subscriptions//) for ""username"" +Database --> SubscriptionDataAccessService +deactivate Database +SubscriptionDataAccessService --> SubscriptionDataAccessService: int indicating status +deactivate SubscriptionDataAccessService +SubscriptionDataAccessService --> SubscriptionService: int indicating status +deactivate SubscriptionDataAccessService +SubscriptionService --> SubscriptionController: int indicating status +deactivate SubscriptionService +<-- SubscriptionController: ResponseEntity with empty String for success \n\n-> ""HTTP status code"" \n-> ""JSON"" +deactivate SubscriptionController + +@enduml \ No newline at end of file diff --git a/11-entwurfsheft-kolloquium/assets/episode.png b/11-entwurfsheft-kolloquium/assets/episode.png new file mode 100644 index 0000000..c0db4a2 Binary files /dev/null and b/11-entwurfsheft-kolloquium/assets/episode.png differ diff --git a/11-entwurfsheft-kolloquium/assets/help.png b/11-entwurfsheft-kolloquium/assets/help.png new file mode 100644 index 0000000..39a1b84 Binary files /dev/null and b/11-entwurfsheft-kolloquium/assets/help.png differ diff --git a/11-entwurfsheft-kolloquium/assets/lastupdate.png b/11-entwurfsheft-kolloquium/assets/lastupdate.png new file mode 100644 index 0000000..e9b7f5c Binary files /dev/null and b/11-entwurfsheft-kolloquium/assets/lastupdate.png differ diff --git a/11-entwurfsheft-kolloquium/assets/logo.pdf b/11-entwurfsheft-kolloquium/assets/logo.pdf new file mode 100644 index 0000000..91fd334 Binary files /dev/null and b/11-entwurfsheft-kolloquium/assets/logo.pdf differ diff --git a/11-entwurfsheft-kolloquium/assets/logo.svg b/11-entwurfsheft-kolloquium/assets/logo.svg new file mode 100644 index 0000000..1609066 --- /dev/null +++ b/11-entwurfsheft-kolloquium/assets/logo.svg @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Podcast Synchronisation made Efficient + + + + diff --git a/11-entwurfsheft-kolloquium/assets/navbar.png b/11-entwurfsheft-kolloquium/assets/navbar.png new file mode 100644 index 0000000..dd9f8e8 Binary files /dev/null and b/11-entwurfsheft-kolloquium/assets/navbar.png differ diff --git a/11-entwurfsheft-kolloquium/assets/password-margin.png b/11-entwurfsheft-kolloquium/assets/password-margin.png new file mode 100644 index 0000000..d9d4fa3 Binary files /dev/null and b/11-entwurfsheft-kolloquium/assets/password-margin.png differ diff --git a/11-entwurfsheft-kolloquium/assets/password.png b/11-entwurfsheft-kolloquium/assets/password.png new file mode 100644 index 0000000..68248a0 Binary files /dev/null and b/11-entwurfsheft-kolloquium/assets/password.png differ diff --git a/11-entwurfsheft-kolloquium/assets/subscription.png b/11-entwurfsheft-kolloquium/assets/subscription.png new file mode 100644 index 0000000..58a84f9 Binary files /dev/null and b/11-entwurfsheft-kolloquium/assets/subscription.png differ diff --git a/11-entwurfsheft-kolloquium/logos/banner_2020_kit.jpg b/11-entwurfsheft-kolloquium/logos/banner_2020_kit.jpg new file mode 100644 index 0000000..70ae1d0 Binary files /dev/null and b/11-entwurfsheft-kolloquium/logos/banner_2020_kit.jpg differ diff --git a/11-entwurfsheft-kolloquium/notizen b/11-entwurfsheft-kolloquium/notizen new file mode 100644 index 0000000..70ac63b --- /dev/null +++ b/11-entwurfsheft-kolloquium/notizen @@ -0,0 +1,40 @@ +Titelseite: +- Begrüßung + +Einführung: +- Podcast: RSS-Feed, Episoden, Audio/Video +- Podcatcher: lokale Verwaltung von Podcasts, API Unterstützung, +Abspielen von Episoden +- Synchronisationsserver (das soll unser Produkt werden): Hörfortschritte, +Abonnements, Discovery (bei AntennaPod z.B. iTunes) + +Zielsetzung: + +Synchronisation (die Art, die wir bei uns anwenden): +- alle Aktionen werden auf den Server und infolge dessen auf alle Podcatcher +übertragen + +Features: +- Synchronisation: Abos, Hörfortschritt +- Weboberfläche: Aboliste, Zuletzt gehört +- Account-Verwaltung: Registrieren, Anmelden, Passwort ändern/zurücksetzen, +Account löschen, Daten importieren/exportieren + +UI-Journey: +- login.html: + - Sprache ändern + - OAuth (kann) + - Registrieren (muss): neues Fenster, E-Mail + 2-mal Passwort (sicher?), + vergeben? -> Fehler / Bestätigungslink per E-Mail (gültig 24h) + - Anmelden (muss): E-Mail + Passwort eingeben, Login merken, + login, Fehlermeldung oder Dashboard + - Passwort vergessen: neues Fenster, E-Mail eingeben, falls Account wird + Link versendet, 24h gültig, nach betätigen PW zweimal eingeben & bestätigen + (Anforderungen) + +- podcasts.html: Abonnements, Eisoden, Hörfortschritte + +- listening.html: Zuletzt gehörte Episoden, Hörfortschritt, Wann gehört + +- settings.html: PW ändern, Gpodder Import, pers. Daten imp./exp., + Account löschen diff --git a/11-entwurfsheft-kolloquium/presentation.tex b/11-entwurfsheft-kolloquium/presentation.tex new file mode 100644 index 0000000..ca05873 --- /dev/null +++ b/11-entwurfsheft-kolloquium/presentation.tex @@ -0,0 +1,52 @@ +%% Beispiel-Präsentation mit LaTeX Beamer im KIT-Design +%% entsprechend den Gestaltungsrichtlinien vom 1. August 2020 +%% +%% Siehe https://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen + +%% Beispiel-Präsentation +\documentclass[xcolor={dvipsnames}]{sdqbeamer} +\usepackage{multicol} +\usepackage{fontawesome5} +\usepackage{rest-api} +\usepackage{graphicx} +\usepackage{ulem} +\usepackage[dvipsnames]{xcolor} + + +%% Titelbild +\titleimage{banner_2020_kit} + +%% Gruppenlogo +\grouplogo{kitlogo_de_rgb} + +%% Gruppenname und Breite (Standard: 50 mm) +\groupname{Praxis der Softwareentwicklung} +%\groupnamewidth{50mm} + +\title[Kolloquium Pflichtenheft]{ + PSE\textsuperscript{2} - Podcast Synchronisation made Efficient +} +\subtitle{Kolloquium Entwurfsheft} +\author[Immanuel Reitz]{Immanuel Reitz} + +\date[17.\,01.\,2023]{17. Januar 2023} + +\begin{document} + +\KITtitleframe + +\include{slides/apiExtension} + +\include{slides/architecture} + +\include{slides/pattern} + +\include{slides/classdiagram} + +\include{slides/sequence} + +\include{slides/frontend} + +\include{slides/changes} +%comment +\end{document} diff --git a/11-entwurfsheft-kolloquium/presentation.tex.orig b/11-entwurfsheft-kolloquium/presentation.tex.orig new file mode 100644 index 0000000..8dd6019 --- /dev/null +++ b/11-entwurfsheft-kolloquium/presentation.tex.orig @@ -0,0 +1,68 @@ +%% Beispiel-Präsentation mit LaTeX Beamer im KIT-Design +%% entsprechend den Gestaltungsrichtlinien vom 1. August 2020 +%% +%% Siehe https://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen + +%% Beispiel-Präsentation +\documentclass{sdqbeamer} + +\usepackage{tikz} +\usetikzlibrary{positioning} +\usetikzlibrary{calc} +\usetikzlibrary{arrows} +\usepackage{multicol} +\usepackage{fontawesome5} +\usepackage{tikz} +\usepackage{tikz-uml} +\usepackage{rest-api} +\usetikzlibrary{positioning, arrows, chains} +\usetikzlibrary[calc] + + +%% Titelbild +\titleimage{banner_2020_kit} + +%% Gruppenlogo +\grouplogo{kitlogo_de_rgb} + +%% Gruppenname und Breite (Standard: 50 mm) +\groupname{Praxis der Softwareentwicklung} +%\groupnamewidth{50mm} + +\title[Kolloquium Pflichtenheft]{ + PSE\textsuperscript{2} - Podcast Synchronisation made Efficient +} +\subtitle{Kolloquium Entwurfsheft} +\author[Immanuel Reitz]{Immanuel Reitz} + +\date[17.\,01.\,2023]{17. Januar 2023} + +\begin{document} + +\KITtitleframe + +\include{slides/apiExtension} +% Folie Einführung +\include{slides/einführung} + +% Folie Zielsetzung +\include{slides/zielsetzung} + +\include{slides/architektur} + +\include{slides/classdiagram} + +\include{slides/abläufe} + +<<<<<<< HEAD +% TODO: Folie Features +\include{slides/features} + +\include{slides/frontend} + +% TODO: User-Journey +======= +\include{slides/pattern} +>>>>>>> main + +\end{document} diff --git a/11-entwurfsheft-kolloquium/sdqbeamer.cls b/11-entwurfsheft-kolloquium/sdqbeamer.cls new file mode 100644 index 0000000..1b9c2b8 --- /dev/null +++ b/11-entwurfsheft-kolloquium/sdqbeamer.cls @@ -0,0 +1,975 @@ +%% Vorlage für Präsentationen mit LaTeX Beamer im KIT-Design +%% entsprechend den Gestaltungsrichtlinien vom 1. August 2020 +%% +%% Siehe https://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen + + +\NeedsTeXFormat{LaTeX2e} +\ProvidesClass{sdqbeamer}[2022-05-03 v3.1.3 SDQ Beamer class] + +\RequirePackage[utf8]{inputenc} +\RequirePackage[T1]{fontenc} + +\newif\ifsectionnavigation +\newif\ifnavbarinfoot +\newif\ifnavbarinline +\newif\ifnavbarside +\newif\iffourtothree +\newif\ifsixteentonine +\newif\ifsixteentoten +\newif\ifgerman +\newif\ifsmallfooterfont + +\def\kitslogan#1{\def\@kitslogan{#1}} +\def\kitlogo#1{\def\@kitlogo{#1}} +\def\groupname#1{\def\@groupname{#1}} +\def\groupnamewidth#1{\def\@groupnamewidth{#1}} + +% siehe README.md +\DeclareOption{de}{ + \kitslogan{KIT -- Die Forschungsuniversität in der Helmholtz-Gemeinschaft} + \kitlogo{pse_logo} + \germantrue + \PassOptionsToPackage{autostyle}{csquotes} + } +\DeclareOption{en}{ + \kitslogan{KIT -- The Research University in the Helmholtz Association} + \kitlogo{kitlogo_en_rgb} + \germanfalse + } +\DeclareOption{4:3}{ + \fourtothreetrue + \sixteentoninefalse + \sixteentotenfalse +} +\DeclareOption{16:9}{ + \fourtothreefalse + \sixteentoninetrue + \sixteentotenfalse +} +\DeclareOption{16:10}{ + \fourtothreefalse + \sixteentoninefalse + \sixteentotentrue +} +\DeclareOption{navbarside}{ + \sectionnavigationtrue + \navbarsidetrue + \navbarinlinefalse + \navbarinfootfalse +} +\DeclareOption{navbarinline}{ + \sectionnavigationtrue + \navbarsidefalse + \navbarinlinetrue + \navbarinfootfalse +} +\DeclareOption{navbarinfooter}{ + \sectionnavigationtrue + \navbarsidefalse + \navbarinlinefalse + \navbarinfoottrue +} +\DeclareOption{navbaroff}{ + \sectionnavigationfalse +} +\DeclareOption{navbarkit}{ + \sectionnavigationfalse + \smallfooterfonttrue +} +\DeclareOption{smallfoot}{ + \smallfooterfonttrue +} +\DeclareOption{bigfoot}{ + \smallfooterfontfalse +} + +\ExecuteOptions{de,16:9,navbarinline,bigfoot} + +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{beamer}} + +\ProcessOptions\relax + +\LoadClass[10pt,utf8]{beamer} + +% Babel-Paket wird nur bei deutscher Sprache benötigt +\ifgerman + \RequirePackage[ngerman]{babel} +\fi +\RequirePackage{csquotes} +\RequirePackage{hyperref} +\RequirePackage[absolute,overlay]{textpos} + +%% --------------- +%% | Typographie | +%% --------------- + +\RequirePackage{microtype} + +\RequirePackage[scaled=.92]{helvet} +\RequirePackage[scaled=.78]{beramono} +\RequirePackage{libertineRoman} + +\setbeamerfont{title}{series=\bfseries,size=\Large} +\setbeamerfont{frametitle}{series=\bfseries,size=\Large} +\setbeamerfont{framesubtitle}{series=\bfseries,size=\normalsize} + +%% ----------------- +%% | Folien-Layout | +%% ----------------- + +% Seitenverhältnis +% +% Die Folien sind auf die Standardhöhe in LaTeX Beamer (9,6 cm) normiert. +% Die Maße der KIT-Gestaltungsrichtlinien (Folienhöhe 14,3 cm) wurden durch +% den Quotienten 1,5 geteilt. + +\RequirePackage{geometry} +\iffourtothree + \geometry{papersize={12.8cm,9.6cm}} +\fi +\ifsixteentoten + \geometry{papersize={15.36cm,9.6cm}} +\fi +\ifsixteentonine + \geometry{papersize={17.07cm,9.6cm}} +\fi + +% Ränder laut Gestaltungsrichtlinen; 3 mm -> 2 mm, 11 mm -> 7,3 mm +\newlength{\kitoutermargin} +\setlength{\kitoutermargin}{2mm} +\newlength{\kitinnermargin} +\setlength{\kitinnermargin}{7.3mm} +\newlength{\kitbottommargin} +\setlength{\kitbottommargin}{\kitinnermargin} + +% Ränder außen +\setbeamersize{text margin left=\kitinnermargin,text margin right=\kitinnermargin} + +% keine Navigationssymbole +\setbeamertemplate{navigation symbols}{} +\setbeamercovered{invisible} +\useinnertheme{rounded} +\beamer@compresstrue % Miniframes (Navigations-Punkte) für Subsections immer in einer Zeile, ohne Umbrüche + +% Folientitel +\setbeamertemplate{frametitle}{ + \ifbeamer@plainframe\else% + % Unterkante Titeltext: 22,5 mm -> 15 mm von Seitenkopf + \begin{textblock*}{\dimexpr\paperwidth-30mm-2\kitinnermargin}[0,1](\kitinnermargin,15mm)% + \usebeamerfont{frametitle}\insertframetitle% + \ifx\insertframesubtitle\@empty\else\\[.1em]\fi + \usebeamerfont{framesubtitle}\insertframesubtitle% + \end{textblock*}% + \begin{textblock*}{20mm}[1,1](\dimexpr\paperwidth-\kitinnermargin\relax,15mm)%j + \includegraphics[width=20mm]{logos/\@kitlogo}% + \end{textblock*}% + \fi +% Rand oben (ergibt Beginn des Textes bei 34 mm -> 22,7 mm) + \vspace {18mm} +} + +%% Fußzeile +\newlength{\kitbottom} + % Navbar in Footer: Schmale Fußzeile +\ifnavbarinfoot + % Bei Navbar in Footer immer kleiner Font in der Fußzeile + \setbeamerfont{footer}{size=\fontsize{6pt}{7.2pt}\selectfont} + \setlength{\kitbottom}{4mm} +\else + % Ansonsten kleiner Text nur, wenn "smallfoot" gewählt + \ifsmallfooterfont + \setbeamerfont{footer}{size=\fontsize{6pt}{7.2pt}\selectfont} + \else + \setbeamerfont{footer}{size=\scriptsize} + \fi + \setlength{\kitbottom}{\kitbottommargin} +\fi +\setbeamerfont{page number in head/foot}{series=\bfseries} + +\newlength{\kitbottomdepth} +\newlength{\kitbottomheight} +\newlength{\kitfootergroupwidth} + +\setbeamertemplate{footline}{% +\setlength{\kitbottomdepth}{\dimexpr.5\kitbottom-.5em\relax}% +\setlength{\kitbottomheight}{\dimexpr.5\kitbottom+.5em\relax}% + %% die "%" am Ende sind nötig, damit keine Abstände eingefügt werden + % + % Falls kein Gruppenname angegeben, die ganze Breite der Fußzeile für den Titel nutzen. + \ifdefined\@groupname% + \ifx\@groupname\empty% + \setlength{\kitfootergroupwidth}{0mm}% + \else% + % Falls die Breite des Gruppenlogos definiert ist, diese nehmen, sonst 50 mm + \ifdefined\@groupnamewidth% + \setlength{\kitfootergroupwidth}{\@groupnamewidth}% + \else% + \setlength{\kitfootergroupwidth}{50mm}% + \fi% + \fi% + \else + \setlength{\kitfootergroupwidth}{0mm}% + \fi + \usebeamerfont{footer}% + \ifsectionnavigation% + % Option "navbarinline" + \ifnavbarinline% + \begin{beamercolorbox}[wd=\paperwidth, leftskip=2mm, rightskip=2mm]{} + \insertnavigation{\dimexpr\paperwidth-4mm\relax} + \vspace{1mm} + \end{beamercolorbox}% + \fi% + % Option "navbarinfooter" + \ifnavbarinfoot% + % Punkte für Subsections deaktivieren + \setbeamertemplate{mini frames}{}% + \begin{beamercolorbox}[wd=\paperwidth, leftskip=1mm, rightskip=1mm]{}% + \insertsectionnavigationhorizontal{\dimexpr\paperwidth-\kitoutermargin\relax}{}{} + \end{beamercolorbox}% + \fi% + \fi% + \leavevmode% + \begin{beamercolorbox}[wd=13mm, ht=\kitbottomheight, dp=\kitbottomdepth, leftskip=4mm]{} + \usebeamerfont{page number in head/foot}% + \strut\insertframenumber{}/\inserttotalframenumber% + \end{beamercolorbox}% + \begin{beamercolorbox}[wd=20mm, ht=\kitbottomheight, dp=\kitbottomdepth]{} + \usebeamerfont{date in head/foot}% + \strut\insertshortdate% + \end{beamercolorbox}% + % Die Boxen mit dem Titel und dem Gruppennamen sind vertikal zentriert, damit auch zweizeilige Texte schön aussehen + % Daher müssen sie um \kitbottomdepth nach unten verschoben werden + \raisebox{-\kitbottomdepth}{ + % Die Box hat daher auch Höhe \kitbottom und Tiefe 0mm + \begin{beamercolorbox}[wd=\dimexpr\paperwidth-37mm-\kitfootergroupwidth, ht=\kitbottom, dp=0mm]{}% + % Inhalt vertikal zentrieren; Anpassung um 1.5 pt, damit bei einzeiligem Inhalt genau die Baseline der Blöcke mit Seitenzahl und Datum getroffen wird + \vbox to\kitbottom{\vfill\vskip1.5pt% + \beamer@shortauthor\ifx\beamer@shortauthor\empty\else: \fi\beamer@shorttitle% + \vfill}% + \end{beamercolorbox}% + \ifdefined\@groupname% + \begin{beamercolorbox}[wd=\kitfootergroupwidth, ht=\kitbottom, dp=0mm, rightskip=\kitinnermargin]{} + \vbox to\kitbottom{\vfill\vskip1.5pt% + \raggedleft\@groupname% + \vfill}% + \end{beamercolorbox}% + \fi% + }% +} + +%% Option "navbarside" +\ifnavbarside +\useoutertheme[height=0cm,width=3.5cm,left]{sidebar} + +\setbeamerfont{title in sidebar}{family=\sffamily,series=\mdseries,size={\fontsize{10pt}{11pt}}} +\setbeamerfont{section in sidebar}{family=\sffamily,series=\mdseries,size={\fontsize{9pt}{9.9pt}}} +\setbeamerfont{subsection in sidebar}{family=\sffamily,series=\mdseries,size={\fontsize{8pt}{8.8pt}}} + +\setbeamertemplate{sidebar \beamer@sidebarside} + {\vskip1.5cm% + \hskip6.5mm% + \advance\beamer@sidebarwidth by -5mm% + \insertverticalnavigation{\beamer@sidebarwidth}% + }% +\fi + +%% Hintergrund +\usebackgroundtemplate{ + % Trennlinie nicht bei "plain"-Frames + \ifbeamer@plainframe\else\kitseparationline\fi +} + +% Trennlinie +\newcommand{\kitseparationline}{ + \begin{pgfpicture}{0mm}{0mm}{\paperwidth}{\paperheight} + \pgfsetstrokecolor{black!15} + \pgfsetlinewidth{.5pt} + \pgfpathmoveto{\pgfpoint{\kitoutermargin}{\kitinnermargin}} + \pgfpathlineto{\pgfpoint{\paperwidth-\kitoutermargin}{\kitinnermargin}} + \pgfusepath{stroke} + \end{pgfpicture}% +} + + +%% -------------- +%% | Titelseite | +%% -------------- + +\def\titleimage#1{\def\@titleimage{#1}} +\def\grouplogo#1{\def\@grouplogo{#1}} + +\newcommand{\KITtitleframe}{ + \begin{frame}[plain] + \titlepage + \end{frame} +} + +\newlength{\kittitleimageheight} +\setbeamertemplate{title page}{ + % From textpos documentation (https://ctan.org/pkg/textpos) + % + % \begin{textblock}{}[,](,) + % The coordinates and are fractions of the width and height of the text + % box, respectively, and state that the box is to be placed so that the reference point + % (,) within the box is to be placed at the point (,) on the page. + + % KIT-Logo + \begin{textblock*}{30mm}(\kitinnermargin,6.7mm) + \includegraphics[width=30mm]{logos/\@kitlogo} + \end{textblock*} + + % Gruppenlogo + \ifdefined\@grouplogo + \ifx\@grouplogo\empty \else + \begin{textblock*}{20mm}(\dimexpr\paperwidth-24mm\relax,6.7mm) + \includegraphics[width=20mm,height=20mm,keepaspectratio]{logos/\@grouplogo} + \end{textblock*} + \fi % falls \grouplogo{} aufgerufen wird, kein Gruppenlogo einbinden + \else + \begin{textblock*}{20mm}(\dimexpr\paperwidth-24mm\relax,6.7mm) + \colorbox{kit-purple100!20}{\parbox[t][12mm][c]{19mm}{\color{kit-purple100}\scriptsize\centering + \ifgerman + Bitte Logo über \texttt{\textbackslash grouplogo\{\}} festlegen. + \else + Please set a logo using \texttt{\textbackslash grouplogo\{\}}. + \fi + }} + \end{textblock*} + \fi + + % Titel + \begin{textblock*}{\dimexpr\paperwidth-8mm\relax}[0,.5](\kitinnermargin,28mm) + \usebeamerfont*{title}\inserttitle + \end{textblock*} + + % Untertitel + \begin{textblock*}{\dimexpr\paperwidth-8mm\relax}(\kitinnermargin,36mm) + \small\textbf{\insertsubtitle} + \end{textblock*} + + % Autor + \begin{textblock*}{\dimexpr\paperwidth-8mm\relax}(\kitinnermargin,41mm) + \small\insertauthor~\textbar~\insertdate + \end{textblock*} + + % Titelbild + \setlength{\kittitleimageheight}{40mm} + \begin{textblock*}{\paperwidth}(\kitoutermargin,\dimexpr\paperheight-\kitbottommargin-\kittitleimageheight) + \begin{pgfpicture}{0mm}{0mm}{\paperwidth}{\kittitleimageheight} + % Clipping-Pfad um titelbild + \pgfsetstrokecolor{black!15} + \pgfsetlinewidth{1pt} + \pgfsetcornersarced{\pgfpoint{3mm}{3mm}} + \pgfpathmoveto{\pgfpoint{\paperwidth-2\kitoutermargin}{0mm}} + \pgfpathlineto{\pgfpoint{\paperwidth-2\kitoutermargin}{\kittitleimageheight}} + \pgfsetcornersarced{\pgfpointorigin} + \pgfpathlineto{\pgfpoint{0mm}{\kittitleimageheight}} + \pgfsetcornersarced{\pgfpoint{3mm}{3mm}} + \pgfpathlineto{\pgfpointorigin} + \pgfsetcornersarced{\pgfpointorigin} + \pgfpathclose + \pgfusepath{stroke,clip} + \pgfsetstrokecolor{black} + + % Titelbild + \ifdefined\@titleimage + \ifx\@titleimage\empty \else% + \pgftext[at=\pgfpoint{.5\paperwidth}{0mm},center,bottom]{% + \includegraphics[height=40mm]{logos/\@titleimage} + } + \fi % Bei Aufruf von \titleimage{} leeren Rahmen anzeigen. + \else + \pgftext[at=\pgfpoint{.5\paperwidth}{.5\kittitleimageheight},center,base]{% + \colorbox{kit-purple100!20}{\parbox[c][\kittitleimageheight][c]{\paperwidth}{\color{kit-purple100}\centering Bitte Titelbild über \texttt{\textbackslash titleimage\{\}} festlegen. + }}% + } + \fi + + + \end{pgfpicture}% + \end{textblock*} + + + % KIT slogan + \begin{textblock*}{80mm}[0,.5](\kitoutermargin,\dimexpr\paperheight-.5\kitbottommargin) + \fontsize{5.5pt}{5.5pt}\selectfont\@kitslogan + \end{textblock*} + + \begin{textblock*}{30mm}[1,.5](\dimexpr\paperwidth-\kitoutermargin\relax,\dimexpr\paperheight-.5\kitbottommargin) + \fontsize{11pt}{11pt}\selectfont\bfseries\raggedleft% + {\href{https://www.kit.edu}{www.kit.edu}} + \end{textblock*} + +} +%% --------------- +%% | /Titelseite | +%% --------------- + +%% ---------- +%% | Farben | +%% ---------- +%% KIT-Farbschema + +% KIT color green : +\definecolor{kit-green}{RGB}{0, 150, 130} +\definecolor{kit-green100}{RGB}{0, 150, 130} +\definecolor{kit-green90}{rgb}{0.1, 0.6294, 0.5588} +\definecolor{kit-green80}{rgb}{0.2, 0.6706, 0.6078} +\definecolor{kit-green75}{rgb}{0.25, 0.6912, 0.6324} +\definecolor{kit-green70}{rgb}{0.3, 0.7118, 0.6569} +\definecolor{kit-green60}{rgb}{0.4, 0.7529, 0.7059} +\definecolor{kit-green50}{rgb}{0.5, 0.7941, 0.7549} +\definecolor{kit-green40}{rgb}{0.6, 0.8353, 0.8039} +\definecolor{kit-green30}{rgb}{0.7, 0.8765, 0.8529} +\definecolor{kit-green25}{rgb}{0.75, 0.8971, 0.8775} +\definecolor{kit-green20}{rgb}{0.8, 0.9176, 0.902} +\definecolor{kit-green15}{rgb}{0.85, 0.9382, 0.9265} +\definecolor{kit-green10}{rgb}{0.9, 0.9588, 0.951} +\definecolor{kit-green5}{rgb}{0.95, 0.9794, 0.9755} + +% KIT color blue: +\definecolor{kit-blue}{RGB}{70, 100, 170} +\definecolor{kit-blue100}{RGB}{70, 100, 170} +\definecolor{kit-blue90}{rgb}{0.3471, 0.4529, 0.7} +\definecolor{kit-blue80}{rgb}{0.4196, 0.5137, 0.7333} +\definecolor{kit-blue75}{rgb}{0.4559, 0.5441, 0.75} +\definecolor{kit-blue70}{rgb}{0.4922, 0.5745, 0.7667} +\definecolor{kit-blue60}{rgb}{0.5647, 0.6353, 0.8} +\definecolor{kit-blue50}{rgb}{0.6373, 0.6961, 0.8333} +\definecolor{kit-blue40}{rgb}{0.7098, 0.7569, 0.8667} +\definecolor{kit-blue30}{rgb}{0.7824, 0.8176, 0.9} +\definecolor{kit-blue25}{rgb}{0.8186, 0.848, 0.9167} +\definecolor{kit-blue20}{rgb}{0.8549, 0.8784, 0.9333} +\definecolor{kit-blue15}{rgb}{0.8912, 0.9088, 0.95} +\definecolor{kit-blue10}{rgb}{0.9275, 0.9392, 0.9667} +\definecolor{kit-blue5}{rgb}{0.9637, 0.9696, 0.9833} + +% KIT color red : +\definecolor{kit-red}{RGB}{162, 34, 35} +\definecolor{kit-red100}{RGB}{162, 34, 35} +\definecolor{kit-red90}{rgb}{0.6718, 0.22, 0.2235} +\definecolor{kit-red80}{rgb}{0.7082, 0.3067, 0.3098} +\definecolor{kit-red75}{rgb}{0.7265, 0.35, 0.3529} +\definecolor{kit-red70}{rgb}{0.7447, 0.3933, 0.3961} +\definecolor{kit-red60}{rgb}{0.7812, 0.48, 0.4824} +\definecolor{kit-red50}{rgb}{0.8176, 0.5667, 0.5686} +\definecolor{kit-red40}{rgb}{0.8541, 0.6533, 0.6549} +\definecolor{kit-red30}{rgb}{0.8906, 0.74, 0.7412} +\definecolor{kit-red25}{rgb}{0.9088, 0.7833, 0.7843} +\definecolor{kit-red20}{rgb}{0.9271, 0.8267, 0.8275} +\definecolor{kit-red15}{rgb}{0.9453, 0.87, 0.8706} +\definecolor{kit-red10}{rgb}{0.9635, 0.9133, 0.9137} +\definecolor{kit-red5}{rgb}{0.9818, 0.9567, 0.9569} + +% KIT color yellow : +\definecolor{kit-yellow}{RGB}{252, 229, 0} +\definecolor{kit-yellow100}{RGB}{252, 229, 0} +\definecolor{kit-yellow90}{rgb}{0.9894, 0.9082, 0.1} +\definecolor{kit-yellow80}{rgb}{0.9906, 0.9184, 0.2} +\definecolor{kit-yellow75}{rgb}{0.9912, 0.9235, 0.25} +\definecolor{kit-yellow70}{rgb}{0.9918, 0.9286, 0.3} +\definecolor{kit-yellow60}{rgb}{0.9929, 0.9388, 0.4} +\definecolor{kit-yellow50}{rgb}{0.9941, 0.949, 0.5} +\definecolor{kit-yellow40}{rgb}{0.9953, 0.9592, 0.6} +\definecolor{kit-yellow30}{rgb}{0.9965, 0.9694, 0.7} +\definecolor{kit-yellow25}{rgb}{0.9971, 0.9745, 0.75} +\definecolor{kit-yellow20}{rgb}{0.9976, 0.9796, 0.8} +\definecolor{kit-yellow15}{rgb}{0.9982, 0.9847, 0.85} +\definecolor{kit-yellow10}{rgb}{0.9988, 0.9898, 0.9} +\definecolor{kit-yellow5}{rgb}{0.9994, 0.9949, 0.95} + +% KIT color orange : +\definecolor{kit-orange}{RGB}{223, 155, 27} +\definecolor{kit-orange100}{RGB}{223, 155, 27} +\definecolor{kit-orange90}{rgb}{0.8871, 0.6471, 0.1953} +\definecolor{kit-orange80}{rgb}{0.8996, 0.6863, 0.2847} +\definecolor{kit-orange75}{rgb}{0.9059, 0.7059, 0.3294} +\definecolor{kit-orange70}{rgb}{0.9122, 0.7255, 0.3741} +\definecolor{kit-orange60}{rgb}{0.9247, 0.7647, 0.4635} +\definecolor{kit-orange50}{rgb}{0.9373, 0.8039, 0.5529} +\definecolor{kit-orange40}{rgb}{0.9498, 0.8431, 0.6424} +\definecolor{kit-orange30}{rgb}{0.9624, 0.8824, 0.7318} +\definecolor{kit-orange25}{rgb}{0.9686, 0.902, 0.7765} +\definecolor{kit-orange20}{rgb}{0.9749, 0.9216, 0.8212} +\definecolor{kit-orange15}{rgb}{0.9812, 0.9412, 0.8659} +\definecolor{kit-orange10}{rgb}{0.9875, 0.9608, 0.9106} +\definecolor{kit-orange5}{rgb}{0.9937, 0.9804, 0.9553} + +% KIT color lightgreen : +\definecolor{kit-lightgreen}{RGB}{140, 182, 60} +\definecolor{kit-lightgreen100}{RGB}{140, 182, 60} +\definecolor{kit-lightgreen90}{rgb}{0.5941, 0.7424, 0.3118} +\definecolor{kit-lightgreen80}{rgb}{0.6392, 0.771, 0.3882} +\definecolor{kit-lightgreen75}{rgb}{0.6618, 0.7853, 0.4265} +\definecolor{kit-lightgreen70}{rgb}{0.6843, 0.7996, 0.4647} +\definecolor{kit-lightgreen60}{rgb}{0.7294, 0.8282, 0.5412} +\definecolor{kit-lightgreen50}{rgb}{0.7745, 0.8569, 0.6176} +\definecolor{kit-lightgreen40}{rgb}{0.8196, 0.8855, 0.6941} +\definecolor{kit-lightgreen30}{rgb}{0.8647, 0.9141, 0.7706} +\definecolor{kit-lightgreen25}{rgb}{0.8873, 0.9284, 0.8088} +\definecolor{kit-lightgreen20}{rgb}{0.9098, 0.9427, 0.8471} +\definecolor{kit-lightgreen15}{rgb}{0.9324, 0.9571, 0.8853} +\definecolor{kit-lightgreen10}{rgb}{0.9549, 0.9714, 0.9235} +\definecolor{kit-lightgreen5}{rgb}{0.9775, 0.9857, 0.9618} + + +% KIT color purple : +\definecolor{kit-purple}{RGB}{163, 16, 124} +\definecolor{kit-purple100}{RGB}{163, 16, 124} +\definecolor{kit-purple90}{rgb}{0.6753, 0.1565, 0.5376} +\definecolor{kit-purple80}{rgb}{0.7114, 0.2502, 0.589} +\definecolor{kit-purple75}{rgb}{0.7294, 0.2971, 0.6147} +\definecolor{kit-purple70}{rgb}{0.7475, 0.3439, 0.6404} +\definecolor{kit-purple60}{rgb}{0.7835, 0.4376, 0.6918} +\definecolor{kit-purple50}{rgb}{0.8196, 0.5314, 0.7431} +\definecolor{kit-purple40}{rgb}{0.8557, 0.6251, 0.7945} +\definecolor{kit-purple30}{rgb}{0.8918, 0.7188, 0.8459} +\definecolor{kit-purple25}{rgb}{0.9098, 0.7657, 0.8716} +\definecolor{kit-purple20}{rgb}{0.9278, 0.8125, 0.8973} +\definecolor{kit-purple15}{rgb}{0.9459, 0.8594, 0.9229} +\definecolor{kit-purple10}{rgb}{0.9639, 0.9063, 0.9486} +\definecolor{kit-purple5}{rgb}{0.982, 0.9531, 0.9743} + +% KIT color brown : +\definecolor{kit-brown}{RGB}{167, 130, 46} +\definecolor{kit-brown100}{RGB}{167, 130, 46} +\definecolor{kit-brown90}{rgb}{0.6894, 0.5588, 0.2624} +\definecolor{kit-brown80}{rgb}{0.7239, 0.6078, 0.3443} +\definecolor{kit-brown75}{rgb}{0.7412, 0.6324, 0.3853} +\definecolor{kit-brown70}{rgb}{0.7584, 0.6569, 0.4263} +\definecolor{kit-brown60}{rgb}{0.7929, 0.7059, 0.5082} +\definecolor{kit-brown50}{rgb}{0.8275, 0.7549, 0.5902} +\definecolor{kit-brown40}{rgb}{0.862, 0.8039, 0.6722} +\definecolor{kit-brown30}{rgb}{0.8965, 0.8529, 0.7541} +\definecolor{kit-brown25}{rgb}{0.9137, 0.8775, 0.7951} +\definecolor{kit-brown20}{rgb}{0.931, 0.902, 0.8361} +\definecolor{kit-brown15}{rgb}{0.9482, 0.9265, 0.8771} +\definecolor{kit-brown10}{rgb}{0.9655, 0.951, 0.918} +\definecolor{kit-brown5}{rgb}{0.9827, 0.9755, 0.959} + +% KIT color cyan : +\definecolor{kit-cyan}{RGB}{35, 161, 224} +\definecolor{kit-cyan100}{RGB}{35, 161, 224} +\definecolor{kit-cyan90}{rgb}{0.2235, 0.6682, 0.8906} +\definecolor{kit-cyan80}{rgb}{0.3098, 0.7051, 0.9027} +\definecolor{kit-cyan75}{rgb}{0.3529, 0.7235, 0.9088} +\definecolor{kit-cyan70}{rgb}{0.3961, 0.742, 0.9149} +\definecolor{kit-cyan60}{rgb}{0.4824, 0.7788, 0.9271} +\definecolor{kit-cyan50}{rgb}{0.5686, 0.8157, 0.9392} +\definecolor{kit-cyan40}{rgb}{0.6549, 0.8525, 0.9514} +\definecolor{kit-cyan30}{rgb}{0.7412, 0.8894, 0.9635} +\definecolor{kit-cyan25}{rgb}{0.7843, 0.9078, 0.9696} +\definecolor{kit-cyan20}{rgb}{0.8275, 0.9263, 0.9757} +\definecolor{kit-cyan15}{rgb}{0.8706, 0.9447, 0.9818} +\definecolor{kit-cyan10}{rgb}{0.9137, 0.9631, 0.9878} +\definecolor{kit-cyan5}{rgb}{0.9569, 0.9816, 0.9939} + +% KIT color gray : +\definecolor{kit-gray}{RGB}{0, 0, 0} +\definecolor{kit-gray100}{RGB}{0, 0, 0} +\definecolor{kit-gray90}{rgb}{0.1, 0.1, 0.1} +\definecolor{kit-gray80}{rgb}{0.2, 0.2, 0.2} +\definecolor{kit-gray75}{rgb}{0.25, 0.25, 0.25} +\definecolor{kit-gray70}{rgb}{0.3, 0.3, 0.3} +\definecolor{kit-gray60}{rgb}{0.4, 0.4, 0.4} +\definecolor{kit-gray50}{rgb}{0.5, 0.5, 0.5} +\definecolor{kit-gray40}{rgb}{0.6, 0.6, 0.6} +\definecolor{kit-gray30}{rgb}{0.7, 0.7, 0.7} +\definecolor{kit-gray25}{rgb}{0.75, 0.75, 0.75} +\definecolor{kit-gray20}{rgb}{0.8, 0.8, 0.8} +\definecolor{kit-gray15}{rgb}{0.85, 0.85, 0.85} +\definecolor{kit-gray10}{rgb}{0.9, 0.9, 0.9} +\definecolor{kit-gray5}{rgb}{0.95, 0.95, 0.95} + + + +\setbeamercolor*{normal text}{fg=black} +\setbeamercolor*{alerted text}{fg=kit-red100} +\setbeamercolor*{example text}{fg=black} +\setbeamercolor*{structure}{fg=black} + +\setbeamercolor*{palette primary}{fg=black,bg=black!15} +\setbeamercolor*{palette secondary}{fg=black,bg=black!15} +\setbeamercolor*{palette tertiary}{fg=black,bg=black!15} +\setbeamercolor*{palette quaternary}{fg=black,bg=black!15} + +\setbeamercolor*{palette sidebar primary}{fg=black!75} +\setbeamercolor*{palette sidebar secondary}{fg=black!75} +\setbeamercolor*{palette sidebar tertiary}{fg=black!75} +\setbeamercolor*{palette sidebar quaternary}{fg=black!75} + +\setbeamercolor*{item projected}{fg=white,bg=kit-green100} + +\setbeamercolor*{block title}{fg=white,bg=kit-green100} +\setbeamercolor*{block title alerted}{use=alerted text,fg=white,bg=alerted text.fg!75!black} +\setbeamercolor*{block title example}{fg=white,bg=kit-blue100} + +\setbeamercolor*{block body}{fg=black,bg=kit-green15} +\setbeamercolor*{block body alerted}{parent=normal text,use=block title alerted,bg=block title alerted.bg!10!bg} +\setbeamercolor*{block body example}{fg=black,bg=kit-blue15} + +\setbeamercolor*{separation line}{} +\setbeamercolor*{fine separation line}{} + +\setbeamercolor*{background canvas}{bg=white} + +%% ----------- +%% | /Farben | +%% ----------- + +%% ----------------------------------- +%% | halbgerundete Aufzählungspunkte | +%% ----------------------------------- + +\newcommand{\itemizeColor}{kit-green100} + +% KIT-Aufzählungszeichen +\newcommand{\KITmark}{% + \begin{pgfpicture}{0mm}{0mm}{1ex}{1ex} + {\pgfsetcornersarced{\pgfpoint{.3ex}{.3ex}} + \pgfpathmoveto{\pgfpoint{0cm}{1ex}} + \pgfpathlineto{\pgfpoint{1ex}{1ex}} + \pgfpathlineto{\pgfpoint{1ex}{0cm}}} + {\pgfsetcornersarced{\pgfpoint{.3ex}{.3ex}} + \pgfpathmoveto{\pgfpoint{1ex}{0cm}} + \pgfpathlineto{\pgfpointorigin} + \pgfpathlineto{\pgfpoint{0cm}{1ex}}} + \color{\itemizeColor} + \pgfusepath{fill} + \end{pgfpicture}% +} + +% \setbeamertemplate{itemize items}{\raisebox{.2ex}{\KITmark}} +\setbeamertemplate{itemize items}[square] +\setbeamercolor{itemize item}{fg=kit-green100} + +%% ---------------------- +%% | Inhaltsverzeichnis | +%% ---------------------- + +\setbeamertemplate{section in toc}{\normalsize\textbf{\textcolor{kit-blue}{\inserttocsectionnumber.~\inserttocsection}}\par} +\setbeamertemplate{subsection in toc}{\small\hspace{1.2em}\raisebox{.2ex}{\KITmark}\hspace{\labelsep}\inserttocsubsection\par} + +%% ------------------------------ +%% | halbgerundete Beamer-Boxen | +%% ------------------------------ + +\renewcommand\beamerboxesrounded[2][]{% + \global\let\beamer@firstlineitemizeunskip=\relax% + \vbox\bgroup% + \setkeys{beamerboxes}{upper=block title,lower=block body,width=\textwidth,shadow=false}% + \setkeys{beamerboxes}{#1}% + {% + \usebeamercolor{\bmb@lower}% + \globalcolorstrue% + \colorlet{lower.bg}{bg}% + }% + {% + \usebeamercolor{\bmb@upper}% + \globalcolorstrue% + \colorlet{upper.bg}{bg}% + }% + % + % Typeset head + % + \vskip4bp + \setbox\bmb@box=\hbox{% + \begin{minipage}[b]{\bmb@width}% + \usebeamercolor[fg]{\bmb@upper}% + #2% + \end{minipage}}% + \ifdim\wd\bmb@box=0pt% + \setbox\bmb@box=\hbox{}% + \ht\bmb@box=1.5pt% + \bmb@prevheight=-4.5pt% + \else% + \wd\bmb@box=\bmb@width% + \bmb@temp=\dp\bmb@box% + \ifdim\bmb@temp<1.5pt% + \bmb@temp=1.5pt% + \fi% + \setbox\bmb@box=\hbox{\raise\bmb@temp\hbox{\box\bmb@box}}% + \dp\bmb@box=0pt% + \bmb@prevheight=\ht\bmb@box% + \fi% + \bmb@temp=\bmb@width% + \bmb@dima=\bmb@temp\advance\bmb@dima by2.2bp% + \bmb@dimb=\bmb@temp\advance\bmb@dimb by4bp% + \hbox{% + \begin{pgfpicture}{0bp}{+-\ht\bmb@box}{0bp}{+-\ht\bmb@box} + \ifdim\wd\bmb@box=0pt% + \color{lower.bg}% + \else% + \color{upper.bg}% + \fi% + \pgfpathqmoveto{-4bp}{-1bp} + % Adaption for "KIT-Design" + \pgfpathlineto{\pgfpoint{-4bp}{3bp}} + %\pgfpathqcurveto{-4bp}{1.2bp}{-2.2bp}{3bp}{0bp}{3bp} + \pgfpathlineto{\pgfpoint{\bmb@temp}{3bp}} + \pgfpathcurveto% + {\pgfpoint{\bmb@dima}{3bp}}% + {\pgfpoint{\bmb@dimb}{1.2bp}}% + {\pgfpoint{\bmb@dimb}{-1bp}}% + \bmb@dima=-\ht\bmb@box% + \advance\bmb@dima by-2pt% + \pgfpathlineto{\pgfpoint{\bmb@dimb}{\bmb@dima}} + \pgfpathlineto{\pgfpoint{-4bp}{\bmb@dima}} + \pgfusepath{fill} + \end{pgfpicture}% + \copy\bmb@box% + }% + \nointerlineskip% + \vskip-1pt% + \ifdim\wd\bmb@box=0pt% + \else% + \hbox{% + \begin{pgfpicture}{0pt}{0pt}{\bmb@width}{6pt} + \bmb@dima=\bmb@width% + \advance\bmb@dima by8bp% + \pgfpathrectangle{\pgfpoint{-4bp}{-1bp}}{\pgfpoint{\bmb@dima}{8bp}} + \pgfusepath{clip} + {\pgftransformshift{\pgfpoint{-4bp}{0bp}}\pgftext[left,base]{\pgfuseshading{bmb@transition}}}% + \end{pgfpicture}% + }% + \nointerlineskip% + \vskip-0.5pt% + \fi% + \ifbmb@shadow% + \setbox\bmb@boxshadow=\hbox{\pgfuseshading{bmb@shadow}}% + \setbox\bmb@boxshadowball=\hbox{\pgfuseshading{bmb@shadowball}}% + \setbox\bmb@boxshadowballlarge=\hbox{\pgfuseshading{bmb@shadowballlarge}}% + \fi% + \setbox\bmb@colorbox=\hbox{{\pgfpicturetrue\pgfsetcolor{lower.bg}}}% + \setbox\bmb@box=\hbox\bgroup\begin{minipage}[b]{\bmb@width}% + \vskip2pt% + \usebeamercolor[fg]{\bmb@lower}% + \colorlet{beamerstructure}{upper.bg}% + \colorlet{structure}{upper.bg}% + %\color{.}% + } + +\def\endbeamerboxesrounded{% + \end{minipage}\egroup% + \wd\bmb@box=\bmb@width% + \bmb@temp=\dp\bmb@box% + \advance\bmb@temp by.5pt% + \setbox\bmb@box=\hbox{\raise\bmb@temp\hbox{\box\bmb@box}}% + \dp\bmb@box=0pt% + \bmb@temp=\wd\bmb@box% + \bmb@dima=\bmb@temp\advance\bmb@dima by2.2bp% + \bmb@dimb=\bmb@temp\advance\bmb@dimb by4bp% + \hbox{% + \begin{pgfpicture}{0bp}{0bp}{0bp}{0bp} + \ifbmb@shadow% + {\pgftransformshift{\pgfpoint{4bp}{-3bp}}\pgftext{\copy\bmb@boxshadowball}} + \begin{pgfscope} + {% + \advance\bmb@temp by-1bp% + \pgfpathrectangle{\pgfpoint{\bmb@temp}{-7bp}}{\pgfpoint{9bp}{9bp}}% + \pgfusepath{clip} + }% + {\pgftransformshift{\pgfpoint{\bmb@temp}{1bp}}\pgftext{\box\bmb@boxshadowballlarge}} + \end{pgfscope} + \begin{pgfscope} + \advance\bmb@temp by-4bp% + \pgfpathrectangle{\pgfpoint{4bp}{-7bp}}{\pgfpoint{\bmb@temp}{5bp}} + \pgfusepath{clip} + {\pgftransformshift{\pgfpoint{4bp}{-7bp}}\pgftext[left,base]{\copy\bmb@boxshadow}}% + \end{pgfscope} + \begin{pgfscope} + \advance\bmb@temp by 4bp% + \bmb@dima=\ht\bmb@box% + \advance\bmb@dima by\bmb@prevheight% + \advance\bmb@dima by 4bp% + \pgfpathrectangle{\pgfpoint{\bmb@temp}{1bp}}{\pgfpoint{4bp}{\bmb@dima}} + \pgfusepath{clip} + \advance\bmb@dima by-4bp% + {\pgftransformshift{\pgfpoint{\bmb@temp}{\bmb@dima}}\pgftext{\box\bmb@boxshadowball}} + \advance\bmb@dima by-1bp% + \pgfpathrectangle{\pgfpoint{\bmb@temp}{1bp}}{\pgfpoint{4bp}{\bmb@dima}} + \pgfusepath{clip} + \advance\bmb@temp by4bp% + {\pgftransformshift{\pgfpoint{\bmb@temp}{-3bp}}% + \pgftransformrotate{90}% + \pgftext[left,base]{\box\bmb@boxshadow}}% + \end{pgfscope} + \fi% + \unhbox\bmb@colorbox% + \pgfpathqmoveto{-4bp}{1bp} + \pgfpathqcurveto{-4bp}{-1.2bp}{-2.2bp}{-3bp}{0bp}{-3bp} + \pgfpathlineto{\pgfpoint{\the\bmb@dimb}{-3bp}} + { + \bmb@dima=\ht\bmb@box% + \pgfpathlineto{\pgfpoint{\bmb@dimb}{\bmb@dima}} + \pgfpathlineto{\pgfpoint{-4bp}{\bmb@dima}} + \pgfusepath{fill} + } + \ifbmb@shadow% + { + \color{black!50!bg} + \pgfsetlinewidth{0pt} + \pgfpathmoveto{\pgfpoint{\bmb@dimb}{-.5bp}} + \bmb@dima=\ht\bmb@box% + \advance\bmb@dima by\bmb@prevheight% + \advance\bmb@dima by 1bp% + \pgfpathlineto{\pgfpoint{\bmb@dimb}{\bmb@dima}} + \pgfusepath{stroke} + \bmb@temp=\bmb@dima + \advance\bmb@dima by 1bp% + \color{black!31!bg} + \pgfpathmoveto{\pgfpoint{\bmb@dimb}{\bmb@temp}} + \pgfpathlineto{\pgfpoint{\bmb@dimb}{\bmb@dima}} + \pgfusepath{stroke} + \advance\bmb@dima by 1bp% + \advance\bmb@temp by 1bp% + \color{black!19!bg} + \pgfpathmoveto{\pgfpoint{\bmb@dimb}{\bmb@temp}} + \pgfpathlineto{\pgfpoint{\bmb@dimb}{\bmb@dima}} + \pgfusepath{stroke} + \advance\bmb@dima by 1bp% + \advance\bmb@temp by 1bp% + \color{black!6!bg} + \pgfpathmoveto{\pgfpoint{\bmb@dimb}{\bmb@temp}} + \pgfpathlineto{\pgfpoint{\bmb@dimb}{\bmb@dima}} + \pgfusepath{stroke} + \advance\bmb@dima by 1.5bp% + \advance\bmb@temp by 1bp% + \color{bg} + \pgfpathmoveto{\pgfpoint{\bmb@dimb}{\bmb@temp}} + \pgfpathlineto{\pgfpoint{\bmb@dimb}{\bmb@dima}} + \pgfusepath{stroke} + } + \fi + \end{pgfpicture}% + \box\bmb@box% + }% + \ifbmb@shadow% + \vskip4bp minus 2bp% + \else% + \vskip2bp% + \fi% + \egroup% of \vbox\bgroup +} + + +%% ------------------------------- +%% | /halbgerundete Beamer-Boxen | +%% ------------------------------- + + +%% ---------------------- +%% | Block-Definitionen | +%% ---------------------- + +% Content environment for structuring. Basically a headline followed by text +\newenvironment<>{contentblock}[1]{\begingroup% + \setbeamertemplate{blocks}[default] + \setbeamercolor{block body}{fg=black,bg=}% + \setbeamercolor{block title}{fg=black,bg=}% + \setbeamerfont*{block title}{family=\sffamily,series=\bfseries,size=\large} + \begin{block}#2{#1}% + }{\end{block}% +\endgroup} + + +\newenvironment<>{greenblock}[1]{\begingroup% + \setbeamercolor{block body}{fg=black,bg=kit-green15}% + \setbeamercolor{block title}{fg=white,bg=kit-green100}% + \begin{block}#2{#1}% + }{\end{block} +\endgroup} + +\newenvironment<>{blueblock}[1]{\begingroup% + \setbeamercolor{block body}{fg=black,bg=kit-blue15}% + \setbeamercolor{block title}{fg=white,bg=kit-blue100}% + \setbeamercolor{itemize item}{fg=kit-blue100} + \begin{block}#2{#1}% + }{\end{block} +\endgroup} + +\newenvironment<>{redblock}[1]{\begingroup% + \setbeamercolor{block body}{fg=black,bg=kit-red15}% + \setbeamercolor{block title}{fg=white,bg=kit-red100}% + \setbeamercolor{itemize item}{fg=kit-red100}% + \begin{block}#2{#1}% + }{\end{block}% +\endgroup} + +\newenvironment<>{brownblock}[1]{\begingroup% + \setbeamercolor{block body}{fg=black,bg=kit-brown15}% + \setbeamercolor{block title}{fg=white,bg=kit-brown100}% + \setbeamercolor{itemize item}{fg=kit-brown100}% + \begin{block}#2{#1}% + }{\end{block}% +\endgroup} + +\newenvironment<>{purpleblock}[1]{\begingroup% + \setbeamercolor{block body}{fg=black,bg=kit-purple15}% + \setbeamercolor{block title}{fg=white,bg=kit-purple100}% + \setbeamercolor{itemize item}{fg=kit-purple100}% + \begin{block}#2{#1}% + }{\end{block}% +\endgroup} + +\newenvironment<>{grayblock}[1]{\begingroup% + \setbeamercolor{block body}{fg=black,bg=kit-gray15}% + \setbeamercolor{block title}{fg=white,bg=kit-gray70}% + \setbeamercolor{itemize item}{fg=kit-gray70}% + \begin{block}#2{#1}% + }{\end{block}% +\endgroup} + +\newenvironment<>{yellowblock}[1]{\begingroup% + \setbeamercolor{block body}{fg=black,bg=kit-yellow30}% + \setbeamercolor{block title}{fg=black,bg=kit-yellow100}% + \setbeamercolor{itemize item}{fg=kit-yellow100}% + \begin{block}#2{#1}% + }{\end{block}% +\endgroup} + +\newenvironment<>{lightgreenblock}[1]{\begingroup% + \setbeamercolor{block body}{fg=black,bg=kit-lightgreen15}% + \setbeamercolor{block title}{fg=white,bg=kit-lightgreen100}% + \setbeamercolor{itemize item}{fg=kit-lightgreen100}% + \begin{block}#2{#1}% + }{\end{block}% +\endgroup} + +\newenvironment<>{orangeblock}[1]{\begingroup% + \setbeamercolor{block body}{fg=black,bg=kit-orange15}% + \setbeamercolor{block title}{fg=white,bg=kit-orange100}% + \setbeamercolor{itemize item}{fg=kit-orange100}% + \begin{block}#2{#1}% + }{\end{block}% +\endgroup} + +\newenvironment<>{cyanblock}[1]{\begingroup% + \setbeamercolor{block body}{fg=black,bg=kit-cyan15}% + \setbeamercolor{block title}{fg=white,bg=kit-cyan100}% + \setbeamercolor{itemize item}{fg=kit-cyan100}% + \begin{block}#2{#1}% + }{\end{block}% +\endgroup} + +\newenvironment<>{maroonblock}[1]{\begingroup% +\setbeamercolor{block body}{fg=black,bg=Maroon!15}% +\setbeamercolor{block title}{fg=white,bg=Maroon}% + \setbeamercolor{itemize item}{fg=Maroon}% +\begin{block}#2{#1}% +}{\end{block}% +\endgroup} +%% ------------------------------ +%% | /Block-Definitionen | +%% ------------------------------ + +%% use this for setting the total page number +\newcommand{\beginbackup}{ + \newcounter{framenumbervorappendix} + \setcounter{framenumbervorappendix}{\value{framenumber}} +} +\newcommand{\backupend}{ + \addtocounter{framenumbervorappendix}{-\value{framenumber}} + \addtocounter{framenumber}{\value{framenumbervorappendix}} +} diff --git a/11-entwurfsheft-kolloquium/slides/apiExtension.tex b/11-entwurfsheft-kolloquium/slides/apiExtension.tex new file mode 100644 index 0000000..df1c027 --- /dev/null +++ b/11-entwurfsheft-kolloquium/slides/apiExtension.tex @@ -0,0 +1,39 @@ +\begin{frame}{API Erweiterung} + + \begin{columns}[t] + \begin{column}{.3\textwidth} + \centering{\fontsize{30pt}{36pt}\selectfont\faLock} + \vspace{.2cm} + \begin{orangeblock}{Authentication} + \begin{itemize} + \item Registrierung + \item Passwort ändern + \item Passwort vergessen + \item Passwort zurücksetzen + \item Account löschen + \end{itemize} + \end{orangeblock} + \end{column} + \begin{column}{.3\textwidth} + \centering{\fontsize{30pt}{36pt}\selectfont\faDownload} + \vspace{.2cm} + \begin{greenblock}{Subscriptions} + \begin{itemize} + \item Abrufen der Informationen aller Abonnements + \end{itemize} + \end{greenblock} + \end{column} + \begin{column}{.3\textwidth} + \centering{\fontsize{30pt}{36pt}\selectfont\faSpinner} + \vspace{.2cm} + \begin{blueblock}{Episode Actions} + \begin{itemize} + \item Episode Actions hochladen + \item Episode Actions abrufen + \end{itemize} + \end{blueblock} + \end{column} + \end{columns} + +\end{frame} + diff --git a/11-entwurfsheft-kolloquium/slides/architecture.tex b/11-entwurfsheft-kolloquium/slides/architecture.tex new file mode 100644 index 0000000..edd9f1b --- /dev/null +++ b/11-entwurfsheft-kolloquium/slides/architecture.tex @@ -0,0 +1,7 @@ +\begin{frame}{Architektur} + + \begin{figure}[h] + \includegraphics[width=0.73\textwidth]{assets/diagrams/backendComponentDiagram} + \end{figure} + +\end{frame} \ No newline at end of file diff --git a/11-entwurfsheft-kolloquium/slides/changes.tex b/11-entwurfsheft-kolloquium/slides/changes.tex new file mode 100644 index 0000000..b3ba6de --- /dev/null +++ b/11-entwurfsheft-kolloquium/slides/changes.tex @@ -0,0 +1,22 @@ +\begin{frame}[t]{Änderungen Pflichtenheft} + + \begin{block}{Neue Kriterien} + \begin{itemize} + \item \textlangle RS11\textrangle \, Cooldown Fetch-Vorgang + \item \textlangle RC13\textrangle \, Sprache von Browserinformationen + \end{itemize} + \end{block} + + \begin{blueblock}{Abgeänderte Kriterien} + \begin{itemize} + \item \textlangle RS10\textrangle \, Sessions mit JSON Web Token + \end{itemize} + \end{blueblock} + + \begin{maroonblock}{Entfernte Kriterien} + \begin{itemize} + \item \textlangle RC5\textrangle \, Frontend kompatibel mit beliebigen Gpodder APIs + \end{itemize} + \end{maroonblock} + +\end{frame} diff --git a/11-entwurfsheft-kolloquium/slides/classdiagram.tex b/11-entwurfsheft-kolloquium/slides/classdiagram.tex new file mode 100644 index 0000000..aeecec0 --- /dev/null +++ b/11-entwurfsheft-kolloquium/slides/classdiagram.tex @@ -0,0 +1,57 @@ +\begin{frame}[t]{Überblick: Klassendiagramm} + \centering + \includegraphics[width=\textwidth]{assets/diagrams/classdiagram} + \vspace{.3cm} + \begin{greenblock}{Abhängigkeiten} + \vspace{-.2cm} + \begin{columns} + \begin{column}{.4\textwidth} + \begin{itemize} + \item Spring Web + \item Spring Security + \item Spring Mail Sender + \end{itemize} + \end{column} + \begin{column}{.4\textwidth} + \begin{itemize} + \item Spring Data JPA + \item Lombok + \item Rome (RSS parsing/fetching) + \end{itemize} + \end{column} + \end{columns} + + \end{greenblock} +\end{frame} + +% sub +% episode +% auth +% model +% util + +\begin{frame}[t]{Subscriptions-API} + \centering + \includegraphics[width=\textwidth]{assets/diagrams/classdiagram-subscriptions} +\end{frame} + +\begin{frame}[t]{EpisodeActions-API} + \centering + \includegraphics[width=\textwidth]{assets/diagrams/classdiagram-episode-actions} +\end{frame} + +\begin{frame}[t]{Authentication-API} + \centering + \includegraphics[width=.73\textwidth]{assets/diagrams/classdiagram-authentication} +\end{frame} + +\begin{frame}[t]{Model-Paket} + \centering + \includegraphics[width=\textwidth]{assets/diagrams/classdiagram-model} +\end{frame} + +\begin{frame}[t]{Util-Paket} + \centering + \includegraphics[width=\textwidth]{assets/diagrams/classdiagram-util} +\end{frame} + diff --git a/11-entwurfsheft-kolloquium/slides/frontend.tex b/11-entwurfsheft-kolloquium/slides/frontend.tex new file mode 100644 index 0000000..c49d94f --- /dev/null +++ b/11-entwurfsheft-kolloquium/slides/frontend.tex @@ -0,0 +1,21 @@ +\begin{frame}{Weboberfläche} + \begin{minipage}{.77\textwidth} + \centering + \includegraphics[width=\textwidth]{assets/diagrams/componentdiagram} + \end{minipage} + \hspace{.3cm} + \begin{minipage}{.18\textwidth} + \begin{greenblock}{Abhängigkeiten} + \begin{itemize} + \item vite + \item vue + \item vue-router + \item Pinia + \item bootstrap + \item fontawesome + \item vue-i18n + \end{itemize} + \end{greenblock} + \end{minipage} +\end{frame} + diff --git a/11-entwurfsheft-kolloquium/slides/pattern.tex b/11-entwurfsheft-kolloquium/slides/pattern.tex new file mode 100644 index 0000000..1f6366e --- /dev/null +++ b/11-entwurfsheft-kolloquium/slides/pattern.tex @@ -0,0 +1,26 @@ +\begin{frame}{Entwurfsmuster} + \begin{columns}[t] + \column{.5\textwidth} + \centering{\fontsize{30pt}{36pt}\selectfont\faSyringe} + \begin{greenblock}{Dependency Injection} + \begin{itemize} + \item Bestimmt Abhängigkeiten in Klassen + \item Speichert Instanzen dieser Abhängigkeiten an zentralem Ort + % Wichtig für Interface Abhängigkeiten: + \item Instanz in Konfiguration festlegbar + \item Setzt Instanzen während der Laufzeit an benötigter Stelle ein + \end{itemize} + \end{greenblock} + \column{.5\textwidth} + \centering{\fontsize{30pt}{36pt}\selectfont\faDatabase} + \begin{blueblock}{Data Access Object (DAO)} + \color{kit-blue100} + \begin{itemize} + \item DAO-Interface als Schnittstelle zwischen Geschäftslogik und Datenzugriffslogik + \item DAO-Implementierungen als Varianten der Datenzugriffslogik (MariaDB, MySQL, etc.) + \item[$\Rightarrow$] Austauschbare Implementierungen + \end{itemize} + \end{blueblock} + \end{columns} +\end{frame} + diff --git a/11-entwurfsheft-kolloquium/slides/sequence.tex b/11-entwurfsheft-kolloquium/slides/sequence.tex new file mode 100644 index 0000000..393e502 --- /dev/null +++ b/11-entwurfsheft-kolloquium/slides/sequence.tex @@ -0,0 +1,7 @@ +\begin{frame}{Abläufe: Abrufen aller Abonnements} + + \begin{figure}[h] + \includegraphics[width=0.83\textwidth]{assets/diagrams/sequencediagram-getSubscriptions} + \end{figure} + +\end{frame} \ No newline at end of file -- cgit v1.2.3