1

merge fix

Co-authored-by: Christoph <tobi@urpost.de>
This commit is contained in:
Christoph
2020-03-26 17:20:58 +01:00
parent f15d1f850d
commit 82e9611d47
36 changed files with 489 additions and 0 deletions

BIN
documentation/DB.pdf Normal file

Binary file not shown.

View File

@ -0,0 +1,27 @@
= Fortschritt Tag 1
=== GutHub-Repo
- Branch-Protection aktiviert
- CI-Workflow erstellt
=== Spring-Skelett
Projekt initialisiert mit
- Spring-Actuator
- Spring-Devtools
- Thymeleaf
- Spring Data JDBC
- Spring Web
- Spring Security
- H2 Database
- Lombok
Wir haben uns für eine H2 Datenbank wärend der Entwicklung entschieden.
Wir haben uns wegen kleinen Datenbankanforderungen und Verständnis für Spring Data JDBC entschieden.
Zusätzliche Dependencies:
- ArchUnit
- AssertJ
- Spotbugs
- Checkstyle

View File

@ -0,0 +1,33 @@
= Fortschritt Tag 2
=== Datenbankschema
Wir haben ein simplifiziertes Datenbankschema aufgebaut um die Grundfunktionalität zu implementieren und die Entitäten implementiert.
=== Dockerfile
Wir haben ein Dockerfile geschrieben, welches ein jar-file baut ausführt.
== API
- Swagger2 für Springboot hinzugefügt und einen Beispielcontroller mit einer Produktliste erstellt.
== Entities
- Entities für die Logik in der Java application erstellt
- ToDo: DTO klassen für das handleln der Datenbank erstellen
== Checkstyle
- nerviges Problem mit Checkstyle gefixt bei dem die Imports immer alphabetisch sortiert werden mussten(!?)
== KeyCloak
- implementiert, dass man mit einer Rolle angemeldet sein muss, um auf die index.html zu gelangen.
- @Sessionscope mit rein gepackt, noch nicht 100% sicher ob es funktioniert
== Webdesign
- Wir haben an der index.html gearbeitet.
Es gab jedoch Probleme mit Spring Security, weshalb die Änderungen nicht hochgeladen wurden.
Der Fehler wurde jedoch nun gefunden.

View File

@ -0,0 +1,32 @@
= Fortschritt Tag 3
== Datenbankschema
Mit Jens' Input haben wir uns beim Datenbankschema umentschieden.
Wir werden eine Tabelle nutzen die die alle Operationen chronologisch speichert.
Die Operationen beinhalten:
- `add Student`
- `del Student`
- `create Group`
- `del Group`
- `addAdmin Student`
- `delAdmin Student`
(These Operations Operations are not final and can be subject to change ;P)
Sie soll nach dem Prinzip funktionieren wie in DB.pdf
Dazu kommen noch weitere Spalten wie StudentID, StudentName und GroupID. So kann eine einfache Gruppierung anhand der Identifier stattfinden.
== Schnittstelle (Idee)
Wir wollen anderen Gruppen die gesamte history, abhängig von der letzten ID die sie an uns mit einem Request schicken, schicken.
Die Implementierung und das Handling in ihrem eigenen Modul wollen wir momentan noch ihnen überlassen.
Also würden wir die Daten nicht Verarbeiten bevor wir sie rausgeben.
Falls das Verarbeiten der Daten am Ende der Nutzer zu lange Dauert könnte man darüber nachdenken die Daten im eigenen Modul zu cachen und kompakter rauszugeben
== Spotbugs
- Das reportlevel = "high" von spotbugs entfernt.
Vorher hat spotbugs eine arrayOutOfBound nicht gemeldet.

View File

