genofire/hs_monolith
genofire
/
hs_monolith
Archived
1
0
Fork 0

[DOC] korrekturen + patch

This commit is contained in:
Martin Geno 2017-06-23 11:52:53 +02:00
parent 1e84ad95d6
commit 1d72751653
No known key found for this signature in database
GPG Key ID: F0D39A37E925E941
7 changed files with 255 additions and 40 deletions

View File

@ -7,29 +7,32 @@ Der Microservice Warenwirtschaft dient der Verwaltung der Warenbestände für de
\begin{center} \begin{center}
\caption{Begriffsdefinition} \caption{Begriffsdefinition}
\renewcommand{\arraystretch}{1.0} \renewcommand{\arraystretch}{1.0}
\begin{tabularx}{\textwidth}{|L{2.2cm}|L{4cm}|X|} \begin{tabularx}{\textwidth}{|L{2.2cm}|L{4cm}|X|}
\hline \hline
\textbf{Begriff} & \textbf{Englische Übersetzung} &\textbf{Bedeutung}\\ \hline \textbf{Begriff} & \textbf{Englische Übersetzung} &\textbf{Bedeutung}\\ \hline
Produkt & Product & Über den Webshop angebotene Früchte- oder Gemüseart, zum Beispiel Kiwis\\ \hline Produkt & Product & Über den Webshop angebotene Früchte- oder Gemüseart, zum Beispiel Kiwis\\ \hline
Ware & Good & Einzelne Frucht oder einzelnes Gemüse pro Produkt (zum Beispiel eine Kiwi)\\ \hline Ware & Good & Einzelne Frucht oder einzelnes Gemüse pro Produkt (zum Beispiel eine Kiwi)\\ \hline
Warenbestand & Stock & Anzahl der einzelnen Waren pro Produkt, die sich im Lager befinden\\ \hline Warenbestand & Stock & Anzahl der einzelnen Waren pro Produkt, die sich im Lager befinden\\ \hline
\end{tabularx} \end{tabularx}
\label{tabl:Begriffe} \label{tabl:Begriffe}
\end{center} \end{center}
\end{small} \end{small}
\end{table} \end{table}
Die übergeordnete Aufgabe dieses Microservice ist die Speicherung und Verwaltung der Waren mit ihrem Lagerort sowie einem Ablaufdatum, da es sich bei Obst und Gemüse um verderbliche Waren handelt. Nachfolgend sind die weiteren, detaillierten Anforderungen an diesen Microservice zusammengefasst. Die übergeordnete Aufgabe dieses Microservice ist die Speicherung und Verwaltung der Waren mit ihrem Lagerort sowie einem Ablaufdatum, da es sich bei Obst und Gemüse um verderbliche Waren handelt. Nachfolgend sind die weiteren, detaillierten Anforderungen an diesen Microservice zusammengefasst.
\begin{itemize} \begin{itemize}
\item \textbf{Funktionen des Admin-Frontends} \item \textbf{Funktionen des Admin-Frontends}
\begin{itemize} \begin{itemize}
\item Hinzufügen neuer Waren zum Warenbestand \item Hinzufügen neuer Waren zum Warenbestand
\item Manuelles Entfernen von Waren aus dem Warenbestand, zum Beispiel wenn diese verdorben sind \item Manuelles Entfernen von Waren aus dem Warenbestand, zum Beispiel wenn diese verdorben sind
\end{itemize}
\item \textbf{Funktionen für andere Mircoservice / dem Beispiel Warenkorb}
\begin{itemize}
\item Entfernen von einzelnen Waren aus dem Warenbestand, wenn diese an einen Kunden versendet werden \item Entfernen von einzelnen Waren aus dem Warenbestand, wenn diese an einen Kunden versendet werden
\item Blockieren von Waren in dem Warenbestand, wenn ein Kunde diese in seinen Warenkorb gelegt hat \item Blockieren von Waren in dem Warenbestand, wenn ein Kunde diese in seinen Warenkorb gelegt hat
\item Automatische Freigabe von blockierten Waren, wenn diese nicht innerhalb einer Frist an den Versand überstellt werden \item Automatische Freigabe von blockierten Waren, wenn diese nicht innerhalb einer Frist an den Versand überstellt werden
@ -40,11 +43,11 @@ Die übergeordnete Aufgabe dieses Microservice ist die Speicherung und Verwaltun
\end{itemize} \end{itemize}
\item \textbf{Optionale Zusatzfunktionen} \item \textbf{Optionale Zusatzfunktionen}
\begin{itemize} \begin{itemize}
\item Admin-Frontend: Ausgabe einer Statistik, wie viele Waren sich gesamt und durchschnittlich im Warenbestand befinden \item Admin-Frontend: Ausgabe einer Statistik, wie viele Waren sich gesamt und durchschnittlich im Warenbestand befinden
\item Admin-Frontend: Ampeldarstellung pro Ware, die Anzeigt ob diese bereits ihr angegebenes Ablaufdatum erreicht oder überschritten hat \item Admin-Frontend: Ampeldarstellung pro Ware, die Anzeigt ob diese bereits ihr angegebenes Ablaufdatum erreicht oder überschritten hat
\end{itemize} \end{itemize}
\end{itemize} \end{itemize}
\newpage \newpage
Die Angabe der Anzahl ist bei dem Hinzufügen neuer Waren zum Warenbestand verpflichtend, da ohne sie die Verwaltung neu eingetroffener Waren nicht möglich ist. Gleiches gilt für die Angabe des Ablaufdatums, diese ist speziell bei der Verwaltung von Lebensmitteln notwendig, um den Verkauf von verdorbenen Waren zu vermeiden. Die Datumsangabe erfolgt dabei im amerikanischen Format \textit{Jahr-Monat-Tag}. \par Die Angabe der Anzahl ist bei dem Hinzufügen neuer Waren zum Warenbestand verpflichtend, da ohne sie die Verwaltung neu eingetroffener Waren nicht möglich ist. Gleiches gilt für die Angabe des Ablaufdatums, diese ist speziell bei der Verwaltung von Lebensmitteln notwendig, um den Verkauf von verdorbenen Waren zu vermeiden. Die Datumsangabe erfolgt dabei im amerikanischen Format \textit{Jahr-Monat-Tag}. \par
Im Gegensatz dazu sind die Angabe von Lagerplatz und Kommentar bei dem Hinzufügen neuer Waren optional, da diese Informationen für die Verwaltung des reinen Warenbestandes nicht essentiell notwendig sind. Diese beiden Angaben sind als Freitextfelder umzusetzen, um speziell bei dem Lagerort flexibel die Nutzung verschiedener Benennungschema für Regale oder Lagerräume zu ermöglichen und den Benutzer hier nicht einzuschränken. \par Im Gegensatz dazu sind die Angabe von Lagerplatz und Kommentar bei dem Hinzufügen neuer Waren optional, da diese Informationen für die Verwaltung des reinen Warenbestandes nicht essentiell notwendig sind. Diese beiden Angaben sind als Freitextfelder umzusetzen, um speziell bei dem Lagerort flexibel die Nutzung verschiedener Benennungschema für Regale oder Lagerräume zu ermöglichen und den Benutzer hier nicht einzuschränken. \par
Der Microservice ist in den bestehenden Monolithen Mosh zu integrieren, eine Kommunikation mit anderen Microservices wird jedoch nicht hergestellt. Der Microservice ist in den bestehenden Monolithen Mosh zu integrieren, eine Kommunikation mit anderen Microservices wird jedoch nicht hergestellt.

