ecamp / ecamp3

eCamp v3 is a web-based app for camp and course planning. The application is specialized for camps and courses of youth associations and for Y+S offers in the sport of camp sports/trekking.
https://ecamp3.ch
GNU Affero General Public License v3.0
111 stars 49 forks source link

Fragenkatalog für Backend Frameworks #1463

Closed carlobeltrame closed 3 years ago

carlobeltrame commented 3 years ago
  1. Wie stark müsste man das Frontend anpassen, damit es mit diesem Backend zusammen funktioniert? HAL? Linked Data? Shared Models zwischen Frontend und Backend?
  2. Wie zukunftsgerichtet ist das Framework? Wie weit ist es verbreitet? Steht eine Firma dahinter? Anzahl Google-Suchresultate, Downloads auf Package Manager, GitHub Stars, Anzahl Releases im letzten Jahr
  3. Wie gut ist das Framework dokumentiert?
  4. Wie (gut) funktioniert die Open Source Community? Offene Issues, Support-Kanäle
  5. Wie tief sind die Einstiegshürden? Welche Konzepte muss man kennen lernen bevor man sich im Framework zurecht findet?
  6. Wie viel des Codes kann beibehalten werden? Doctrine Entities? Tests? Business-Logik? Anderes?
  7. Welche Mechanismen gibt es, um verwandte Entities im Voraus zu laden? Embedded Entities?
  8. Wie wird Logik abgebildet, die sich nicht nur auf reines CRUD beschränkt? (Days in einer neuen Periode, Materiallisten zur Collaboration, Prototypen kopieren, ...)
  9. Wie einfach ist es für zukünftige weitere API-Clients, die API zu nutzen?
  10. Wie wird die API dokumentiert?
  11. Bietet das Framework Tooling, um API Tests zu schreiben? Geht das ohne Browser bzw. HTTP Client?
  12. Wie funktioniert Validierung, wie InputFiltering?
  13. Wie funktioniert Authentifizierung, wie Authorisierung / ACL? Wie wird sichergestellt dass ein User nur Daten sieht die er sehen darf?
  14. Unterstützt das Framework POST bzw. PATCH mit verschachtelten Entitäten im Payload?
  15. Wie funktionieren Request Parameters um Collections zu filtern, sortieren, etc.? Unterstützt das Framework Templated Links oder etwas vergleichbares?
  16. Wie funktionieren Datenbank-Schema-Migrationen?
  17. Welche IDE-Unterstützung und sonstiges Developer Tooling bietet das Framework?
  18. Bietet das Framework einen einfachen Weg, Code asynchron auszuführen?
  19. Wie viel Aufwand betreibt man als Entwickler, um die Infrastruktur selber aufzubauen und zu maintainen? Wie viel der Infrastruktur ist bereits vom Framework vorgegeben?
carlobeltrame commented 3 years ago

Laminas API Tools (bisher)

  1. Wie stark müsste man das Frontend anpassen, damit es mit diesem Backend zusammen funktioniert? HAL? Linked Data? Keine Anpassungen nötig. HAL JSON API. Für die Print Jobs müssen wir nach aktuellem Stand früher oder später die Authentifizierung von Cookies auf JWT Tokens umstellen.

  2. Wie zukunftsgerichtet ist das Framework? Wie weit ist es verbreitet? Steht eine Firma dahinter? Anzahl Google-Suchresultate, Downloads auf Package Manager, GitHub Stars, Anzahl Releases im letzten Jahr Wird offiziell in nächster Zeit durch eine API-Lösung von Mezzio abgelöst. Ich glaube der Gründer hat eine Firma die Laminas oder Mezzio einsetzt. 5.5k Google Resultate für "laminas api tools", 170k Packagist Downloads, 21 GitHub Stars, letztes Release über ein Jahr her

  3. Wie gut ist das Framework dokumentiert? Brauchbare, aber knappe Dokumentation zu den verfügbaren Konfigurationen. Eher wenig Dokumentation und Guides zur Architektur und Best Practices.

  4. Wie (gut) funktioniert die Open Source Community? Offene Issues, Support-Kanäle Issues und Inputs aus der Community bleiben lange liegen...

  5. Wie tief sind die Einstiegshürden? Welche Konzepte muss man kennen lernen bevor man sich im Framework zurecht findet? MVC, Services, Hydrators, Endpoint configs (selbst gebaut, daher bisher keine Dokumentation dafür vorhanden)

  6. Wie viel des Codes kann beibehalten werden? Doctrine Entities? Tests? Business-Logik? Anderes? Validierung bräuchte bald mal ein Overhaul, um auch fortgeschrittene Fälle abzudecken.

  7. Welche Mechanismen gibt es, um verwandte Entities im Voraus zu laden? Embedded Entities? Embedded Entities, via Hydrators wird konfiguriert wie die Responses aussehen. Es gibt (pro Entity? global?) eine maximale Embedding-Rekursions-Tiefe.

  8. Wie wird Logik abgebildet, die sich nicht nur auf reines CRUD beschränkt? (Days in einer neuen Periode, Materiallisten zur Collaboration, Prototypen kopieren, ...) Service Layer

  9. Wie einfach ist es für zukünftige weitere API-Clients, die API zu nutzen? Einigermassen Standard-konforme HAL JSON API. Aktuell verhindern CORS und PHP Sessions die Nutzung, aber Umbau auf Tokens ist angedacht.

  10. Wie wird die API dokumentiert? Manuell (sprich, nicht) nachgeführte Swagger-Dokumentation, sowie klickbare HAL API

  11. Bietet das Framework Tooling, um API Tests zu schreiben? Geht das ohne Browser bzw. HTTP Client? Ja, AbstractHttpControllerTestCase bietet Möglichkeiten, Requests simuliert abzusetzen. Doctrine Fixtures für Testdaten.

  12. Wie funktioniert Validierung, wie InputFiltering? Wird in den Endpoint configs konfiguriert, einzelne Regeln sind in einzelnen Klassen implementiert. Laminas bietet eine Auswahl an vorprogrammierten Validierungen und InputFiltern.

  13. Wie funktioniert Authentifizierung, wie Authorisierung / ACL? Wie wird sichergestellt dass ein User nur Daten sieht die er sehen darf? PHP Session Cookie für Authentifizierung. Authorisierung läuft via eine zentrale ACL-Klasse, wo alle Regeln definiert sind. DB-Filterung ist ein selbstgebautes System von EntityFilters (generieren einen generischen DB-Query der danach von den Services weiter verfeinert werden kann).

  14. Unterstützt das Framework POST bzw. PATCH mit verschachtelten Entitäten im Payload? Nur durch manuelles Ausprogrammieren. Validierung, InputFilterung etc. geht aktuell nicht.

  15. Wie funktionieren Request Parameters um Collections zu filtern, sortieren, etc.? Unterstützt das Framework Templated Links oder etwas vergleichbares? Request Filterung / Sortierung muss jeweils manuell in den Services implementiert werden. Templated Links haben wir ebenfalls dazuprogrammiert, Laminas API Tools unterstützt das explizit von Haus aus nicht.

  16. Wie funktionieren Datenbank-Schema-Migrationen? Bisher kein System. In Zukunft sind Doctrine Migrations angedacht.

  17. Welche IDE-Unterstützung und sonstiges Developer Tooling bietet das Framework? Nichts spezielles..? Nur Standard PHP und XDebug Unterstützung in den IDEs.

  18. Bietet das Framework einen einfachen Weg, Code asynchron auszuführen? Nichts eingebautes. Wir haben eine RabbitMQ und separate Worker Services dazugebaut, es existieren PHP Libraries um Messages in die Queue zu senden.

  19. Wie viel Aufwand betreibt man als Entwickler, um die Infrastruktur selber aufzubauen und zu maintainen? Wie viel der Infrastruktur ist bereits vom Framework vorgegeben? Die wichtigsten Grundfunktionen (Dependency Injection, Routing, simple Validierungen, abstrakter API-Controller, simple HAL-Serialisierung, ACL-Checker) kommen mit Laminas mit. Alles was darüber hinaus geht (User Credential management, Entities nach Query Parametern und Zugriffsrechten filtern, Error-Responses, Content Negotiation, Validierungen die mehrere Felder einbeziehen, Background Jobs, ...) muss man sich selber bauen oder zusammensuchen.

