Tag System - Archi-Lab/prox-project-service GitHub Wiki
Tag System
Der Project-Service sollte im Rahmen des GP-WS2019 um Tags (MVP) erweitert werden. Im folgenden wird der für den Project Service spezifische Teil eräutert.
Beim Erstellen von Projekten sollen Tags vergeben werden können, welche anschließend in der Projektübersicht und Projektansicht angezeigt werden. Zusätzlich sollen Tags vorgeschlagen werden können, aufgrund der Häufigkeit, in der sie bereits gemeinsam verwendet wurden. Dazu wurde folgendes Konzept erarbeitet und umgesetzt.
Konzept
Die folgende Grafik zeigt eine Erweiterung der Datenbankansicht des Projects um Tags.
Ein Tag ist immer nur ein Name (String), welcher mit einer UUID (ID) versehen wird, um doppelte Einträge zu verhindern und diese leichter zählen zu können. Jedem Projekt können beliebig viele Tags zugeordnet werden. Diese Zuordnung wird mittels der Tabelle Project_Tags abgebildet.
In der Tabelle Tag_Counter werden die Tag Kombinationen gezählt. Also wie oft ein Tag in Kombination mit einem anderen Tag verwendet wurde, um Vorschläge für weitere Tags beim Bearbeiten von Projekten unterbreiten zu können. Mithilfe eines Timers wird diese Zählung in regelmäßigen Abständen aktualisiert.
Implementierung
Die Klasse ProjectTag wurde erstellt und Projekte können eine Liste von Tags haben.
Bei der Zählung von Tagkombinationen werden alle bestehenden Projekte durchlaufen und dabei die Tags betrachtet. Für jede Tagkombination wird ein Eintrag mithilfe der Klasse TagCounter angelegt. Diese speichert sich Referenzen auf 2 Tags, sowie die Anzahl an Vorkommnissen. Diese Zählung findet in der Klasse TagCounterUpdater statt, welche als Service deklariert wurde und von einem Timer angestoßen wird.
Um nun zu einem bestimmten Tag Vorschläge erhalten zu können, wurde die Tag-API erweitert. Um zu einem bestimmten Tag andere Tags empfohlen zu bekommen, kann die URI /tags/{tagId}/recommendations aufgerufen werden. Diese Liste enthält alle möglichen Tags, welche nach Relevanz sind. An erster Stelle wird folglich ein Tag eingetragen sein, welcher sehr häufig in Verbindung mit dem Such-Tag genutzt wurde. Da der vorherige Tag-Controller von spring generiert wurde, sind nun in den Response-Body's der REST-API-Methoden keine Links auf die neu erstelle REST-Methode vorhanden. Da REST Level 3 allerdings durchgängig genutzt werden soll, musste der Tag-Controller selbst implementiert werden, sodass dementprechende Links zu der neuen REST-Methode hinzugefügt werden konnten.