View File

@ -1,2 +1,5 @@
\section{Änderungen am Monolithen} \section{Änderungen am Monolithen}
\label{changes} \label{changes}
\lstinputlisting[language=diff]{./chapter/monolith.patch}

View File

@ -8,11 +8,11 @@ go get ./...
\end{lstlisting} \end{lstlisting}
\subsection{Start des Microservice} \subsection{Start des Microservice}
Um den Microservice Warenwirtschaft zu starten, ist die folgende Befehlszeile unter dem Root-Verzeichnis des Microservice auszuführen. Anschließend wird der Microservice unter \linebreak \texttt{http://localhost:8080/} bereitgestellt. Zusätzlich ist der Microservice unter der URL \linebreak \texttt{https://stock.pub.warehost.de/} ausgebracht. Unter der URL Um den Microservice Warenwirtschaft zu starten, ist die folgende Befehlszeile unter dem Root-Verzeichnis des Microservice auszuführen. Anschließend wird der Microservice unter \linebreak \texttt{http://localhost:8080/} bereitgestellt. Zusätzlich wird der Microservice durch Continuous Integration unter der URL \linebreak \texttt{https://stock.pub.warehost.de/} bereitgestellt. Unter der URL
\texttt{https://stock.pub.\linebreak warehost.de/dummy\_cart/} steht zudem ein rudimentärer Dummy-Warenkorb bereit, mit dem das Blockieren und Freigeben von Waren für den ausgebrachten Microservice getestet werden kann. \texttt{https://stock.pub.\linebreak warehost.de/dummy\_cart/} steht zudem ein rudimentärer Dummy-Warenkorb bereit, mit dem das Blockieren und Freigeben von Waren für den bereitgestellt Microservice getestet werden kann.
\begin{lstlisting}[caption=Start des Go-Microservice] \begin{lstlisting}[caption=Start des Go-Microservice]
go run main.go go run main.go
\end{lstlisting} \end{lstlisting}
\subsection{Start des Monolithen} \subsection{Start des Monolithen}
Der angepasste Monolith wird entsprechend der Anleitung unter \linebreak \texttt{https://gitlab.com/matthiasstock/monolith} gestartet. Der angepasste Monolith wird entsprechend der Anleitung unter \linebreak \texttt{https://gitlab.com/matthiasstock/monolith} gestartet.

View File

@ -6,9 +6,9 @@
\usepackage[utf8]{inputenc} % Eingabe encoding \usepackage[utf8]{inputenc} % Eingabe encoding
\usepackage[colorinlistoftodos]{todonotes} \usepackage[colorinlistoftodos]{todonotes}
\usepackage{xcolor} % Farben \usepackage{xcolor} % Farben
\usepackage{framed, color} % Hintergrundfarben für Boxen \usepackage{framed} % Hintergrundfarben für Boxen
\usepackage{textcomp} % Sonderzeichen \usepackage{textcomp} % Sonderzeichen
\usepackage{amsmath} \usepackage{amsmath}
\usepackage[automark,headsepline]{scrpage2} % Kopf- und Fußzeilen \usepackage[automark,headsepline]{scrpage2} % Kopf- und Fußzeilen
\usepackage{amsmath,amsfonts,amssymb} % Mathematik \usepackage{amsmath,amsfonts,amssymb} % Mathematik
\usepackage{graphicx} % Bilder einfügen \usepackage{graphicx} % Bilder einfügen
@ -40,8 +40,8 @@
% ---- Geometrie und Schrift -------------------------------------------------------------------------------- % ---- Geometrie und Schrift --------------------------------------------------------------------------------
\geometry{verbose,a4paper,tmargin=2.5cm,bmargin=2cm,lmargin=2.5cm,rmargin=2.5cm,headsep=1.5cm} \geometry{verbose,a4paper,tmargin=2.5cm,bmargin=2cm,lmargin=2.5cm,rmargin=2.5cm,headsep=1.5cm}
\renewcommand*\familydefault{ppl} \renewcommand*\familydefault{ppl}
\linespread{1.2} \linespread{1.2}
\titleformat*{\section}{\LARGE} \titleformat*{\section}{\LARGE}
@ -78,17 +78,17 @@
\setcounter{secnumdepth}{4} \setcounter{secnumdepth}{4}
\setcounter{tocdepth}{4} \setcounter{tocdepth}{4}
% ---- Listings ---------------------------------------------------------------------------------------------- % ---- Listings ----------------------------------------------------------------------------------------------
\lstset{ \lstset{
basicstyle=\ttfamily\color{black}\small, basicstyle=\ttfamily\color{black}\small,
backgroundcolor=\color{listings}, backgroundcolor=\color{listings},
keywordstyle=\color{black}, keywordstyle=\color{black},
identifierstyle=\color{black}, identifierstyle=\color{black},
commentstyle=\color{black}, commentstyle=\color{black},
showspaces=false, showspaces=false,
showtabs=false, showtabs=false,
breaklines=true, breaklines=true,
xleftmargin=0pt, xleftmargin=0pt,
xrightmargin=0pt, xrightmargin=0pt,
@ -100,13 +100,26 @@ xrightmargin=0pt,
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}} % Blocksatz zentriert \newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}} % Blocksatz zentriert
\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1}} % Blocksatz rechtsbündig \newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1}} % Blocksatz rechtsbündig
\setlist[itemize]{leftmargin=*} \setlist[itemize]{leftmargin=*}
\renewcommand*\labelitemi{$-$} \renewcommand*\labelitemi{$-$}
\setlist[1]{itemsep=-0.5pt} \setlist[1]{itemsep=-0.5pt}
% \hyphenation{} Eigene Worttrennung % \hyphenation{} Eigene Worttrennung
% Patch
\definecolor{diffstart}{named}{gray}
\definecolor{diffincl}{HTML}{00A64F}
\definecolor{diffrem}{named}{red}
\lstdefinelanguage{diff}{
basicstyle=\ttfamily\small,
morecomment=[f][\color{diffstart}]{diff},
morecomment=[f][\color{diffstart}]{index},
morecomment=[f][\color{diffstart}]{@@},
morecomment=[f][\color{diffincl}]{+},
morecomment=[f][\color{diffrem}]{-},
}
%------------------------------------------------------------------------------------------------------------ %------------------------------------------------------------------------------------------------------------
% ---- Definitionen ----------------------------------------------------------------------------------------- % ---- Definitionen -----------------------------------------------------------------------------------------