carlobeltrame commented 3 years ago

API Platform (POC siehe #1449)

  1. Wie stark müsste man das Frontend anpassen, damit es mit diesem Backend zusammen funktioniert? HAL? Linked Data? Shared Models zwischen Frontend und Backend? Alle bisher bekannten Inkompatibilitäten konnte ich im POC bereits auf Seite API Platform lösen. Somit theoretisch keine Anpassungen nötig. Profile-Endpoint würde man allenfalls anders lösen, weil man sowieso JWT Tokens hat und es die Möglichkeit gibt, je nach eingeloggtem User einzelne Properties eines Endpoints zu verstecken.

  2. Wie zukunftsgerichtet ist das Framework? Wie weit ist es verbreitet? Steht eine Firma dahinter? Anzahl Google-Suchresultate, Downloads auf Package Manager, GitHub Stars, Anzahl Releases im letzten Jahr Offizielle API-Lösung von Symfony. Regelmässige Meetups mit >100 TN, erste dedizierte API Platform Konferenz im September. Französische Firma les-tilleuls.coop bietet kommerziellen Support. Nächste Major Version 3.0 ist für dieses Jahr geplant, mit denselben Features wie die nächste Minor-Version, aber ohne Backwards Compatibility Layer. 787k Google-Resultate für "api platform", 7200k Packagist Downloads, 6.7k GitHub Stars, 7 Releases seit Mai 2020

  3. Wie gut ist das Framework dokumentiert? Gut unterhaltene Docs sowie Screencasts bieten Beispiel-basierte Dokumentation. Eine ausschöpfende "Referenz" gibts nur wo nötig (z.B. Konfigurations-Optionen), bzw. wird oft auf die vorbildliche Symfony-Doku verwiesen, weil die Themen schnell mal dort angesiedelt sind wenn man in die Tiefe geht.

  4. Wie (gut) funktioniert die Open Source Community? Offene Issues, Support-Kanäle Anekdotisch: Ein Docs PR von mir wurde nach 3 Minuten bereits von einem Core Contributor approved, und im Slack Support Kanal bekam ich nach einigen Stunden eine hilfreiche Antwort. Ein paar hundert offene Issues. Diejenigen auf die ich beim POC gestossen bin weil ich dieselbe Frage hatte enthielten alle zumindest Diskussionen und Inputs. Je nach dem findet man auch auf StackOverflow mal eine Frage / Antwort, ist aber nicht gleich das erste bei einer Google-Suche.

  5. Wie tief sind die Einstiegshürden? Welche Konzepte muss man kennen lernen bevor man sich im Framework zurecht findet? API Platform ist ein PHP-Framework, zumindest die Sprache sollte Einsteiger-Contributors also wenig abschrecken. api-platform Für simple Entities (wenn nur grün und gelb modifiziert wird) wird praktisch alle "Logik" deklarativ auf die Entity-Klasse geschrieben, so haben Einsteiger schnell den Überblick darüber, was alles abgeht (wenn auch nicht "wie es abgeht"). In fortgeschrittenen Fällen wird das Dependency Injection System von Symfony (mit .yml Service Konfiguration, Services dekorieren, etc.) verwendet, was nicht ganz simpel ist.

  6. Wie viel des Codes kann beibehalten werden? Doctrine Entities? Tests? Business-Logik? Anderes? Entities, API Tests, Fixtures können "beibehalten" werden (ich würde trotzdem empfehlen, den Code manuell und mit Hilfe der verfügbaren Command Line Assistenten zu "übertragen", es ist eine gute Aufräumaktion und alles kann nochmals auf Sinnhaftigkeit und Aktualität überprüft werden). Services (und Hydrators) müssen neu geschrieben werden: Validierung, Felder setzen, related Entities direkt aus dem Payload werden separat von "custom" Business Logik deklariert statt von Hand ausprogrammiert.

  7. Welche Mechanismen gibt es, um verwandte Entities im Voraus zu laden? Embedded Entities? Embedded Entities, HTTP/2 Server Push und Vulcain (Push Protokoll das vom API Platform Gründer entwickelt wird) sind 3 verschiedene unterstützte Mechanismen. Auf einer Entity A kann man deklarieren, "wenn ich im Kontext von Entity B gerendert werde, werde ich (oder nur einige meiner Properties) embedded". Man kann auch (pro Relation glaube ich?) eine maximale Serialisierungs-Tiefe angeben.

  8. Wie wird Logik abgebildet, die sich nicht nur auf reines CRUD beschränkt? (Days in einer neuen Periode, Materiallisten zur Collaboration, Prototypen kopieren, ...) Übersicht hier. Während dem (De-)Serialisieren: Custom (De-)Normalizers Während dem Persistieren bzw. Laden aus der DB: Custom DataPersister / DataProvider Custom Endpoints / RPC / non-RESTful: Messenger (asynchron oder synchron möglich)

  9. Wie einfach ist es für zukünftige weitere API-Clients, die API zu nutzen? JWT-Authentifizierung ist der Standard (Cookies wären trotzdem möglich). Zudem automatische Swagger-Dokumentation und Unterstützung für verschiedene Lese-Formate (HAL, JSONLD, JSON API, ...), Schreib-Formate (JSONLD, JSON API, JSON merge patch) und Error-Formate (problem+json, JSONLD, JSON API) out of the box. Wenn man sich nicht zu weit vom Standard entfernt ist sogar GraphQL support inklusive zugehörigen API Docs angeblich einfach aktivierbar.

  10. Wie wird die API dokumentiert? Durch die JWT-Authentifizierung ist die HAL API leider nicht mehr einfach durchklickbar, da der Browser jeweils einen Authorization: Bearer ey... Header mitsenden muss. Stattdessen wird aber OpenAPI- und Schema.org-konforme API Dokumentation vollautomatisch generiert (kann auch customized werden wenn man custom Endpoints etc. einführt), und das Swagger-Interface bietet auch viele Möglichkeiten, die API hands-on auszuprobieren (inklusive JWT Token).

  11. Bietet das Framework Tooling, um API Tests zu schreiben? Geht das ohne Browser bzw. HTTP Client? Ja, ähnlich wie Laminas, basierend auf Fixtures und "fake HTTP Requests".

  12. Wie funktioniert Validierung, wie InputFiltering? Deklariert man direkt auf den Entity-Feldern (bzw. DTO-Feldern wenn man DTOs verwendet) mit PHP 8 Attributes:

    /**
     * Unique email of the user.
     *
     * @ORM\Column(type="string", length=64, nullable=false, unique=true)
     */
    #[InputFilter\Trim]
    #[Assert\NotBlank]
    #[Assert\Email]
    #[ApiProperty(example: 'bi-pi@example.com')]
    private ?string $email = null;

    Validierungen gibts sehr viele eingebaute von Symfony her, und man kann auch selber noch mehr machen, inklusive Multi-Feld-Validierungen und Klassen-Validierungen. Input Filtering ist nicht enthalten in API Platform (für Symfony Forms gibts entsprechende Dritt-Libraries, aber nicht für API Platform). In der Doku steht aber: Denormalizers: post-process objects created from the payload sent in the HTTP request body. Ich habe daher im POC basierend auf einem custom Denormalizer ein simples InputFilter System gebaut.

  13. Wie funktioniert Authentifizierung, wie Authorisierung / ACL? Wie wird sichergestellt dass ein User nur Daten sieht die er sehen darf? Authentifizierung kommt von Symfony, API Platform empfiehlt ein JWT Bundle (Package), Cookies wären auch möglich. Authorisierung verwendet ebenfalls Komponenten und eine Expression Language von Symfony, und man deklariert das direkt auf den Entity bzw. DTO Klassen:

    #[ApiResource(
    collectionOperations: [
        'get' => ['security' => 'is_fully_authenticated()'],
        'post' => [
            'security' => 'true', // allow unauthenticated clients to create (register) users
        ],
    ],
    itemOperations: [
        'get' => ['security' => 'is_granted("ROLE_ADMIN") or object == user'],
        'patch' => ['security' => 'is_granted("ROLE_ADMIN") or object == user'],
        'delete' => ['security' => 'is_granted("ROLE_ADMIN")'],
    ]
    )]
    class User extends BaseEntity { // ...

    Um alle Collection- und Item-Queries nach User zu filtern, gibt es Doctrine Extensions, sehr ähnlich wie das System das wir in Laminas selber gebaut haben.

  14. Unterstützt das Framework POST bzw. PATCH mit verschachtelten Entitäten im Payload? Ja, das ist möglich :partying_face: Es wird durch #[ApiProperty(writableLink: true)] auf der Relation enabled, und damit nested Validations funktionieren muss man auf die Relation #[Assert\Valid] schreiben. Unsere dazugebauten InputFilter greifen noch nicht auf den nested Entities, das müssen wir noch nachbauen. Ich habe das für PATCH ausprobiert, und beim Debugging auch Code für POST gesehen (zwar nicht first hand ausprobiert). Eine Alternative zu writableLink ist noch mit #[ApiProperty(writable: true)] verfügbar: Damit ist es nur erlaubt, die Relation durch eine komplett neue URI zu ersetzen, aber nicht einzelne Felder in der related Entity zu bearbeiten. Es gibt in der Doku leider keine eigenen Einträge zu writable und writableLink, aber diese Settings werden in der Doku erwähnt, sind also schon offiziell. Es gibt auch einen Symfony Cast zu diesem Thema, der aber leicht veraltet scheint und writableLink etc. noch nicht erwähnt, aber Support für Update sowie Create Operationen beschreibt. Es gibt noch ein weiteres Konzept in API Platform namens Subresources. Diese ermöglichen URIs wie /camps/123/periods. Aber Subresources sind bisher read-only (also kein POST direkt auf diese URI möglich), und ausserdem scheinen sie gemäss meinen Experimenten und einigen Issues noch buggy zu sein. Daher würde ich im Moment davon abraten, diese zu verwenden.

  15. Wie funktionieren Request Parameters um Collections zu filtern, sortieren, etc.? Unterstützt das Framework Templated Links oder etwas vergleichbares? Sehr vergleichbar mit Validations und InputFiltern kann man Collection Filters einfach als PHP 8 Attribut auf der Entity deklarieren, und sie fliessen dann automatisch in die API Doku ein. Die Implementation macht man dann in generischen Klassen, die wichtigsten üblichen Filter-Implementationen (SearchFilter, DateFilter, BooleanFilter, ExistsFilter, NumericFilter, OrderFilter, RangeFilter) kommen bereits vorprogrammiert mit. Templated Links sind nicht von Haus aus eingebaut, man könnte dazu einen Serializer dekorieren wie mir ein Core Contributor auf dem Slack Channel geraten hat. Serialisierte Collection Relations (z.B. user->ownedCamps) haben standardmässig keinen Self-Link, sondern kommen als Array von Links zu Entries mit:

    {
    _links: {
    self: { href: '/users/123' },
    ownedCamps: [
      { href: '/camps/1' },
      { href: '/camps/2' },
    ]
    }

    Ich habe das aber mit einem custom Normalizer überschrieben, so dass jetzt (nur bei HAL) wieder das Format rauskommt das wir uns bereits gewöhnt sind (sofern man die Doctrine Association vollständig definiert und ein Query Param Filter für die umgekehrte Relation vorhanden ist):

    {
    _links: {
    self: { href: '/users/123' },
    ownedCamps: { href: '/camps?owner=/users/123' } // verlangt, dass auf Camps die Filterung nach Owner aktiviert ist
    }
    }
  16. Wie funktionieren Datenbank-Schema-Migrationen? Doctrine Migrations ist vorinstalliert und -konfiguriert. Migrationen können auf Befehl leer oder als Diff generiert und danach von Hand bearbeitet werden.

  17. Welche IDE-Unterstützung und sonstiges Developer Tooling bietet das Framework? Es gibt Symfony-Plugins für PHPSTORM sowie VSCode. Symfony hat nützliche Konsolen-Befehle und -Assistenten mit denen man das Grundgerüst für Entities inkl. Getters, Setters, Collection-Adders und Removers generieren kann. Boilerplate-Code wird einem wo immer möglich abgenommen.

  18. Bietet das Framework einen einfachen Weg, Code asynchron auszuführen? Ja, die Anbindung an Symfony Messenger bietet ein vollständiges System für Async Background Jobs, inklusive konfigurierbarem Retry/Failure Verhalten, Unterstützung für diverse Message Queues wie RabbitMQ, und sogar ein Middleware-System um die Job Objekte zu pre-processen :exploding_head: Grundsätzlich konfiguriert man dazu einen Endpoint (z.B. POST /print-jobs) so dass er asynchron via Messenger läuft, und es wird automatisch eine Message in die RabbitMQ gepostet (oder man kann es auch als Side-Effect eines normalen Endpoints realisieren). Ein (oder mehrere) separate generische PHP-Worker-Container lesen dann die Messages aus RabbitMQ und arbeiten sie ab. Die Workers laufen auch im Framework, das heisst sie haben vollen Zugriff auf alles was im Framework verfügbar ist, Entities, Business Logik, etc.

  19. Wie viel Aufwand betreibt man als Entwickler, um die Infrastruktur selber aufzubauen und zu maintainen? Wie viel der Infrastruktur ist bereits vom Framework vorgegeben? API Platform bemüht sich, dem Entwickler so viel wie möglich der repetitiven Tasks abzunehmen. Für optionale Teile die nicht Teil vom Core sind, verlinkt die Dokumentation auch gerne mal eine offizielle Empfehlung für eine Dritt-Library. Rapid Application Development und Convenience sind offensichtlich ein wichtiger Teil der Philosophie (und werden auch so in der Doku erwähnt). InputFilters musste ich trotzdem selber dazubauen, das scheint ein bisschen ein blinder Fleck des API Platform Teams zu sein, den Diskussionen in einigen Issues zufolge. Ein Docker-Compose Setup sehr ähnlich wie unserer wird mitgeliefert, und in der Doku beginnen Konsolen-Befehle immer mit docker-compose exec .... Ein Helm Chart fürs Deployment auf Kubernetes wird ebenfalls mitgeliefert.

usu commented 3 years ago

Ein paar Artikel vom Recherchiere und Stöbern.

Hypermedia

Toller Blog-Post, welcher ein Review der diversen Hypermedia-Technologien sowie eine Übersicht populärer Frameworks mit Hypermedia-API darstellt (2 Jahre alt, aber meiner Einschätzung nach immer noch relevant): https://www.fabernovel.com/en/article/tech-en/which-technologies-should-you-use-to-build-hypermedia-apis

TLDR:

NodeJS Backend

Im NodeJS Bereich bin ich auf NestJS gestossen. Dieses wir oft genannt für API rapid prototyping (low boilerplate) bringt aber auch Features und Flexbilität für umfangreichere Projekte. Im Gegensatz zu API Platform setzt NestJS aber nicht auf Hypermedia sondern auf Standard-REST und auf GraphQL. Evt. lässt sich Hypermedia nachrüsten, sicher bin ich aber nicht. Denke trotzdem spannend, mal genauer anzuschauen.

NestJS ist kein full stack framework. Ordnerstruktur orientiert sich anscheinend an Angular, das Framework selbst ist aber Frontendframwork-unabhängig. Client/server code sharing kommt damit natürlich nicht automatisch mit, ist selektiv aber trotzdem möglich, da ja beides in Javascript geschrieben ist (z.B. für DTO-Objekte).

GraphQL

Im Bereich GraphQL habe ich ein paar spannende Projekte gefunden, welche zu einem gewissen Grad ähnliche Konzepte realisieren, wie wir für hal-json-vuex aufgebaut haben. Ohne jetzt einen Wechsel zu GraphQL propagieren zu wollen, sind dies evt. mögliche Stossrichtungen, falls wir in Zukunft irgendwann mal von HAL weggehen:

Full Stack

Und dann gibt es noch die Full-Stack Javascript/Typescript Frameworks. Ich habe bisher noch nichts gefunden, was mich auch Anhieb überzeugt hat. Was ich mir bisher angeschaut habe:

Mögliche Meteor-Alternativen (noch nicht wirklich tiefer angeschaut): Feathers, Vulcan.js, Blitz

pmattmann commented 3 years ago

Mezzio

  1. Wie stark müsste man das Frontend anpassen, damit es mit diesem Backend zusammen funktioniert? HAL? Linked Data? Am Frontend sollten keine Anpassungen notwendig sein. Sollten wir auf JWT Tokens umbauen, gibt es auch hierfür PSR7 kompatible Implementationen. z.B. https://github.com/psr7-sessions/storageless

  2. Wie zukunftsgerichtet ist das Framework? Wie weit ist es verbreitet? Steht eine Firma dahinter? Anzahl Google-Suchresultate, Downloads auf Package Manager, GitHub Stars, Anzahl Releases im letzten Jahr Hinter Laminas/Mezzio stehen ein paar namhafte Personen (Matthew Weier O'Phinney / Marco Pivetta). Zudem werden die PSR-Standards verfolgt. Das erhöht die Chancen, dass sowohl einzelne Komponenten als auch Mezzio als Middleware-Runtime selbst ablösbar wird. Seit Jahresbegin wurden mehrere Releases veröffentlicht. 408k Packagist Downloads, 216 GitHub Stars.

  3. Wie gut ist das Framework dokumentiert? Brauchbare Doku: https://docs.mezzio.dev/mezzio/v3 zur Anwendung von Mezzio. Wenig Dokumentation zu Best Practices.

  4. Wie (gut) funktioniert die Open Source Community? Offene Issues, Support-Kanäle Comunnity ist nicht besonders aktiv. Es gibt gerade mal ~75 Issues total (offen & geschlossen).

  5. Wie tief sind die Einstiegshürden? Welche Konzepte muss man kennen lernen bevor man sich im Framework zurecht findet? Die Schwierigkeit liegt vermutlich nicht darin, Mezzio zu verstehen - sondern mehr darin, die gewählte Verarbeitungskette (selber definierbar) zu dokumentieren/verstehen. Pro: Verarbeitungskette selbst definierbar. Cons: Verarbeitungskette ist vermutlich unique. Was das googeln erschwert.

  6. Wie viel des Codes kann beibehalten werden? Doctrine Entities? Tests? Business-Logik? Anderes? Je nach dem, wie die Verarbeitungskette aufgestellt wird. Vermutlich Entities und deren Tests; Endpoint-Tests; evtl. Services / Hydrators.

  7. Welche Mechanismen gibt es, um verwandte Entities im Voraus zu laden? Embedded Entities? Embedded Entities.

  8. Wie wird Logik abgebildet, die sich nicht nur auf reines CRUD beschränkt? (Days in einer neuen Periode, Materiallisten zur Collaboration, Prototypen kopieren, ...) TBD; Möglicherweise Service Layer

  9. Wie einfach ist es für zukünftige weitere API-Clients, die API zu nutzen? Einigermassen Standard-konforme HAL JSON API. Aktuell verhindern CORS und PHP Sessions die Nutzung, aber Umbau auf Tokens ist angedacht.

  10. Wie wird die API dokumentiert? TBD

  11. Bietet das Framework Tooling, um API Tests zu schreiben? Geht das ohne Browser bzw. HTTP Client? Ja

  12. Wie funktioniert Validierung, wie InputFiltering? laminas-inputfilter wird empfohlen. Es gibt zudem eine Doku, wie die inputfilter in eine Mezzio-Application eingebunden werden. https://docs.laminas.dev/laminas-inputfilter/application-integration/usage-in-a-mezzio-application/

  13. Wie funktioniert Authentifizierung, wie Authorisierung / ACL? Wie wird sichergestellt dass ein User nur Daten sieht die er sehen darf? Hierzu gibt es verschiedene Möglichkeiten: https://docs.mezzio.dev/ Authentifizierung: Mezzio macht hier keine Vorgaben; Es gibt implementationen für SessionCookie oder auch für JWT Tokens Authorisierung: ACL vorhanden; Abfragen auf ACL müssen implementiert werden.

  14. Unterstützt das Framework POST bzw. PATCH mit verschachtelten Entitäten im Payload? Nicht out of the box.

  15. Wie funktionieren Request Parameters um Collections zu filtern, sortieren, etc.? Unterstützt das Framework Templated Links oder etwas vergleichbares? Filtern/Sortieren muss programmiert werden. Templated Links wreden von mezzio-hal unterstützt (https://docs.mezzio.dev/mezzio-hal/v2/links-and-resources/)

  16. Wie funktionieren Datenbank-Schema-Migrationen? Bisher kein System. In Zukunft sind Doctrine Migrations angedacht.

  17. Welche IDE-Unterstützung und sonstiges Developer Tooling bietet das Framework? Nichts spezielles..? Nur Standard PHP und XDebug Unterstützung in den IDEs. Ausserdem hilft das composer mezzio CLI Tool beim Erstellen von neuen Middlewares.

  18. Bietet das Framework einen einfachen Weg, Code asynchron auszuführen? mezzio-swoole (https://docs.mezzio.dev/mezzio-swoole/v3/async-tasks/)

  19. Wie viel Aufwand betreibt man als Entwickler, um die Infrastruktur selber aufzubauen und zu maintainen? Wie viel der Infrastruktur ist bereits vom Framework vorgegeben? Mezzio brignt die Grund-Infrastruktur. Mezzio ist dabei sehr PSR-Getrieben. Es gibt für viele Anforderungen mehr oder weniger passende Module dazu. Einige Anforderungen werder vermutlich nicht eins zu eins durch ein Module erfüllbar sein. Speziell ein ServiceLayer erwarte ich, dass wir diesen implementieren müssen.

carlobeltrame commented 3 years ago

Spring Data REST

  1. Wie stark müsste man das Frontend anpassen, damit es mit diesem Backend zusammen funktioniert? HAL? Linked Data? Details unklar, aber HAL JSON ist das primäre Output-Format. Spring Data REST hat aber gewisse Meinungen, und wir werden wohl nicht unsere bestehende API 1:1 damit nachbilden können.

  2. Wie zukunftsgerichtet ist das Framework? Wie weit ist es verbreitet? Steht eine Firma dahinter? Anzahl Google-Suchresultate, Downloads auf Package Manager, GitHub Stars, Anzahl Releases im letzten Jahr Es wird zur Zeit aktiv an HAL FORMS Unterstützung gearbeitet, mehrere der Contributors sind regelmässig auf hal-discuss anzutreffen. Im Java-Framework-Bereich ist Spring Boot wohl einer der grössten modernen Player (glaube ich). Allerdings stiehlt ihm in letzter Zeit Quarkus etwas die Show, weil es sehr viel schneller startet und besser auf Skalierung in Container-Infrastruktur ausgelegt ist. Zwar wird bei Quarkus an Unterstützung für mehr Spring Komponenten gearbeitet, aber da in Quarkus Reflection nicht möglich ist, bin ich nicht sicher, ob Spring Data REST da nachgezogen werden kann... 150k Google Resultate für "spring data rest", Downloads unbekannt für Maven Packages, 754 GitHub Stars, 30 Releases seit Mai 2020

  3. Wie gut ist das Framework dokumentiert? Brauchbare, unterhaltene Doku: https://docs.spring.io/spring-data/rest/docs/current/reference/html/#reference An einzelnen Stellen wird von Bad Practices abgeraten. Javadocs sind für alle Klassen verfügbar. Es gibt Guides für einzelne Use Cases (z.B. JPA oder MongoDB Anbindung), und wenn man googelt kommt man früher oder später auf die meistens sehr hilfreichen Artikel auf https://baeldung.com.

  4. Wie (gut) funktioniert die Open Source Community? Offene Issues, Support-Kanäle 700 offene Issues, die meisten geschlossenen sind einem Core Contributor assigned. Support-Kanal sind StackOverflow oder Issues.

  5. Wie tief sind die Einstiegshürden? Welche Konzepte muss man kennen lernen bevor man sich im Framework zurecht findet? Java und Spring, daher tendenziell höhere Einstiegshürden als bei PHP. Maven, Spring / Spring Boot Basics, JPA Repositories, Controllers für nicht-CRUD-Fälle, Projections für Embedded Entities.

  6. Wie viel des Codes kann beibehalten werden? Doctrine Entities? Tests? Business-Logik? Anderes? Muss offensichtlich neu geschrieben werden, da nicht PHP.

  7. Welche Mechanismen gibt es, um verwandte Entities im Voraus zu laden? Embedded Entities? Embedded Entities sind möglich via Projections. Der Client muss das aber als Query Parameter angeben: GET people/1?projection=personProjection (das würde man dann natürlich sinnvollerweise serverseitig in den _links einbauen). Entities, deren Repository nicht als API Endpoints veröffentlicht sind, werden immer automatisch embedded. Generell wird in der Doku davon abgeraten, übermässig viel zu embedden...

  8. Wie wird Logik abgebildet, die sich nicht nur auf reines CRUD beschränkt? (Days in einer neuen Periode, Materiallisten zur Collaboration, Prototypen kopieren, ...) Für komplett custom Endpoints kann man Controllers und Services dafür schreiben, die dann neben der reinen automatisch generierten CRUD-Logik von Spring Data REST leben. Es gibt zudem ein Event-Hook-System, mit dem man sich an verschiedenen Punkten mit einem Listener einhängen kann: https://docs.spring.io/spring-data/rest/docs/current/reference/html/#events

  9. Wie einfach ist es für zukünftige weitere API-Clients, die API zu nutzen? Vorbildliche HAL JSON API. CORS etc. sind ebenfalls abgehandelt. Zudem Support für Collection+JSON, und UBER, sowie Fehler im HTTP Problem Details Format. Authentifizierung via Spring Security, kann alles was man sich wünschen könnte (wenn man es erst mal korrekt konfiguriert hat). Es gibt Community-Erweiterungen für JSON:API und Siren. Im Moment sind nur JSON-basierte Formate unterstützt.

  10. Wie wird die API dokumentiert? Soweit ich sehe wird der HAL Explorer mitgeliefert, ein semi-grafisches Tool (àla Postman oder graphiql), mit dem man HAL APIs interaktiv entdecken kann. Ausserdem wird ALPS-Dokumentation automatisch generiert. Für Custom Endpoints muss man sich die Doku natürlich selber "bauen" (mit dem Builder Pattern). @BacLuc Ein swagger-ui sollte sich auch einfach anbieten lassen, sofern man die Annotations verwendet: https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api

  11. Bietet das Framework Tooling, um API Tests zu schreiben? Geht das ohne Browser bzw. HTTP Client? Ja, sogar für asynchrone Endpunkte gibts Tools die mit dem Warten helfen. Zudem wird ein Traverson-ähnliches Tool mitgeliefert, mit dem man das Traversieren von HAL-Relationen simulieren kann, ich denke das könnte in Tests nützlich sein.

  12. Wie funktioniert Validierung, wie InputFiltering? Validierung gibts sowohl Annotation-basiert wie auch Event-Hook-basiert. Für letzteres registriert man eine Validator-Klasse mit einem Servicenamen der gewissen Patterns entspricht (z.B. beforeCreateUserValidator). Die üblichen Annotations-Validierungen sind vorprogrammiert (@NotBlank, @Email, ...). InputFiltering kann mit der Filter-Infrastruktur von Spring realisiert werden, bin aber nicht sicher ob da sinnvolle Filter bereits vorprogrammiert sind.

  13. Wie funktioniert Authentifizierung, wie Authorisierung / ACL? Wie wird sichergestellt dass ein User nur Daten sieht die er sehen darf? Spring Security deckt wohl alle Anforderungen ab. Ist nur nicht ganz einfach zu konfigurieren...

  14. Unterstützt das Framework POST bzw. PATCH mit verschachtelten Entitäten im Payload? Bei POST ist es unklar dokumentiert, unterstützt werden die Formate application/hal+json und application/json. Bei PATCH werden verschiedene Formate unterstützt, darunter application/patch+json und application/merge-patch+json, bei beiden müssten verschachtelte Felder eigentlich möglich sein. Bei Association Resources (z.B. /camps/1/periods) werden bei POST glaube ich nur URIs akzeptiert, nicht direkt die verschachtelten Felder. Also kann ich sagen "füge die URI /periods/34 in die Association /camps/1/periods ein" (wenn ich die Dokumentation richtig verstehe).

  15. Wie funktionieren Request Parameters um Collections zu filtern, sortieren, etc.? Unterstützt das Framework Templated Links oder etwas vergleichbares? Sortierung funktioniert normal via Query Parameters. Filtering glaube ich auch: Wenn man entsprechende Query-Methoden auf den Repositories erstellt (z.B. UserRepository#queryByUsername) werden diese glaube ich automatisch exponiert (natürlich deaktivierbar). Bei JPA Repositories muss man dabei nur die Methodensignatur schreiben, die Filter-Implementation wird dann automatisch hinter den Kulissen generiert. Templated Links sind unterstützt: https://docs.spring.io/spring-hateoas/docs/current/reference/html/#fundamentals.uri-templates.

  16. Wie funktionieren Datenbank-Schema-Migrationen? Für Spring Boot Applikationen kenne ich Flyway (Migrationen sind plain SQL :unamused:) oder Liquibase (Migrationen sind in typischerweise in XML :vomiting_face:). Beide können soweit ich sehe nicht auf einfache Art "diff" Migrations generieren, sondern man schreibt die Migrations von Hand. Von @BacLuc: Bei einem Projekt lassen wir dazu das momentane Schema (definiert duch Entities) von Hibernate generieren und haben das eingecheckt. Wenn sich das ändert, sieht man das im Diff, und kann das in die Migration kopieren. Es gibt wahrscheinlich auch etwas automatisiertes dafür. Achtung: Falls die Migrationen auch für die Test .sqllite oder .h2 Datenbank verwendet wird, muss man diese Migration zweimal implementieren. (Für jedes DBMS einmal, da plain SQL).

  17. Welche IDE-Unterstützung und sonstiges Developer Tooling bietet das Framework? IntelliJ IDEA und VSCode haben gute Unterstützung für Spring Boot Projekte. Es gibt zudem viele Command-Line Befehle, aber soweit ich weiss nur wenige die direkt dabei helfen, neue Dateien zu scaffolden oder ähnliches. Sehr hilfreich ist aber die Library Lombok, welche Getter, Setter, Konstruktoren, Equals, ToString und noch sehr viele andere Boilerplate-Methoden einfach generieren kann. Man annotiert dazu z.B. Properties oder Klassen:

    
    @NoArgsConstructor
    @AllArgsConstructor
    @EqualsAndHashCode
    @ToString
    public class User {
    
    @Getter
    @Setter
    private String username;

}



18. **Bietet das Framework einen einfachen Weg, Code asynchron auszuführen?**
Ja, soweit man Infrastruktur-Themen bei Java als "einfach" bezeichen kann. Es gibt sowohl die eingebauten [Tasks](https://spring.io/guides/gs/spring-cloud-task/) als auch [separate Libraries](https://www.baeldung.com/java-jobrunr-spring) dafür.
@BacLuc : Sollte kein Problem sein, da man selber die Kontrolle über das Threading hat.
Es gibt Setup Code, der beim Aufstarten ausgeführt wird. Dort kann man Scheduler definieren, und dann Tasks als Side Effects von Requests vom Scheduler ausführen lassen. Dazu hat man dann Memory Zugriff, und muss die Daten nicht unbedingt über eine queue schleusen (ausser man will die Daten persistent haben).

1. **Wie viel Aufwand betreibt man als Entwickler, um die Infrastruktur selber aufzubauen und zu maintainen? Wie viel der Infrastruktur ist bereits vom Framework vorgegeben?**
Im CRUD-Bereich wird einem alles abgenommen. Für weitere generelle Bedürfnisse gibts im Spring-Ökosystem bereits sehr viele gute Lösungen. Nicht zu unterschätzen ist aber der Konfigurations-Aufwand den man betreibt, bis eine weitere Dependency mal so läuft wie man es gerne hätte.
BacLuc commented 3 years ago

Sails.js

  1. Wie stark müsste man das Frontend anpassen, damit es mit diesem Backend zusammen funktioniert? HAL? Linked Data? HAL + JsonD scheint nicht out of the box zu funktionieren. Somit muss dieser Layer im Backend dazugebaut werden, oder das Frontend angepasst.

  2. Wie zukunftsgerichtet ist das Framework? Wie weit ist es verbreitet? Steht eine Firma dahinter? Anzahl Google-Suchresultate, Downloads auf Package Manager, GitHub Stars, Anzahl Releases im letzten Jahr Google Suchresultate für "sails.js": 3.3 Mio npm Downloads: 1.3 Mio Github Stars: 22K Anzahl Releases: 9 Releases im letzten Jahr, 2018 kam der Release 1.0.0, momentan bei 1.4.3.

  3. Wie gut ist das Framework dokumentiert? Dokumentation eher dürftig.

  4. Wie (gut) funktioniert die Open Source Community? Offene Issues, Support-Kanäle Die ersten paar closed Issues, die ich gesehen habe, scheinen sich wieder von selbst gelöst zu haben (evtl schlechte Doku?). Die Issues scheinen aktiv gelabelt zu werden. Support per Gitter/Github Issues.

  5. Wie tief sind die Einstiegshürden? Welche Konzepte muss man kennen lernen bevor man sich im Framework zurecht findet? Die Einstiegshürden sind Mittel. Durch die nicht vorhandene Typisierung muss man schnell googeln. Für einige Features (ACL etc) braucht es konfiguration, die dann eher kompliziert wird.

  6. Wie viel des Codes kann beibehalten werden? Doctrine Entities? Tests? Business-Logik? Anderes? Ist JavaScript, somit nichts.

  7. Welche Mechanismen gibt es, um verwandte Entities im Voraus zu laden? Embedded Entities? Direkte Relations werden per default embedded. Habe noch keinen Weg gesehen, wie man das weiter konfigurieren kann.

  8. Wie wird Logik abgebildet, die sich nicht nur auf reines CRUD beschränkt? (Days in einer neuen Periode, Materiallisten zur Collaboration, Prototypen kopieren, ...) Controller können auch selbst implementiert/erweitert werden. Man kann selber helper schreiben, die "service" Layer Logik beinhalten.

  9. Wie einfach ist es für zukünftige weitere API-Clients, die API zu nutzen? HAL ist nicht implementiert, somit kommt es auf unsere Implementation an. Authentifizierung über token (~= SessionId) dabei, für JWT braucht es eine seperate Library.

  10. Wie wird die API dokumentiert? Es gibt ein npm Package um ein swagger-ui zu generieren, die API Doku muss teilweise selbst gepflegt werden. Models werden vielleicht automatisch ausgelesen.

  11. Bietet das Framework Tooling, um API Tests zu schreiben? Geht das ohne Browser bzw. HTTP Client? Ja

  12. Wie funktioniert Validierung, wie InputFiltering? Als property auf den model properties (es gibt hier keine Annotations). https://sailsjs.com/documentation/concepts/models-and-orm/validations trim und stripTags habe ich nicht gefunden.

  13. Wie funktioniert Authentifizierung, wie Authorisierung / ACL? Wie wird sichergestellt dass ein User nur Daten sieht die er sehen darf? Es können policies auf den Endpoints definiert werden. Auf dem Level von Instanzen habe ich bis jetzt noch nichts gesehen.

  14. Unterstützt das Framework POST bzw. PATCH mit verschachtelten Entitäten im Payload? Habe ich nicht gesehen.

  15. Wie funktionieren Request Parameters um Collections zu filtern, sortieren, etc.? Unterstützt das Framework Templated Links oder etwas vergleichbares? Request Parameter für filtern/sortieren: filtern: ?where={"name":{"contains":"theodore"}}, sortieren: ?sort=lastName%20ASC Templated Links: Nichts gefunden

  16. Wie funktionieren Datenbank-Schema-Migrationen? Nichts built-in, braucht seperates npm package.

  17. Welche IDE-Unterstützung und sonstiges Developer Tooling bietet das Framework? Es gibt Plugins für JetBrains Produkte und für VSCode.

  18. Bietet das Framework einen einfachen Weg, Code asynchron auszuführen? Es gibt Ansätze, werden aber nicht maintained.

  19. Wie viel Aufwand betreibt man als Entwickler, um die Infrastruktur selber aufzubauen und zu maintainen? Wie viel der Infrastruktur ist bereits vom Framework vorgegeben? Von der Entity bis zum Endpoint + Collection Endpoint geht es schnell. Wenn ACL, Business Logik, JWT etc noch dazu muss, wird es Aufwendig.

BacLuc commented 3 years ago

Weitere PHP Frameworks, die ich mir dann aber nicht genauer angeschaut habe:

manuelmeister commented 3 years ago

Ich habe noch nach JS / TS Frameworks gesucht, aber HAL wird nirgends out of the box unterstützt:

carlobeltrame commented 3 years ago

Ähnlich bei Python:

carlobeltrame commented 3 years ago

Bei Ruby on Rails habe ich auch noch gesucht. Generell scheint dort JSON:API verbreiteter zu sein. Zu HAL habe ich nur folgende Serializer gefunden, keine "full stack" Lösung oder gescheite Automatisierung:

Und noch ein Blogpost, der das Vorgehen von Hand beschreibt: https://ieftimov.com/post/sprinkle-some-hateoas-on-rails-apis/#hateoas-serializers

pmattmann commented 3 years ago

ASP.NET Core 6 (draft)

  1. Wie stark müsste man das Frontend anpassen, damit es mit diesem Backend zusammen funktioniert? HAL? Linked Data? Es gibt mehrere Nuget-Packages welche eine HAL implementation anbieten. Teils exakt gleich - teils nahe dran. https://github.com/visualeyes/halcyon https://github.com/daxnet/hal https://github.com/grecosoft/NetFusion ...

  2. Wie zukunftsgerichtet ist das Framework? Wie weit ist es verbreitet? Steht eine Firma dahinter? Anzahl Google-Suchresultate, Downloads auf Package Manager, GitHub Stars, Anzahl Releases im letzten Jahr ASP.NET ist innerhalb von .net bereits viele Jahre etabliert. Es wird auch mit der neuen Ausrichtung von .net5/6 (OpenSource, Multiplattform) weiter entwickelt. Aktive Entwicklung auf GitHub; 24k GitHub Stars, Microsoft bringt jährlich ein neues Major-Release heraus (jeweils im November; Nov. 2021 .net6)

  3. Wie gut ist das Framework dokumentiert? Sehr umfangreich.

  4. Wie (gut) funktioniert die Open Source Community? Offene Issues, Support-Kanäle .net5/6 wird aktiv auf GitHub OpenSource entwickelt.

  5. Wie tief sind die Einstiegshürden? Welche Konzepte muss man kennen lernen bevor man sich im Framework zurecht findet?

  6. Wie viel des Codes kann beibehalten werden? Doctrine Entities? Tests? Business-Logik? Anderes? Nichts. Code muss in C# geschrieben werden.

  7. Welche Mechanismen gibt es, um verwandte Entities im Voraus zu laden? Embedded Entities? Embedded Entities.

  8. Wie wird Logik abgebildet, die sich nicht nur auf reines CRUD beschränkt? (Days in einer neuen Periode, Materiallisten zur Collaboration, Prototypen kopieren, ...)

  9. Wie einfach ist es für zukünftige weitere API-Clients, die API zu nutzen?

  10. Wie wird die API dokumentiert? ASP.NET bietet automatische Dokumentation mittels Swagger. Zu klären ist, ob das auch in Kombination mit den HAL-Libraries funktioniert.

  11. Bietet das Framework Tooling, um API Tests zu schreiben? Geht das ohne Browser bzw. HTTP Client? Ja

  12. Wie funktioniert Validierung, wie InputFiltering?

  13. Wie funktioniert Authentifizierung, wie Authorisierung / ACL? Wie wird sichergestellt dass ein User nur Daten sieht die er sehen darf?

  14. Unterstützt das Framework POST bzw. PATCH mit verschachtelten Entitäten im Payload?

  15. Wie funktionieren Request Parameters um Collections zu filtern, sortieren, etc.? Unterstützt das Framework Templated Links oder etwas vergleichbares?

  16. Wie funktionieren Datenbank-Schema-Migrationen? .Net würde hier das EntityFramework empfehlen. Dieses unterstützt Migrationen von Haus aus.

  17. Welche IDE-Unterstützung und sonstiges Developer Tooling bietet das Framework? VS Code hat .net5/6 Plugins.

  18. Bietet das Framework einen einfachen Weg, Code asynchron auszuführen?

  19. Wie viel Aufwand betreibt man als Entwickler, um die Infrastruktur selber aufzubauen und zu maintainen? Wie viel der Infrastruktur ist bereits vom Framework vorgegeben?

usu commented 3 years ago

NestJS

POC: https://github.com/usu/nest-example

  1. Wie stark müsste man das Frontend anpassen, damit es mit diesem Backend zusammen funktioniert? HAL? Linked Data? Native kein HATEOS unterstützt. Entweder müsste also Backendseitig nachprogrammiert oder Frontendseitig auf GraphQL umgestellt werden.

  2. Wie zukunftsgerichtet ist das Framework? Wie weit ist es verbreitet? Steht eine Firma dahinter? Anzahl Google-Suchresultate, Downloads auf Package Manager, GitHub Stars, Anzahl Releases im letzten Jahr 1.5M Google Resultate für nestjs, 676k weekly NPM downloads (Trend steigend), 37.8k GitHub Stars, ca. 40 Releases in den vergangenen 12 Monaten Sehr breite community, Tutorials/Videos Meines Wissens keine grössere Firma direkt hinter dem Framework, aber viele Sponsors & Partners

  3. Wie gut ist das Framework dokumentiert? Sehr ausführliche, verständliche & aktuelle Dokumentation Grundkonzepte sind gut erklärt, als auch die einzelnen Module und best practices / recipes https://docs.nestjs.com/

  4. Wie (gut) funktioniert die Open Source Community? Offene Issues, Support-Kanäle Github Stats (1months): 58 issues closed by 11 people 11 issues opened by 11 people
    Total nur 54 offene Issues. Schnelle response time.
    Community support via Github & Discord. Aktive Diskussion & Support auf Discord.

  5. Wie tief sind die Einstiegshürden? Welche Konzepte muss man kennen lernen bevor man sich im Framework zurecht findet? Einstiegshürden eher tief. Prototype ziemlich schnell lauffähig. Gute Doku, welche teilweise wie ein Tutorial aufgebaut ist. Gute CLI für boilerplate code. Weitere Konzepte (things to be learned): GraphQL, TypeORM

  6. Wie viel des Codes kann beibehalten werden? Doctrine Entities? Tests? Business-Logik? Anderes? Backendseitig nix (complete rewrite) Frontend rewrite auf GraphQL auch ziemlich aufwendig

  7. Welche Mechanismen gibt es, um verwandte Entities im Voraus zu laden? Embedded Entities? GraphQL relations

  8. Wie wird Logik abgebildet, die sich nicht nur auf reines CRUD beschränkt? (Days in einer neuen Periode, Materiallisten zur Collaboration, Prototypen kopieren, ...) Per Standardaufbau ist jeder Endpoint ein separates Modul. Business-Logik kommt in einen Service-Layer und wird dann von einem Rest-Controller und/oder von einem GraphQL-Resolver angezogen.

  9. Wie einfach ist es für zukünftige weitere API-Clients, die API zu nutzen? GraphQL als standardisiertes Interface inkl. Doku

  10. Wie wird die API dokumentiert? GraphQL bringt die Docu direkt als Teil der Schnittstelle mit Für REST ist OpenAPI (ehemals Swagger) auch direkt integriert.

  11. Bietet das Framework Tooling, um API Tests zu schreiben? Geht das ohne Browser bzw. HTTP Client? Ja, sowohl Unit testing als auch End-to-end tests: https://docs.nestjs.com/fundamentals/testing

  12. Wie funktioniert Validierung, wie InputFiltering? Validierung funktioniert via ValidationPipe mit diversen Standard-Validatoren aus class-validator. Inputs ändern funktioniert mit generischen Pipes.

  13. Wie funktioniert Authentifizierung, wie Authorisierung / ACL? Wie wird sichergestellt dass ein User nur Daten sieht die er sehen darf? Für Authentication wird Passport verwendet (nodejs. authentication library). Für Authorization rollenbasiertes RBAC (basic Variante bereits integriert). Alternativ über Drittlibrary CASL.

  14. Unterstützt das Framework POST bzw. PATCH mit verschachtelten Entitäten im Payload? Via GraphQL ja. Standard-REST nicht out of the box.

  15. Wie funktionieren Request Parameters um Collections zu filtern, sortieren, etc.? Unterstützt das Framework Templated Links oder etwas vergleichbares? Filtern/Sortieren Teil von GraphQL

  16. Wie funktionieren Datenbank-Schema-Migrationen? TypeORM Migrations

  17. Welche IDE-Unterstützung und sonstiges Developer Tooling bietet das Framework? Gute CLI VSCode TypeScript Support Nicht sicher, ob es spezifisch was für NestJS gibt (nicht gesucht)

  18. Bietet das Framework einen einfachen Weg, Code asynchron auszuführen? Very nice :-) Microservice-Support ist integraler Bestandteil des Frameworks. "Wherever possible, Nest abstracts implementation details so that the same components can run across HTTP-based platforms, WebSockets, and Microservices" Diverse Transports werden unterstützt, z.B. Redis, RabbitMQ aber auch direkt über TCP.

  19. Wie viel Aufwand betreibt man als Entwickler, um die Infrastruktur selber aufzubauen und zu maintainen? Wie viel der Infrastruktur ist bereits vom Framework vorgegeben? Framework bringt sehr viel mit inkl. einer guten CLI für fast prototyping. Da kommt man mit eingebauten Funktionen schon sehr weit. Für vieles was nicht direkt eingebaut ist gibt es gut unterstütze NodeJS-Pakete, welche integriert werden können.

pmattmann commented 3 years ago

Ziel

Beim nächsten Meeting können wir Aufwand von einem Framework-Wechsel abschätzen und so entscheiden, ob und welches Framework gewählt werden soll.

Investigate

Try

Kick

manuelmeister commented 3 years ago

Entscheidung

Wir entscheiden einstimmig für die Migration zu api-platform.