@ -0,0 +1,41 @@
= Fortschritt Tag 4
== Datenbankschema
Also wir haben wieder leichte Veränderungen am Datenbankmodell vorgenommen.
Wir werden Eventsourcing als Persistenzmodell Verwenden.
Die Datenbank besteht nun aus den Spalten:
`event_id` `group_id` `user_id` und `eventpayload`.
Die Spalte `eventpayload` wird im JSON-Format representiert und beinhaltet alle Infos zu veränderungen.
Ganz vorne steht die Action die stattfand, welche wir in 7 mögliche Actions unterteilt haben:
- `DeleteGroup`
- `CreateGroup`
- `AddUser`
- `DeleteUser`
- `UpdateRolle`
- `UpdateGroupTitle`
- `UpdateGroupDescription`
== Gruppenservice/Events
Wir verwenden nun einen Datentyp `Event` um die verschiedenen Events zu handleln.
Es wird eine Eventliste als Parameter an eine überladene Methode in die `Gruppe` Klasse übergeben.
Vom Datentyp Event erben die Verschiedenen Events die wir in der DB haben und haben einen entsprechenden Konstruktor:
public class CreateGroupEvent extends Event {
String titel;
String beschreibung;
public CreateGroupEvent(long id, long gruppe_id, String user_id, String titel, String beschreibung)
{
super(id, gruppe_id, user_id);
this.titel = titel;
this.beschreibung = beschreibung;
}
}
== Tests
Wir haben Tests zu den `applyEvent()` Methoden geschrieben aber müssen noch weitere Logik testen.

View File

@ -0,0 +1,25 @@
= Fortschritt Tag 4
== Event -> Group
Hier haben wir uns mit der übersetzung von den Events zu den Gruppen klassen beschäftigt und Exeptions entwickelt.
Auch einige User-cases wie doppeltes einfügen von Gruppenmitgliedern wir jetzt abgefangen.
Außerdem wurden Test dazu geschrieben.
== Event
Wir haben heute das speichern von Events gemacht.
Darüber hinaus haben wir das Serializieren und Deserializeren der JSON Daten implementiert.
Hierfür haben wir Jackson benutzt.
== Controller
Wir haben damit angefangen den Input über die UI zu interpretieren, dabei haben wir gemerkt dass wir viele weitere Methoden für das Java Backend schreiben müssen welche wir als nächstes erstellen.
== Tests
Wir haben mit ArchUnit-Tests die Programm-Architektur überprüft und festgelegt.
== Templates und UI
Wir haben die Templates für search.html und create.html erweitert.

View File

@ -0,0 +1,16 @@
== Tag 6
= Gruppen abspeichern
Wir haben uns heute darum gekümmert über die UI eine Gruppe zu erstellen und diese in die Datenbank zu schreiben. Der Ersteller der Gruppe wird momentan mit in die Gruppe eingefügt das kann später noch verändert werden. Alle Logik findet momentan im Controller statt was später noch verändert wird.
= Tests
Architekturtests erweitert und umstrukturiert, neue tests für die deserialisierung (die sind ein wenig unnötig) und tests für die neue projectGruppen() methode.
= ProjectionService
Die Eventliste wird komplett gelesen und zu gruppen verarbeitet Außerdem kann man Gruppen IDs nach User erhalten
= UI
Styling verbessert

View File

@ -0,0 +1,15 @@
= Tag 7
== Heute haben wir über die Struktur diskutiert. Wir sind zum folgenden Ergebnis gekommen:
* Wir haben uns für zwei Maps entschieden
** 1. In der einen Map mappen wir die group_id mit der Gruppe.
** 2. In der anderen Map mappen wir die user_id mit einer Liste von Gruppen ids.
** Beide Maps haben die Funktion, schneller auf die Gruppen zuzugreifen.
Dafür haben wir einen neuen Branch erstellt und ein paar Funktionen implementiert.
Danach haben wir nochmal Rücksprache mit Jens und Christian gehalten und gemerkt, dass die Implementierung über Maps nicht so vorteilhaft ist wie wir gedacht haben.
Der Code wäre zu verwirrend und unübersichtlich.
Auch wenn wir es so weitermachen könnten, haben wir uns für die Idee mit den Querys entschieden, da wir das als übersichtlicher empfinden.
Ebenfalls haben wir die Readme geschrieben.

View File