View File

@ -1,7 +1,11 @@
\section{Architektur des Microservice} \section{Architektur des Microservice}
\label{sec: Architektur des Microservice} \label{sec: Architektur des Microservice}
Der Microservice Warenwirtschaft wurde in der Programmiersprache Go\footnote{https:\//golang.org\/doc\/} entwickelt. Go-An-wendungen bestehen aus Packages, in denen die einzelnen Go-Files organisiert sind, Klassen -- im Sinne der Objektorientierung -- gibt es nicht. Die Warenwirtschaft setzt sich aus den neun Packages zusammen, die die Abbildung \ref{pic:Struktur des Microservice} darstellt. In den nachfolgenden Unterkapiteln \ref{subsec: Presentation Layer} und \ref{subsec: Application Layer} werden die Packages und die darin enthaltenen Go-Files des Presentation sowie des Application Layers kurz vorgestellt. \par Der Microservice Warenwirtschaft wurde in der Programmiersprache Go\footnote{https:\//golang.org\/doc\/} entwickelt.
Go-Files mit der Bezeichnung \texttt{<<Name>>\_test.go} beinhalten Whitebox-Testfälle um die Funktionen der benannten Go-Files zu prüfen. Aus Gründen der Übersichtlichkeit werden diese Files hier nicht explizit aufgeführt. Die weiteren Unterkapitel beschreiben die Schnittstellen, den Persistant Layer sowie das Admin-Frontend und schließlich die Anpassung des Monolithen, um den Microservice Warenwirtschaft in diesen zu integrieren. Go-Anwendungen bestehen aus Packages, in denen die einzelnen Go-Files organisiert sind.
Ohne Klassen zu besitzen ist Go objektorientiert, es besitzt Struct und Interface, die auch vererbt werden könne.
Des Weiteren wird durch Groß-/Kleinschreibung definiert, ob die Methode auch außerhalb des Struct oder Packages verwendet werden kann.
Die Warenwirtschaft setzt sich aus den neun Packages zusammen, die die Abbildung \ref{pic:Struktur des Microservice} darstellt. In den nachfolgenden Unterkapiteln \ref{subsec: Presentation Layer} und \ref{subsec: Application Layer} werden die Packages und die darin enthaltenen Go-Files des Presentation sowie des Application Layers kurz vorgestellt. \par
Go-Files mit der Bezeichnung \texttt{<<Name>>\_test.go} beinhalten Whitebox-Testfälle um die Funktionen der benannten Go-Files zu prüfen. Aus Gründen der Übersichtlichkeit werden diese Files hier nicht explizit aufgeführt. Die Weiteren Unterkapitel beschreiben die Schnittstellen, den Persistant Layer sowie das Admin-Frontend und schließlich die Anpassung des Monolithen, um den Microservice Warenwirtschaft in diesen zu integrieren.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
@ -13,9 +17,10 @@ Go-Files mit der Bezeichnung \texttt{<<Name>>\_test.go} beinhalten Whitebox-Test
\newpage \newpage
\subsection{Schnittstellen zu anderen Microservices} \subsection{Schnittstellen zu anderen Microservices}
\label{subsec: Schnittstellen zu anderen Microservices} \label{subsec: Schnittstellen zu anderen Microservices}
Der Microservice Warenwirtschaft weißt drei Schnittstellen\footnote{Da es nicht Teil der übergeordneten Aufgabenstellung war, die Microservices der einzelnen Projektgruppen zu einem lauffähigen Webshop zusammenzufügen, greift die Warenwirtschaft an diesen Stellen auf Testdaten zurück} zu anderen Microservices auf. Zunächst greift der Microservice Warenwirtschaft für die Authentifizierung der Benutzer des Admin-Frontends vollständig auf einen Microservice Benutzerauthentifizierung zurück. Anstelle einer Login-Maske weißt das Admin-Frontend deshalb nur einen Icon in Form eines Schlosses auf. Dieser symbolisiert, ob ein Benutzer die passende Berechtigung für das Admin-Front besitzt (Schloss geschlossen) oder nicht (Schloss geöffnet). \par Der Microservice Warenwirtschaft weißt drei Schnittstellen\footnote{Da es nicht Teil der übergeordneten Aufgabenstellung war, die Microservices der einzelnen Projektgruppen zu einem lauffähigen Webshop zusammenzufügen, greift die Warenwirtschaft an diesen Stellen auf Testdaten zurück} zu anderen Microservices auf. Zunächst greift der Microservice Warenwirtschaft für die Authentifizierung der Benutzer des Admin-Frontends vollständig auf einen Microservice Benutzerauthentifizierung zurück. Anstelle einer Login-Maske weißt das Admin-Frontend deshalb nur einen Icon in Form eines Schlosses auf. Dieser symbolisiert, ob ein Benutzer die passende Berechtigung für das Admin-Front besitzt (Schloss geschlossen) oder nicht (Schloss geöffnet).
Weiter benötigt der Microservice Warenwirtschaft Informationen darüber, ob ein Benutzer eine Ware in den Warenkorb gelegt hat und ob eine Bestellung abgeschlossen wurde. So können Waren im Warenkorb für die Bestellung durch andere Benutzer blockiert und die erfolgreich bestellten Waren aus dem Warenbestand gelöscht werden. Diese Funktionalitäten setzen eine Schnittstelle zu dem Microservice Bestellung voraus. \par Durch diesen Icon wird ein Session-Token gesetzt, welcher durch den gemocked Authentifizierten Microservice die benötigten Berechtigungen erlaubt.\par
Die dritte Schnittstelle besteht zu dem Microservice Produktkatalog, von welchem die Warenwirtschaft die angebotenen Produkte -- die sich dementsprechend im Lager befinden können -- abfragt. Das nachfolgende Listings zeigt die Daten, die von dem Microservices Produktkatalog im JSON-Format erwartet werden. Weiter benötigt der Microservice Warenwirtschaft Informationen darüber, ob ein Benutzer eine Ware in den Warenkorb gelegt hat und ob eine Bestellung abgeschlossen wurde. So können Waren im Warenkorb für die Bestellung durch andere Benutzer blockiert und die erfolgreich bestellten Waren aus dem Warenbestand gelöscht werden. Diese Funktionalitäten wird durch eine Schnittstelle zu dem Microservice Bestellung zur Verfügung gestellt. Für ein interaktiven Test, wurde ein kleiner Warenkorb Webseite entwickelt, welcher im localStorage des Webbrowsers benutzt.\par
Die dritte Schnittstelle besteht zu dem Microservice Produktkatalog, von welchem die Warenwirtschaft die angebotenen Produkte -- die sich dementsprechend im Lager befinden können -- abfragt. Das nachfolgende Listings zeigt die Daten, die von dem Microservices Produktkatalog im JSON-Format erwartet werden.
\begin{lstlisting}[caption=Datenabfrage aus dem Produktkatalog] \begin{lstlisting}[caption=Datenabfrage aus dem Produktkatalog]
{ {
@ -28,10 +33,17 @@ Die dritte Schnittstelle besteht zu dem Microservice Produktkatalog, von welchem
\newpage \newpage
\subsection{Presentation Layer -- Admin-Frontend} \subsection{Presentation Layer -- Admin-Frontend}
\label{subsec: Presentation Layer} \label{subsec: Presentation Layer}
Der Presentation Layer umfasst alle Packages, die sich mit der eigentlichen Darstellung der Warenwirtschaft aus der Sicht des Endbenutzers befassen. Im Detail ist dies das Package \texttt{webroot}, welches den statischen Inhalt der Frontends, wie zum Beispiel die HTML-Files und Bilder enthält. \par Der Presentation Layer umfasst alle Packages, die sich mit der eigentlichen Darstellung der Warenwirtschaft aus der Sicht des Endbenutzers befassen. Im Detail ist dies das Package \texttt{webroot}, welches den statischen Inhalt der Frontends, wie zum Beispiel die HTML-Files und Bilder enthält. \par
Die Startseite \textit{List} des Admin-Frontends zeigt eine Übersicht aller vorhandenen Produkte mit ihrer Anzahl an Waren (Abbildung \ref{pic:Admin-Frontend -- Produktseite}). Letztere wird mit einem Ampelsystem dargestellt, wobei ein vollkommen rot gefärbter Kreis einem Warenbestand von null entspricht und der Kreis sich mit zunehmender Anzahl an Waren immer mehr grün eingefärbt. Zu jedem Produkt können über den, mit einem Plus, gekennzeichneten Button Waren hinzugefügt werden. Ein Klick auf das jeweilige Produkt führt zu dessen Produktseite. \par Die Startseite \textit{List} des Admin-Frontends zeigt eine Übersicht aller vorhandenen Produkte mit ihrer Anzahl an Waren (Abbildung \ref{pic:Admin-Frontend -- List}). Letztere wird mit einem Ampelsystem dargestellt, wobei ein vollkommen rot gefärbter Kreis einem Warenbestand von null entspricht und der Kreis sich mit zunehmender Anzahl an Waren immer mehr grün eingefärbt. Zu jedem Produkt können über den, mit einem Plus, gekennzeichneten Button Waren hinzugefügt werden. Ein Klick auf das jeweilige Produkt führt zu dessen Produktseite. \par
Die Produktseiten führen die ID, die Gesamtanzahl an Waren sowie die einzelnen Waren auf (Abbildung \ref{pic:Admin-Frontend -- Produktseite}). Diese können jeweils über den Icon in Form eines Mülleimers manuell gelöscht werden. Auch auf den Produktseiten sind über einen, mit einem Plus gekennzeichneten, Button neue Waren hinzufügbar. Beim Hinzufügen von neuen Waren sind für diese ein Ablaufdatum, eine Lagerposition sowie ein Kommentar und die Anzahl anzugeben (Abbildung \ref{pic:Admin-Frontend -- Hinzufuegen von Waren}). Die Seite \textit{Statistics} gibt letztendlich einen Überblick der gesamten und der durchschnittlichen Waren im Warenbestand. Die Produktseiten führen die ID, die Gesamtanzahl an Waren sowie die einzelnen Waren auf (Abbildung \ref{pic:Admin-Frontend -- Produktseite}). Diese können jeweils über den Icon in Form eines Mülleimers manuell gelöscht werden. Auch auf den Produktseiten sind über einen, mit einem Plus gekennzeichneten, Button neue Waren hinzufügbar. Beim Hinzufügen von neuen Waren sind für diese ein Ablaufdatum, eine Lagerposition sowie ein Kommentar und die Anzahl anzugeben (Abbildung \ref{pic:Admin-Frontend -- Hinzufuegen von Waren}). Die Seite \textit{Statistics} gibt letztendlich einen Überblick der gesamten und der durchschnittlichen Waren im Warenbestand.
\begin{figure}[H]
\centering
\frame{\includegraphics[width=0.75 \textwidth]{./pics/list.png}}
\caption{Admin-Frontend -- List}
\label{pic:Admin-Frontend -- List}
\end{figure}
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\frame{\includegraphics[width=0.75 \textwidth]{./pics/product.png}} \frame{\includegraphics[width=0.75 \textwidth]{./pics/product.png}}
@ -62,11 +74,11 @@ Die Packages und Go-Files des Application Layers umfassen die Logik des Microser
\item \texttt{good\_lock.go}: Funktionen für das Blockieren von Waren, die sich im Warenkorb befinden \item \texttt{good\_lock.go}: Funktionen für das Blockieren von Waren, die sich im Warenkorb befinden
\item \texttt{good\_show.go}: Funktionen für die Auflistung und Zählung der vorhandenen Waren sowie die Feststellung ihrer Verfügbarkeit \item \texttt{good\_show.go}: Funktionen für die Auflistung und Zählung der vorhandenen Waren sowie die Feststellung ihrer Verfügbarkeit
\item \texttt{good\_temp.go}: Hilfsfunktionen, die für die Darstellung des Warenbestandes als Ampel im Kunden-Frontend benötigt werden \item \texttt{good\_temp.go}: Hilfsfunktionen, die für die Darstellung des Warenbestandes als Ampel im Kunden-Frontend benötigt werden
\item \texttt{status.go}: Funktion, die den Status des Microservice abfragt \item \texttt{status.go}: Funktion, die den Status des Microservice abfragt
\end{itemize} \end{itemize}
\paragraph{models:} Go-Files, die die zentralen Structs und zugehörige Hilfsfunktionen (hauptsächlich statischen Inhalt des Microservice) beinhalten \paragraph{models:} Go-Files, die die zentralen Structs und zugehörige Hilfsfunktionen (hauptsächlich statischen Inhalt des Microservice) beinhalten
\begin{itemize} \begin{itemize}
\item \texttt{config.go}: Structs mit den Informationen zur Konfiguration des Webservers, der Datenbank und dem Cache-Management sowie Hilfsfunktionen zum Lesen von Config-Files \item \texttt{config.go}: Structs mit den Informationen zur Konfiguration des Webservers, der Datenbank und dem Cache-Management sowie Hilfsfunktionen zum Lesen von Config-Files
\item \texttt{duration.go}: Structs und Hilfsfunktionen zur Definition eines Typs für Zeitangaben \item \texttt{duration.go}: Structs und Hilfsfunktionen zur Definition eines Typs für Zeitangaben
@ -75,14 +87,14 @@ Die Packages und Go-Files des Application Layers umfassen die Logik des Microser
\paragraph{runtime:} Go-Files mit weiteren Hilfsfunktionen \paragraph{runtime:} Go-Files mit weiteren Hilfsfunktionen
\begin{itemize} \begin{itemize}
\item \texttt{auth.go}: Hilfsfunktionen zur Prüfung, ob eine Berechtigung für den Zugriff vorliegt \item \texttt{auth.go}: Hilfsfunktionen zur Prüfung, ob eine Berechtigung für den Zugriff vorliegt
\item \texttt{cache\_worker.go}: Hilfsfunktionen für das Löschen und Anlegen von Cache-Workers \item \texttt{cache\_worker.go}: Hilfsfunktionen für das Löschen und Anlegen von Cache-Workers
\item \texttt{good\_fouled.go}: Hilfsfunktion, um abgelaufene Waren automatisch aus dem Warenbestand zu entfernen \item \texttt{good\_fouled.go}: Hilfsfunktion, um abgelaufene Waren automatisch aus dem Warenbestand zu entfernen
\item \texttt{good\_release.go}: Hilfsfunktionen zum Blockieren und Entsperren von Waren \item \texttt{good\_release.go}: Hilfsfunktionen zum Blockieren und Entsperren von Waren
\item \texttt{productcache.go}: Hilfsfunktionen zum Anlegen eines Caches für Produkte \item \texttt{productcache.go}: Hilfsfunktionen zum Anlegen eines Caches für Produkte
\end{itemize} \end{itemize}
\newpage \newpage
@ -94,14 +106,14 @@ Die Packages und Go-Files des Application Layers umfassen die Logik des Microser
\begin{itemize} \begin{itemize}
\item \texttt{io.go}: Funktionen zum Lesen und Schreiben von JSON aus beziehungsweise in HTTP-Pakete \item \texttt{io.go}: Funktionen zum Lesen und Schreiben von JSON aus beziehungsweise in HTTP-Pakete
\item \texttt{permission.go}: Funktionen zur Prüfung der Berechtigung für den Zugriff \item \texttt{permission.go}: Funktionen zur Prüfung der Berechtigung für den Zugriff
\end{itemize} \end{itemize}
\item \texttt{log}: Go-File \texttt{log.go}, das den Logger startet und initiiert \item \texttt{log}: Go-File \texttt{log.go}, das den Logger startet und initiiert
\item \texttt{worker}: Go-File \texttt{worker.go}, dass Funktionen für die Nutzung eines Caches (Worker) für die Produkte aus dem Produktkatalog bereitstellt \item \texttt{worker}: Go-File \texttt{worker.go}, dass Funktionen für regelmäßige Aktivitäten bereitstellt. (z.B. das Entsperren von Waren nach einer vorgegeben Zeit)
\end{itemize} \end{itemize}
\subsection{Persistant Layer} \subsection{Persistant Layer}
Der Persitant Layer umfasst eine SQL-Lite-Datenbank, die im Cache gehalten wird. Die nachfolgende Abbildung \ref{pic:Datenbankmodell des Microservice} zeigt den grundsätzlichen Aufbau der Datenbank. Sie speichert den Warenbestand (stock) in Produkten (product). Jedes Produkt wird mit seiner ID und seinem Namen gehalten, die aus dem Produktkatalog bezogen und in einem Cache zwischengespeichert werden. Zu jedem Produkt gehören wiederum mehrere Waren (good), die eine ID, ein Ablaufdatum, eine Lagerposition und einen Kommentar besitzen. Dabei kann eine Ware nur zu einem Produkt gehören. Die Datenbank kann über die Konfigurationsdatei \texttt{config\_example.conf}, deren relevanter Ausschnitt nachfolgend dargestellt wird, flexibel angepasst werden. Der Persitant Layer umfasst beliebige SQL-Datenbanken, diesen Tabellen-Struktur beim starten automatisch angelegt. Die nachfolgende Abbildung \ref{pic:Datenbankmodell des Microservice} zeigt den grundsätzlichen Aufbau der Datenbank. Sie speichert den Warenbestand (stock). Zur Referenzierung wird vom Produkt die ID verwendet, die aus dem Produktkatalog bezogen und bei Anfrage in einem Cache zwischengespeichert werden. Vom Mircoservice werden nur die Waren (good) gespeichert und verwaltet, die eine ID, ein Ablaufdatum, eine Lagerposition und einen Kommentar besitzen. Dabei kann eine Ware nur zu einem Produkt gehören. Die Datenbank kann über die Konfigurationsdatei \texttt{config\_example.conf}, deren relevanter Ausschnitt nachfolgend dargestellt wird, flexibel angepasst werden. Zum Testen wurde eine SQL-Lite-Datenbank vorkonfiguriert, die im Cache gehalten wird.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
@ -123,8 +135,9 @@ connection = "file::memory:?mode=memory&cache=shared"
\newpage \newpage
\subsection{Integrierte Tests} \subsection{Integrierte Tests}
\label{subsec: Integrierte Test} \label{subsec: Integrierte Test}
Neben den bisherigen Packages, die bereits Whitebox-Tests umfassen, ist in dem Package \textbf{\texttt{test}} ein weiteres Go-File (\texttt{testrest.go}) enthalten. Dieses setzt einen Test des Webservers um, bei dem auf Testdaten eines Produktkataloges zurückgegriffen wird. Mit Hilfe der integrierten Tests wird in der hier beschriebenen Version eine Code-Coverage von 100\% erreicht, das heißt jedes Stück Code wird mindestens einmal zur Ausführung gebracht. Neben den bisherigen Packages, die bereits Whitebox-Tests umfassen, ist in dem Package \textbf{\texttt{test}} ein weiteres Go-File (\texttt{testrest.go}) enthalten. Dieses setzt einen Testumgebung um, bei dem auf Testdaten eines Produktkataloges zurückgegriffen wird. Mit Hilfe der integrierten Tests wird in der hier beschriebenen Version eine Code-Coverage von 100\% erreicht, das heißt jedes Stück Code wird mindestens einmal zur Ausführung gebracht.
Dies bedeutet nicht, dass dieser Mircoservice fehlerfrei ist, sondern lediglich das aus Entwickler-Sicht, alles getan wurde.
\subsection{Anpassung des Monolithen} \subsection{Anpassung des Monolithen}
\label{subsec: Anpassung des Monolithen} \label{subsec: Anpassung des Monolithen}
Damit der Microservice Warenwirtschaft durch den bestehenden Monolithen des Webshops Mosh genutzt werden kann, wurden hier die unter dem Anhang \ref{changes} aufgeführten Änderungen vorgenommen. Damit der Microservice Warenwirtschaft durch den bestehenden Monolithen des Webshops Mosh genutzt werden kann, wurden hier die unter dem Anhang \ref{changes} aufgeführten Änderungen vorgenommen.

View File

@ -0,0 +1,183 @@
From 0754b05118df8af98963428fe32baf7a81920cb7 Mon Sep 17 00:00:00 2001
Date: Thu, 22 Jun 2017 20:15:07 +0200
Subject: [PATCH] [TASK] patch for microservice stock
---
.../monolith/domain/DataTransferObjectFactory.java | 2 ++
.../de/mstock/monolith/domain/ProductRepository.java | 5 +++++
.../java/de/mstock/monolith/service/ShopService.java | 13 +++++++++++++
.../java/de/mstock/monolith/web/HomepageController.java | 17 +++++++++++++++--
.../java/de/mstock/monolith/web/ProductController.java | 15 +++++++++++++++
src/main/java/de/mstock/monolith/web/ProductDTO.java | 10 ++++++++++
src/main/resources/templates/product.html | 4 ++++
7 files changed, 64 insertions(+), 2 deletions(-)
diff --git a/src/main/java/de/mstock/monolith/domain/DataTransferObjectFactory.java b/src/main/java/de/mstock/monolith/domain/DataTransferObjectFactory.java
index 914d1ae..b026020 100644
--- a/src/main/java/de/mstock/monolith/domain/DataTransferObjectFactory.java
+++ b/src/main/java/de/mstock/monolith/domain/DataTransferObjectFactory.java
@@ -86,6 +86,8 @@ private ProductDTO createProductWithoutReviewsDTO(Product product, Locale locale
ProductI18n i18n = product.getI18n().get(locale.getLanguage());
String price = numberFormat.format(i18n.getPrice());
ProductDTO productDTO = new ProductDTO();
+ // Addition: productDTO.setID()
+ productDTO.setId(product.getId());
productDTO.setItemNumber(product.getItemNumber());
productDTO.setUnit(product.getUnit());
productDTO.setName(i18n.getName());
diff --git a/src/main/java/de/mstock/monolith/domain/ProductRepository.java b/src/main/java/de/mstock/monolith/domain/ProductRepository.java
index e811855..d72fb53 100644
--- a/src/main/java/de/mstock/monolith/domain/ProductRepository.java
+++ b/src/main/java/de/mstock/monolith/domain/ProductRepository.java
@@ -1,5 +1,7 @@
package de.mstock.monolith.domain;
+import java.util.List;
+
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
@@ -9,4 +11,7 @@
+ "where key(i) = ?1 and lower(i.name) = ?2")
Product findByI18nName(String language, String name);
+ @Query("select p from Product p")
+ List<Product> findAll();
+
}
diff --git a/src/main/java/de/mstock/monolith/service/ShopService.java b/src/main/java/de/mstock/monolith/service/ShopService.java
index c230e45..c96f266 100644
--- a/src/main/java/de/mstock/monolith/service/ShopService.java
+++ b/src/main/java/de/mstock/monolith/service/ShopService.java
@@ -59,6 +59,19 @@
}
/**
+ * Gets all products in the current language.
+ *
+ * @return A simplified Data Transfer Object.
+ */
+ public List<ProductDTO> getAllProducts(Locale locale) {
+ String language = locale.getLanguage();
+ List<Product> products = productRepository.findAll();
+ List<ProductDTO> productsDTO =
+ dtoFactory.createProductWithoutReviewsDTOs(products, locale);
+ return Collections.unmodifiableList(productsDTO);
+ }
+
+ /**
* Gets a product in the current language.
*
* @return A simplified Data Transfer Object.
diff --git a/src/main/java/de/mstock/monolith/web/HomepageController.java b/src/main/java/de/mstock/monolith/web/HomepageController.java
index 90a0acc..4395a42 100644
--- a/src/main/java/de/mstock/monolith/web/HomepageController.java
+++ b/src/main/java/de/mstock/monolith/web/HomepageController.java
@@ -17,11 +17,24 @@
@Autowired
private ShopService shopService;
+ // Addition: contant with the address of the stock microservice adminfrontend
+ private final String STOCKADMINFRONTENDTEMPLATE = "https://stock.pub.warehost.de/index.html";
/**
- * Homepage
- *
+ * Redirect to stock admin frontend
+ *
* @param model Template model
+ * @return The constant template name for the stock admin frontend.
+ */
+ @RequestMapping(value = "/stockadmin", method = RequestMethod.GET)
+ public String redirect(Model model) {
+ return "redirect:" + this.STOCKADMINFRONTENDTEMPLATE;
+ }
+
+ /**
+ * Homepage
+ *
+ * @param model Template model
* @param locale Current locale
* @return The template's name.
*/
diff --git a/src/main/java/de/mstock/monolith/web/ProductController.java b/src/main/java/de/mstock/monolith/web/ProductController.java
index 52f1ed3..5fbcacf 100644
--- a/src/main/java/de/mstock/monolith/web/ProductController.java
+++ b/src/main/java/de/mstock/monolith/web/ProductController.java
@@ -1,6 +1,7 @@
package de.mstock.monolith.web;
import java.util.Locale;
+import java.util.List;
import javax.validation.Valid;
@@ -11,6 +12,7 @@
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
import de.mstock.monolith.service.ReviewService;
import de.mstock.monolith.service.ShopService;
@@ -66,4 +68,17 @@ public String post(@Valid ReviewForm reviewForm, BindingResult bindingResult,
model.addAttribute("product", shopService.getProduct(locale, prettyUrlFragment));
return TEMPLATE;
}
+
+ @RequestMapping(value = "/products/{prettyUrlFragment:[\\w-]+}.json", method = RequestMethod.GET)
+ @ResponseBody
+ public ProductDTO productJson(@PathVariable String prettyUrlFragment, Locale locale) {
+ return shopService.getProduct(locale, prettyUrlFragment);
+ }
+
+ @RequestMapping(value = "/products.json", method = RequestMethod.GET)
+ @ResponseBody
+ public List<ProductDTO> allProductJson(Locale locale) {
+ return shopService.getAllProducts(locale);
+ }
+
}
diff --git a/src/main/java/de/mstock/monolith/web/ProductDTO.java b/src/main/java/de/mstock/monolith/web/ProductDTO.java
index a5b76b6..a7d3245 100644
--- a/src/main/java/de/mstock/monolith/web/ProductDTO.java
+++ b/src/main/java/de/mstock/monolith/web/ProductDTO.java
@@ -6,6 +6,7 @@
public class ProductDTO {
+ private int id;
private String itemNumber;
private ProductWeightUnit unit;
private String name;
@@ -14,6 +15,15 @@
private String description;
private List<ReviewDTO> reviews;
+ // Addition: int id, getId() and setID()
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
public String getItemNumber() {
return itemNumber;
}
diff --git a/src/main/resources/templates/product.html b/src/main/resources/templates/product.html
index 0d7bc31..9b2d0bf 100644
--- a/src/main/resources/templates/product.html
+++ b/src/main/resources/templates/product.html
@@ -31,6 +31,10 @@
</div>
<div class="col-md-8">
<h2 th:text="${product.name}">Product Name</h2>
+
+ <!-- Addition: traffic light food labeling system of the stock microservice -->
+ <img width="10%" class="icon" th:src="${'https://stock.pub.warehost.de/api/good/availablity/'+product.id}"/>
+
<p class="text-info text-uppercase" th:text="${product.price}">0,00 Euro</p>
<p class="lead" th:text="${product.description}">Description.</p>
<div th:replace="fragments/reviews :: reviews"></div>