diff --git a/.gitignore b/.gitignore index d2363495..85bb2101 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,8 @@ npm-debug.log* yarn-debug.log* yarn-error.log* +/tmp + # Generated by the build process /sidebar.reference.json diff --git a/docs/contribution/20-glossary.mdx b/docs/contribution/10-glossary.mdx similarity index 98% rename from docs/contribution/20-glossary.mdx rename to docs/contribution/10-glossary.mdx index 1cf12332..a706d0d2 100644 --- a/docs/contribution/20-glossary.mdx +++ b/docs/contribution/10-glossary.mdx @@ -1,5 +1,6 @@ --- title: Glossary +sidebar_position: 2 --- ## Contributor diff --git a/docs/contribution/20-getting-started/02-become-contributor.mdx b/docs/contribution/20-getting-started/02-become-contributor.mdx new file mode 100644 index 00000000..8d02c43e --- /dev/null +++ b/docs/contribution/20-getting-started/02-become-contributor.mdx @@ -0,0 +1,36 @@ +--- +title: Contributor werden +--- + +Contributor werden ist sehr einfach. +Du brauchst lediglich eine Organisation, die du über das mStudio anlegen kannst. +Organisationen repräsentieren Unternehmungen, über die etwas abgerechnet werden kann. +Bei unseren Hosting-Produkten sind dies bspw. Rechnungen. +Im Falle von Contributoren werden die Gutschriften für die gebuchten Extensions über die Organisation gutgeschrieben. + +:::info Separate Organisation +Wenn du bereits konventioneller Kunde bei uns im mStudio bist, +könnte es von Vorteil sein, eine separate Organisation für die Contribution zu erstellen, +um die beiden Geschäftsbereiche zu trennen und Berechtigungen einfacher abzugrenzen. +Dies ist jedoch keine Pflicht. +::: + +Um Contributor zu werden, muss in deiner Organisation zunächst ein Vertragspartner hinterlegt werden + +![Vertragspartner hinzufügen](/img/contribution/getting-started-guide/add-contract-owner.png) + +![Vertragspartner konfigurieren](/img/contribution/getting-started-guide/contract-owner.png) + +Nun kann einfach auf den Button **"Contributor werden"** geklickt werden. +Dadurch wird deine Organisation zu einem unverifizierten Contributor. +Falls du deine Extension veröffentlichen willst, folge diesem Guide bis zur [Veröffentlichung der Extension](../publish) + +![Contributor werden](/img/contribution/getting-started-guide/become-contributor.png) + +:::info +Um Extensions nicht nur für dich, sondern für die Allgemeinheit bereitstellen zu können, +musst du als Contributor verifiziert werden. + +Eine genaue Übersicht darüber, welche Informationen für die Verifizierung eines Contributors benötigt werden, +haben wir in unserer [Contributor Übersicht](../../overview/contributor) beschrieben. +::: diff --git a/docs/contribution/20-getting-started/03-configure-extension.mdx b/docs/contribution/20-getting-started/03-configure-extension.mdx new file mode 100644 index 00000000..dc6045b6 --- /dev/null +++ b/docs/contribution/20-getting-started/03-configure-extension.mdx @@ -0,0 +1,90 @@ +--- +title: Konfiguration der Extension +--- + +## Extension registrieren + +Sobald man Contributor ist, kann eine Extension im mStudio angelegt werden. +Dazu muss innerhalb der Organisation der **"Entwicklung" Tab** aufgerufen werden und über den **"Anlegen" Button** eine neue Extension registriert werden. +Zu diesem Zeitpunkt muss lediglich ein **Name** eingegeben werden, der auch im **Nachhinein noch ändern** kann. + +Extension Namen müssen **eindeutig** sein. +Da es sich empfiehlt, für die **Entwicklung vorerst eine eigene** und später für produktive Zwecke eine weitere Extension anzulegen, +ist es sinnvoll, dies im Namen zu vermerken, indem bspw. "(DEV)" an den Namen angehangen wird. + +:::info Lebenszyklus von Extensions +Extensions sind erst im Marktplatz **sichtbar**, wenn sie **veröffentlicht** wurden. +Deswegen können problemlos für eigene Entwicklungsprozesse Entwicklungs- bzw. Staging-Extensions angelegt werden. +Weitere Informationen zum Lebenszyklus von Extensions sind im [Extension Konzept](../../overview/extensions#lifecycle-of-an-extension) erklärt. +::: + +![Extension registrieren](/img/contribution/getting-started-guide/register-extension.png) + +## Setzen des Extension Context + +Für jede Extension muss festgelegt werden, in **welchem Kontext** sie **installierbar** sein soll. +Zur Auswahl stehen **Organisation** und **Projekt**. +Die Reference Extension ist als Projekt-Extension gebaut. + +Im **Tab "Berechtigungen"** muss also in der Sektion **Extension Context** auf **Bearbeiten** geklickt werden. +Nun wird **Projekt** gewählt und gespeichert. + +:::info Wahl des Extension Context +Die Reference Extension ist als Projekt-Extension gebaut. +Es ergibt jedoch nicht für jede Extension-Idee sinn, sie als Projekt-Extension zu implementieren. + +Welche Auswirkungen die Wahl hat und welche Faktoren für die Wahl entscheidend sind, haben wir im ["Wie wähle ich den richtigen Extension Context?"-Guide](../../how-to/choose-a-context) beschrieben. +::: + +![Extension Context](/img/contribution/getting-started-guide/extension-context.png) + +## Berechtigungen konfigurieren + +Die Reference Extension ruft Informationen über den User und das Projekt, in dem sie installiert ist, ab. +Außerdem bietet sie die Möglichkeit, den Namen des Projekts anzupassen. +Um dazu in der Lage zu sein, müssen für die Extension Berechtigungen in Form von Scopes konfiguriert werden. +Das muss immer gemacht werden, wenn Extensions auf die mStudio API zugreifen wollen. + +Genauso wie der Extension Context werden auch die Berechtigungen im **Tab "Berechtigungen"** konfiguriert. +Dazu muss in der entsprechende Sektion auf "Bearbeiten" geklickt werden. +Wir stellen nun **Projekt lesen** und **schreiben** sowie **Benutzer lesen** ein. + +:::info Verfügbare Scopes +Im [Guide zu Scopes](../../overview/concepts/scopes) haben wir ausführlicher beschrieben, welche Scopes verfügbar sind und wie der richtige Scope identifiziert werden kann. +Wenn du Schwierigkeiten damit hast, den richtigen Scope zu finden oder dein Scope fehlt, komm gerne auf uns zu. +Wir unterstützen dich gerne dabei. +::: + +![Berechtigungen einstellen](/img/contribution/getting-started-guide/scopes.png) + +## Konfigurieren der Frontend-URL + +Die Reference Extension verwendet ein **Frontend Fragment**. +Das bedeutet, sie implementiert ein Frontend, dass nahtlos in das mStudio integriert werden soll. + +:::info Frontend Fragment vs. External Frontend +Frontend Fragmente sind nicht die einzige Möglichkeit, ein Frontend für eine Extension anzubieten. +Wenn die Anforderungen an Frontend Fragmenten für dich zu restriktiv sind oder nicht zu deinem Anwendungsfall geeignet sind, +gibt es auch die Möglichkeit, ein externes Frontend zu implementieren. + +Die Eigenschaften und Unterschiede zwischen Frontend Fragmenten und externen Frontends sind im [Konzept zur Frontend Entwicklung](../../overview/concepts/frontend-development) erklärt +::: + +Um die URL für das Frontend Fragment der Reference Extension einzustellen, muss im **Tab "Frontend"** der Extension in der Sektion zu **Frontend Fragments** auf **Hinzufügen** geclickt werden. + +![Frontend Fragment hinzufügen](/img/contribution/getting-started-guide/frontend-fragments.png) + +Für ein Frontend Fragment muss ein **Ankerpunkt** gewählt werden. +Dieser bestimmt, an welcher Stelle das Frontend deiner Extension eingebunden werden soll. +Die Reference Extension ist gebaut, um an dem Ankerpunkt `/projects/project/menu/section/extensions/item` eingehangen zu werden, +also als Menüpunkt innerhalb eines Projekts. + +Für den Ankerpunkt muss außerdem ein **Anzeigename** definiert werden. +Dieser bestimmt bspw. bei Ankerpunkten, die als Menüpunkte fungieren, wie der Menüpunkt heißt. +Für Sektionen bestimmt der Anzeigename die Überschrift der Sektion. + +Schließlich muss eine **URL** angegeben werden. +Für die in Entwicklung befindliche Extension kann hier auch eine auf dem **lokalen Client erreichbare Adresse** eingegeben werden. +Da die Reference Extension Standardmäßig auf Port 3000 läuft, fügen wir hier `http://localhost:3000` ein. + +![Konfiguration des Frontend Fragments](/img/contribution/getting-started-guide/frontend-fragment-configuration.png) diff --git a/docs/contribution/20-getting-started/04-reference-extension.mdx b/docs/contribution/20-getting-started/04-reference-extension.mdx new file mode 100644 index 00000000..3ebb7d4b --- /dev/null +++ b/docs/contribution/20-getting-started/04-reference-extension.mdx @@ -0,0 +1,198 @@ +--- +title: Reference Extension +--- + +## Die Reference Extension + +Die [Reference Extension](https://github.com/mittwald/reference-extension) ist eine umfassende Beispiel-Extension, +die alle wichtigen Features für die Entwicklung von Extensions, die sich direkt in das mStudio integrieren, demonstriert. +Sie dient als praktische Vorlage und Lernressource für Entwickler. + +### Idee und Motivation + +Die Reference Extension wurde entwickelt, um: + +- **Best Practices** für Extension-Entwicklung zu zeigen +- Alle wichtigen **Marketplace-Konzepte** praktisch zu demonstrieren +- Die Integration mit der mittwald API und dem mStudio zu illustrieren +- Als **Ausgangspunkt** für eigene Extension-Projekte zu dienen + +Die Extension ist vollständig dokumentiert und kann als Template verwendet werden, um eigene Extensions zu entwickeln. +Der Code ist so strukturiert, dass er leicht verstanden, angepasst und erweitert werden kann. + +### Technologischer Stack + +Die Reference Extension verwendet moderne Web-Technologien, die auch für die Entwicklung eigener Extensions empfohlen werden: + +**Frontend:** + +- **[React 19](https://react.dev/)** - Für die Entwicklung der Benutzeroberfläche +- **[TanStack Router & Query](https://tanstack.com/)** - Routing und State Management +- **[@mittwald/flow-remote-react-components](https://mittwald.github.io/flow/)** - UI-Framework, das mit Frontend Fragmenten kompatibel ist +- **[React Ghostmaker](https://github.com/mittwald/react-ghostmaker)** - Server Function Abstraktion + +**Backend:** + +- **[TanStack Start](https://tanstack.com/start/latest)** - Full-stack React Framework +- **[Drizzle ORM](https://orm.drizzle.team/)** - Typsichere Datenbankoperationen mit PostgreSQL +- **[@mittwald/api-client](https://www.npmjs.com/package/@mittwald/api-client)** - Client für die mittwald API +- **[@weissaufschwarz/mitthooks](https://www.npmjs.com/package/@weissaufschwarz/mitthooks)** - Webhook-Verarbeitung + +**Development Tools:** + +- **[Vite](https://vite.dev/)** - Schnelles Build-Tool +- **[Biome](https://orm.drizzle.team/)** - Linting & Formatting +- **[Vitest](https://vitest.dev/)** - Unit Testing Framework + +### Implementierte Konzepte des mStudio Marktplatzes + +Die Reference Extension demonstriert alle wichtigen Konzepte, die für die Entwicklung von Extensions, die direkt im mStudio eingebunden werden sollen, relevant sind: + +**1. Lifecycle Webhooks** + +- Verarbeitung von Lifecycle Events (create, update, remove), um einen State über bestehende Extension Instances aufbauen zu können +- Speicherung der Instance-Daten in eigener Datenbank +- Validierung der Webhook Signatur, um Missbrauch zu verhindern + +Weitere Informationen zum Zweck und der Funktionsweise von Lifecycle Webhooks können im [Konzeptdokument zu Lifecycle Webhooks](../../overview/concepts/lifecycle-webhooks) nachgelesen werden. + +**2. Frontend Fragments** + +- Rendering von UI-Komponenten im mStudio via Remote DOM +- Integration als Menüeintrag im Projekt-Kontext +- Verwendung des Anchor Points: `/projects/project/menu/section/extensions/item` + +Im ["Wie man ein Frontend-Fragment entwickelt"](../../how-to/develop-frontend-fragment)-Guide findest du detailiertere Informationen zur Funktionsweise von Frontend Fragmenten und dem Remote-DOM. + +:::info Wichtiger Hinweis zu Frontend Fragments +Um Frontend direkt in das mStudio integrieren zu können, muss ein Remote DOM bereit gestellt werden. +Das Bootstrapping der Reference Extension übernimmt das für dich. +Das Remote DOM im mStudio erfordert die Verwendung von **Flow Design System Komponenten**. +Standard HTML-Elemente wie `
` oder `