@ -0,0 +1,24 @@
= Tag 8
== APIController
Wir haben einen Controller für die Anfragen der anderen Gruppen geschrieben.
Die Anfrage enthält den aktuellen Status der Gruppe und liefert als JSON Objekt den neuen Status und die Liste mit den Gruppen die sich geändert haben.
Zzusätlich gibt es eine Wrapperklasse, um die Objekte die wir herausgeben mit der anderen Gruppenbildung-Gruppe anzugleichen.
== Testing
Der Eventbuilder wurde verbessert, sodass leichter mit großen Mengen von events getestet werden kann.
Zusätlich gibt es eine Wrapperklasse, um die Objekte die wir herausgeben mit der anderen Gruppenbildung-Gruppe anzugleichen.
== Dokumentation
Wir haben heute fünf Punkte von Arc42 bearbeitet, da wir jetzt wissen, wie unser Projekt genau aussehen soll.
Außerdem haben wir für eine bessere Lesbarkeit angefangen, den Funktionen Kommentare hinzuzufügen.
== Frontend
Wir heute wurde die Funktionalität des Erstellens von Gruppen und der Anzeige der eigenen Gruppen hergestellt.
Das Template funktioniert nun korrekt mit dem Code.
Außerdem haben wir das Styling der 3 bestehenden HTML-Templates verbessert und mit der Anwendung abgestimmt.

View File

@ -0,0 +1,21 @@
= Tag 9
== Frontend
Wir haben das Styling des Formulars zur Gruppenerstellung verbessert und die fehlenden Optionen zum Teil hinzugefügt.
Außerdem haben wir eine Anzeige für die Details einer Gruppe erschaffen, die auch mit dem Programm funktioniert, und das Styling der Seite angepasst.
Wir haben uns entschieden, getrennte HTML-Files zu erstellen: Eins für den Link von der Liste der eigenen Gruppen aus und eins für den Link über die Suche, in der der User kein Mitglied ist, damit ihm im letzteren Fall die Optionen, die ein Mitglied hätte, unzugänglich sind.
== API Controller
Den API Controller haben wir voerst fertiggestellt.
Alle Anfragen die wir bisher bearbeiten wollen, werden nun auch bearbeitet.
== EventService Tests
In Zusammenhang mit dem API Controller haben wir ein paar Tests für den Eventservice erstellt, da auch hier einige neue Methoden hinzugefügt wurden und sich der Controller selbst nur schwer testen lässt.
== DB und Backend
Heute haben wir uns darum gekümmert der Datenbank die Spalte visibility hinzuzufügen, damit wir schneller nach öffenlichen und privaten Gruppen suchen können.
Ebenfalls haben wir die Suche nach öffentlichen Gruppen implementiert.

View File

@ -0,0 +1,19 @@
= Tag 10
== Frontend
Heute haben wir eine Error-Seite erstellt, die aber noch nicht error.html heißt, damit noch die normale Error-Seite mit dem Log angezeigt wird.
Die Seite wird umbenannt, sobald das Frontend in Kombination mit dem Backend funktioniert.
Außerdem haben wir die Detailseite überarbeitet, auf die man weitergeleitet wird, wenn man von der Suche aus kommt.
Die Seite zeigt nun die richtigen Informationen an.
Die benötigten Methoden haben wir in den Controller geschrieben.
== Keycloak
Änderungen an Keycloakanbindung -> APIController abgesichert
== Backend
Wir haben uns heute um die Umstrukturierung der Vererbung gekümmert.
Vorher hatten wir die Methoden die Einfluss auf die Gruppe nehmen(also die Events) in der Klasse Group.
Jetzt haben wir es so umgebaut, dass wir in die einzelnen Events die Gruppe reingeben und die Methode in dem jeweiligen Event ausgeführt wird.

View File

@ -0,0 +1,22 @@
= Tag 11
== Frontend
Heute haben wir eine Seite zum Bearbeiten der Mitglieder eine Gruppe mit den entsprechenden Controllern geschrieben.
Außerdem haben wir das Styling aller Seiten vereinheitlicht.
== InviteLink
Es wird nun beim erstellen einer privaten Gruppe ein Einladungslink erstellt, der zusammen mit der zugehörigen GroupID in einer seperaten Tabelle gespeichert wird.
Der Link soll Admins auf der Detailsseite der Gruppe angezeigt werden.
Über den Link kommt man dann zur Beitrittsseite der jeweiligen Gruppe.
Bei dem Löschen der Gruppe muss in Zukunft auch noch das löschen des Links hinzugefügt werden.
== Backend
Heute haben wir alte Fehlermeldungen implementiert.
Wir haben außerdem das beitreten in eine Gruppe über die UI implementiert.
Zudem haben wir angefangen eine extra Seite zu erstellen, wo man Gruppen über eine csv Datei eine Gruppe erstellen kann.
Dort hatten wir Schwierigkeiten einen Button je nach Role des Users anzeigen zu lassen.
Das Problem lag im th:if.
Dort hatten wir anstatt das ' ' -> " "

