Schlanker PHP-Proxy-Endpunkt, der mehrere heterogene JSON-Quellen (z. B. GitLab APIs, Legacy-Systeme) abfragt, deren Daten über austauschbare Mapper-Klassen in ein einheitliches Normalformat transformiert und als konsolidiertes JSON ausliefert. Über Query-Parameter lässt sich die Ausgabe nach Quellen, Typ und Umfang filtern.
Die Projekte liegen nicht auf der Website selbst, sondern in verschiedenen Quellen. Es gibt drei Arten:
- Zentrale Quelle: das Kirby der Medieninformatik. Dort werden Arbeiten direkt gepflegt.
- Private Quellen: Viele Lehrende veröffentlichen die Arbeiten aus ihrer Betreuung schon auf der eigenen Website. Jede solche Seite kann eine Quelle sein, wenn sie die Daten als JSON anbietet. Thesis Works (cnoss.github.io) ist ein Beispiel dafür.
- Modul- und Projekt-Repos: GitHub-Repos der TH Köln, die Arbeiten als JSON-Feed bereitstellen.
Aktuell sind diese Quellen eingetragen:
| Source | Quelle | Adapter | Detailseite | Wer entscheidet, was erscheint? |
|---|---|---|---|---|
mi-kirby |
Kirby der Medieninformatik | ThesisSchemaMapper |
internal |
visibility im Kirby |
thesis-works |
cnoss.github.io/thesis | ThesisWorksMapper |
external |
Inhalt der Quelle |
agentic-feeding |
th-koeln/mi-project-agentic-feeding | ThesisSchemaMapper |
internal |
visibility im Feed |
praxisprojektseminar |
th-koeln/mi-bachelor-praxisprojektseminar | ThesisSchemaMapper |
external |
mi-website: true im Front Matter des Projekts (siehe README des Repos) |
Die Quellen liefern ihre Daten teils in unterschiedlichen Formaten. Der Proxy sammelt alles ein und macht daraus eine einheitliche Liste, die die Website direkt anzeigen kann.
flowchart LR
subgraph Quellen
K["Zentral: Kirby der Medieninformatik<br/>medieninformatik.th-koeln.de/kirby/abschlussarbeiten"]
T["Privat: Website einer/eines Lehrenden<br/>z. B. Thesis Works (cnoss.github.io)"]
P["Privat: weitere Lehrende …"]
R["Repos: agentic-feeding,<br/>Praxisprojektseminar"]
end
subgraph Proxy["mi-project-proxy"]
F["1. Abrufen<br/>JSON jeder Quelle laden"]
M["2. Übersetzen<br/>Adapter (Mapper) pro Quelle<br/>bringt alles ins Normalformat"]
D["3. Detail festlegen<br/>internal oder external"]
F --> M --> D
end
K --> F
T --> F
P --> F
R --> F
D -- "eine einheitliche JSON-Liste" --> W["Medieninformatik-Website<br/>zeigt die Projektübersicht"]
W -- "Klick auf ein Projekt" --> Q{"detail.mode?"}
Q -- external --> E["Weiterleitung zur Detailseite<br/>auf der Quelle (detail.url)"]
Q -- internal --> I["Detailseite wird auf der<br/>Medieninformatik-Website gerendert"]
In Worten:
- Abrufen: Die Website fragt den Proxy. Der Proxy lädt das JSON aller Quellen aus config/sources.php.
- Übersetzen: Für jede Quelle gibt es einen Adapter (im Code: Mapper), der deren Felder auf das gemeinsame Format abbildet. Aus
firstname+lastname(Kirby) wird z. B.author, genau wie bei Thesis Works. Eine Quelle muss also nicht das „richtige" Schema liefern. Weicht ihr Format ab, schreibt man einfach einen passenden Adapter dazu. - Detail festlegen: Der Proxy entscheidet pro Projekt, wo die Detailseite liegt, und schreibt das Ergebnis in
detail.mode. - Anzeigen: Die Website zeigt die Liste als Übersicht. Beim Klick auf ein Projekt reicht ein Blick auf
detail.mode:external: Die Quelle hat eine eigene Detailseite (z. B. Thesis Works oder das Praxisprojektseminar), die Website verlinkt dorthin.internal: Die Quelle hat keine eigene Detailseite (z. B. Kirby), also rendert die Website sie selbst aus den Projektdaten.
Eine neue Quelle anbinden, z. B. die Website einer weiteren Lehrperson, heißt also nur:
- Eintrag in config/sources.php (URL des JSON und Adapter).
- Liefert die Quelle das Schema aus thesis-schema.json, passt der vorhandene
ThesisSchemaMapper. Hat sie eigene Detailseiten, gibt sie deren Adresse im optionalen Felddetail_urlan. Sonst schreibt man einen neuen Adapter (siehe Mapper schreiben).
Der Proxy gleicht die Quellen nicht miteinander ab. Steht dieselbe Arbeit in zwei Quellen, wird das redaktionell in den Quellen bereinigt.
php -S localhost:8080 -t publicDann:
http://localhost:8080/index.php(alle Sources)http://localhost:8080/index.php?sources=gitlab-main,legacy-system&limit=25http://localhost:8080/index.php?type=gitlab&limit=50http://localhost:8080/index.php?raw=1(inkl.rawFeld pro Projekt)
Ohne limit liefert der Proxy höchstens 50 Projekte, das Maximum ist 500. Die Projekte kommen in der Reihenfolge der Sources und werden nicht sortiert. Wer alles braucht, muss limit also passend setzen.
Siehe config/sources.php.
Jede Source hat:
url: JSON-Endpointmapper: Mapper-KlassebaseUrl(optional, nurThesisSchemaMapper): Basis für relative Pfade zu Bildern und PDFs. OhnebaseUrlbleiben relative Pfade leer.detail(optional, Standardauto): wo die Detailseite eines Projekts gerendert wirdauto: Liefert der Mapper eine Detailseiten-URL, wird extern verlinkt, sonst intern gerendertinternal: immer auf dem Medieninformatik-Server rendernexternal: immer auf die Quelle verlinken (fehlt die URL, wird intern gerendert)
Jedes Projekt enthält ein aufgelöstes detail-Objekt. auto taucht dort nie auf, mode ist immer internal oder external:
"detail": { "mode": "external", "url": "https://cnoss.github.io/thesis/…" }
"detail": { "mode": "internal", "url": null }external: aufdetail.urlverlinken (Detailseite liegt auf dem Source-Server)internal: eigene Detailseite rendern, identifiziert übersource+id
Implementiere Mi\\ProjectProxy\\Mapper\\MapperInterface und trage die Klasse in config/sources.php ein.
Der Mapper bekommt das bereits decodierte JSON (mixed) und gibt eine Liste normalisierter Projekte zurück.
Empfohlenes Normalformat pro Projekt:
id(string|int|null)name(string)type(string|null)url(string|null)detailUrl(string|null): URL einer HTML-Detailseite auf dem Source-Server (keine PDF o. Ä.); wird vom Proxy indetailüberführtupdatedAt(string|null)source(string)- optional
raw(mixed/array)