View File

@ -0,0 +1,29 @@
= Tag 12
== Backend
zeiHeute haben wir uns darum gekümmert eine Veranstaltung mit einer csv Datei zu erstellen.
Außerdem haben wir die Suchfunktion verbessert.
Bedeutet Groß und Kleinschreibung wird ignoriert, damit eine bessere suche möglich ist.
Außerdem haben wir die Suchfunktion verbessert.
== Frontend
Heute haben wir die Templates für das Editieren von Mitgliedern der Gruppe fertiggestellt und den entsprechenden Buttons ihre Funktion gegeben.
Das Frontend ist nun im groben fertig, es fehlt nur noch der Feinschliff.
Außerdem haben wir einige Changes am Styling gemacht, damit alles konsistenter und schöner aussieht.
== CSv-Import
Heute haben wir uns darum gekümmert eine Veranstaltung mit einer csv Datei zu erstellen.
Außerdem kann jetzt ein orga auch in der gruppenübersicht -> mitgliedglider bearbeiten über eine csv-datei mitglieder hinzufügen.
Wenn man die CSV-Datei auswählt wird nun ihr Name auf der website angezeigt.
== Eventservice
Checkgroup Methode auf Query umgestellt(performence)
== ErrorHandling
Errorpage angepasst und als default gesetzt.
Außerdem die Exceptions überarbeitet, deren Message wird nun auch auf der Errorpage angezeigt.

View File

@ -0,0 +1,22 @@
= Tag 13
== Performance Tests
Wir haben ein paar Performancetests geschrieben und geschaut, wo man eventuell noch optimierungen vornehmen kann.
Dann ist uns aufgefallen das das wahrscheinlich so gar nicht so sinnvoll ist.
== Entadminisierung
Wir haben um gekümmert dass in jedem Fall mindestens ein admin in einer gruppe bestehen bleibt.
== Funktionen
Heute haben wir uns darum gekümmert das unsere Gruppen ein Beitrittslimit haben.
Das kann man bei normalen Gruppen über die UI einstellen.
Für Vorlesungen haben wir uns entschieden erstmal einen festen Wert zu nehmen, da wir uns noch uneinig sind ob wir die Gruppengröße Anpassbar machen wollen.
Ebenfalls haben wir Probleme bei der Suchefunktion und beim Beitrittslimit gefixt.
== Frontend
Heute haben wir das Styling weiter verbessert und vereinheitlicht.
Außerdem haben wir die Funktion eingebunden, dass man die tatsächliche und die maximale Anzahl Mitglieder sehen kann.

View File

@ -0,0 +1,23 @@
= Tag 14
== Gruppen löschen
Wir haben die Funktionalität Gruppen zu löschen für die Admins ermöglicht.
Darüber hinaus werden Gruppen gelöscht wenn sie keine Mitglieder mehr haben
== MaxUser anpassen
Die Anzahl der Maximalen User wird immer angepasst wenn beim hinzufügen über CSV die Grenze überschritten wird.
== Suche optimiert
Grundlegende überlegungen zur Suche gemacht und mit Grundgerüst angefangen
== Links anzeigen
Angefangen zu implementieren, dass die InviteLinks von privaten Gruppen auf der details Seite angezeigt werden.
== API
Schnittstelle zum erstellen von Gruppen angelegt.
Wird jetzt wohl doch nicht mehr gebraucht ...

View File

@ -0,0 +1,23 @@
= Tag 15
== Event
Heute haben wir ein neues Event hinzugefügt.
Dieses bewirkt das man die maximale Teilnehmer Zahl ändern kann.
== Fehler
Heute haben wir Fehler die mit dem neuen Event aufgetaucht sind behoben.
Außerdem auch andere die uns jetzt erst aufgefallen sind.
Wir haben heute angefangen unsere Tests zu refactorn.
== Invite Link
Der Einladungslink von privaten Gruppen wird nun auf der Details Seite angezeigt und kann per Button kopiert werden.
Die Server URL ist bei Verbindung über localhost aber noch fehlerhaft.
Um dies zu beheben wurde localhost gehardcoded, was unbedingt am Ende entfernt werden sollte.
== Frontend
Heute haben wir einen Scrollbar für die Mitgliederliste eingefügt und das Styling bei "EditMembers.html" angepasst.

View File

@ -0,0 +1,31 @@
= Tag 16
== Documentation
Heute haben wir an der arc42-Dokumentation weitergearbeitet und die ersten Abschnitte fertiggestellt.
== Tests
Heute haben wir damit weiter gemacht unsere Tests zu Refactorn.
Diese müssen sowieso noch angepasst werden weil wir für die GruppenId jetzt eine UUID nutzen.
== Controller
Wir haben den Controller refactored da zu viel Logik in den Methoden waren.
Diese haben wir zum größten Teil in den Controllerservice ausgelagert.
== Titel und Beschreibung
Wir haben eine Seite erstellt über die man den Titel und die Beschreibung einer Gruppe nachträglich noch anpassen kann.
== Suche reparieren
Man kann nicht wieder beitreten sobald man die Gruppe verlassen hat
== changeMetaData
Der Titel und die Beschreibung sind nun bearbeitbar über die Detailseite der Gruppe.
== InviteLink
Der Einladungs Link wird nun richtig zusammengebaut und angezeigt.

View File

@ -0,0 +1,22 @@
= Tag 17
== Documentation
Heute haben wir an der arc42-Documentation weitergearbeitet.
== Gruppensuche
Die Gruppensuche funktioniert nun, auch nach mehrfachem verlassen und beitreten der selben Gruppe.
== sortierte Gruppen
Die Gruppen werden nun sowohl auf der Startseite als auch bei der Suche sortiert nach Veranstaltung und normaler Gruppe angezeigt.
== Checkstyle und Spotbugs
Alle Fehler wurden behoben auf dem aktuellem Stand des masters.
== Tests und Refactorn
Wir haben heute unsere Tests für GroupService Refactort.
Außerdem haben wir damit angefangen unsere Klasse ControllerService und unsere Tests dazu zu Refactorn.

View File

@ -0,0 +1,28 @@
= Entscheidungsfindung
=== Tag 1
- H2 Datenbank: In-Memory, startet automatisch, schnell
=== Tag 2
- Swagger für API: Automatische Doku + Interaktive UI
- MySql für Production: Wir wissen nix besseres + JSON Datatype
- Checkstyle: Google als Basis, Einrückung auf 4 spaces erhöht
=== Tag 3
- Spring Security verringert für H2-Console
- Event Sourcing: Hat jens gesagt klingt cool
=== Tag 4
-
=== Tag 5
- Jackson für JSON: Spring dabei + Einfaches handling von subklassen
- Lombok event annotations: Jackson braucht den defaultconstructor
- Fehlerbehandlung: Exceptions zum besseren umgang in tests etc
=== Tag 6

View File

@ -0,0 +1,21 @@
= To Dos der Documentation
== Kontextabgrenzung in 03
* Fachlicher Kontext mit Diagramm
* Technischer Kontext mit Diagramm
== Blocksicht des Aufbaus in 05
* 1000 verschiedene sachen
== Laufzeitsicht in 06
* auch todes viel
== Noch ne sicht in 07
* auch ass viel
== Mehr Konzepte hinzufügen in 08

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

5
pull-wait-for-it.sh Normal file
View File

@ -0,0 +1,5 @@
#!/bin/sh
if [ ! -f wait-for-it.sh ]; then
wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh
fi

View File

@ -0,0 +1,10 @@
DROP TABLE IF EXISTS event;
CREATE TABLE event
(
event_id INT PRIMARY KEY AUTO_INCREMENT,
group_id VARCHAR(36) NOT NULL,
user_id VARCHAR(50),
event_type VARCHAR(32),
event_payload VARCHAR(2500)
);