- Habe es ausprobiert, gute Idee
- Habe es ausprobiert, schlechte Idee
- Habe es noch nicht ausprobiert, klingt aber interessant
- Warum sollte man seine Zeit damit verschwenden?
- Ich weiß nicht…
- Sonstiges
So viel Spaß, das habe ich vor ein paar Tagen genau so gemacht!
Ich arbeite seit einem Jahr mit Hasura/nuxt.js an verschiedenen Projekten.
Hasura ist sehr leistungsstark, und die kommenden Funktionen sind vielversprechend!
Ich mag das Discourse-Forum sehr (kenne aber weder Ruby noch Ember), also habe ich versucht, Hasura daran anzubinden.
Da ich kein Ruby-Entwickler bin, musste ich es installieren, hatte aber Probleme, die Entwicklungsumgebung auf meinem Mac einzurichten. Ich kämpfe mit dem cppjieba_rb-Gem…
Also habe ich einfach diesen Dump genommen und in PostgreSQL und Hasura eingerichtet.
Alle Tabellen scheinen importiert zu sein. Gibt es nur eine Ansicht? (badge_posts)
Ich habe auch alle Fremdschlüssel-Beziehungen nachverfolgt, sodass ich solche Abfragen ausführen kann:
{
posts {
id
user_id
bookmarks {
id
name
}
uploads {
id
url
}
}
}
Das ist mein aktueller Stand…
Wow, vielversprechend. Ich würde versuchen, einen Hasura-Container in einer Live-Umgebung zu starten und berichten, was dabei herauskommt. Dann können wir unsere Erkenntnisse austauschen.
Zur Information: Um eine laufende psql-Shell auf dem Postgres-Datenbankserver von Discourse zu erhalten, können Sie folgenden Befehl verwenden: docker exec --user postgres -it app psql -d discourse. Um einen vollständigen Dump zu erstellen, können Sie (beachten Sie, dass ich hier die Option -t weglasse, da sie in diesem Fall nicht benötigt wird):
docker exec --user postgres -i app pg_dump -Fc -d discourse > discourse.sql.pgcustom
Sie sollten nun in der Lage sein, diesen Dump in eine dockerisierte Postgres-Instanz (docker pull postgres:10.12) wiederherzustellen und sie für die Entwicklung mit Hasura zu verbinden (dies ist hauptsächlich auf Lesezugriffsniveau sinnvoll, da es sich nun um eine separate Datenbank handelt).
Für die Produktionsebene würde ich die von Discourse bereitgestellte Umgebung einrichten und Ihre Datenbank in einem Dienst wie Amazon RDS hosten. Sie haben dann einfachen Lese- und Schreibzugriff auf diese Datenbank.
So stellen Sie den oben genannten Dump lokal wieder her:
- Erstellen Sie ein Docker-Netzwerk:
docker network create discourse-dev-net
- In der ersten Shell:
docker run --rm -it -p 2345:5432 -e POSTGRES_DB=discourse -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres --name=discourse-dev-pg --network=discourse-dev-net postgres:10.12
(Wenn Sie möchten, dass es im Hintergrund läuft, können Sie -it durch -d ersetzen; -p 2345:5432 ist optional, aber praktisch, wenn Sie sich von Ihrem Host aus mit Postgres verbinden möchten)
- In einer anderen Shell erstellen Sie den Discourse-Benutzer in Postgres (erforderlich für den Dump):
docker run --rm -it -v /path/to/discourse.sql.pgcustom:/discourse.sql.pgcustom:ro -e PGPASSWORD=postgres --network=discourse-dev-net postgres:10.12 createuser -h discourse-dev-pg -U postgres -P discourse
(Geben Sie dann zweimal das Passwort in der Eingabeaufforderung ein; ich habe discourse als Passwort verwendet)
- Führen Sie die Wiederherstellung durch:
docker run --rm -i -v /home/dean/Downloads/discourse.sql.pgcustom:/discourse.sql.pgcustom:ro -e PGPASSWORD=postgres --network=discourse-dev-net postgres:10.12 pg_restore -h discourse-dev-pg -U postgres -d discourse /discourse.sql.pgcustom
- Verbinden Sie Hasura mit dem oben Genannten:
docker run --rm -it --network=discourse-dev-net -p 1234:1234 -e HASURA_GRAPHQL_ENABLE_CONSOLE=true -e HASURA_GRAPHQL_DATABASE_URL=postgres://postgres:postgres@discourse-dev-pg:5432/discourse hasura/graphql-engine:v1.2.1 graphql-engine serve --server-port=1234
(Sie können jetzt http://localhost:1234 aufrufen)
Nachdem ich die vererbte Datenbank etwas ausprobiert habe, ist das, was @Falco in diesem Beitrag sagt, sehr offensichtlich.
Es wird kaum die Leistungsfähigkeit von Postgres genutzt. Fast die gesamte Logik wird in Ruby umgesetzt.
Mein Fazit ist daher, dass dies an sich überhaupt nicht sonderlich hilfreich ist.
Ein anderer Ansatz wäre die Nutzung der Remote-Schema-Funktionalität von Hasura. Dafür müsste Discourse jedoch eine GraphQL-API und keine REST-API bereitstellen … also ebenfalls an sich nicht sehr hilfreich.
Es besteht jedoch die Möglichkeit, vorhandene REST-APIs in eine GraphQL-Schicht zu kapseln. Das erscheint vielversprechender als das oben Genannte (bzw. in Kombination damit). In diesem Artikel wird auf ein Repository mit Boilerplate-Code zum Einstieg verwiesen.
Vielen Dank für eure Antworten.
Ich beherrsche Docker nicht sehr gut, aber mein Problem liegt nicht dort. Da ich keine Discourse-Entwicklungsumgebung einrichten kann, habe ich keine Datenbank… Nur diesen leeren Dump.
Wie auch immer, ich habe diesen Dump gerade auf eine Heroku-Instanz gepusht! Ihr könnt es also live ausprobieren ![]()
Geht zu diesem Online-GraphiQL und stellt diesen Endpunkt ein:
https://discourse-hasura.herokuapp.com/v1/graphql
Ihr könnt damit spielen! Es gibt kein Admin-Passwort, sodass ihr auch Mutationen und Subscriptions ausführen könnt…
Das habe ich festgestellt, als ich Discourse mit Hasura getestet habe! Alle benutzerdefinierten Funktionen, Trigger, berechneten Felder… sind in Ruby definiert. Schlecht für die Portabilität ![]()
Nicht hilfreich, da die Discourse-GraphQL-API fehlt. Aber dies ist ein leistungsstarkes Feature von Hasura. Ich nutze es häufig mit einer benutzerdefinierten GraphQL-API von Stripe. Wenn wir eine Discourse-GraphQL-API hätten, könnten wir sie mit Remote-Schema in unsere eigene GraphQL-API integrieren!
Ja, aber wir müssten das gesamte Schema und die Resolver selbst erstellen. Das ist viel Arbeit!
Ich denke, es ist besser, hier die Open-API von Discourse zu verwenden: https://docs.discourse.org/ (im Download-Button), und sie mit einem GraphQL-Generator wie https://graphql-mesh.com/docs/handlers/openapi zu nutzen.
Ich werde es so bald wie möglich versuchen…
Ok, ich kann es kaum erwarten! Ich habe es mit graphql-mesh versucht.
Also, die OpenAPI-Datei unter dem Download-Button auf https://docs.discourse.org/ scheint defekt zu sein ![]()
Ich habe die Gültigkeit hier mit dieser Ausgabe getestet:
Swagger-Schema-Validierung fehlgeschlagen.
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/3
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/3
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/3
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/2
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/2
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/2
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/1
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/1
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/1
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/0
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/0
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/0
JSON_OBJECT_VALIDATION_FAILED
Error: Swagger-Schema-Validierung fehlgeschlagen.
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/3
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/3
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/3
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/2
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/2
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/2
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/1
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/1
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/1
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/0
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/0
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/0
JSON_OBJECT_VALIDATION_FAILED
bei o (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:73766)
bei https://apitools.dev/swagger-parser/online/js/bundle.min.js:17:227596
SyntaxError: Swagger-Schema-Validierung fehlgeschlagen.
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/3
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/3
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/3
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/2
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/2
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/2
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/1
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/1
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/1
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/0
Daten entsprechen keinem der Schemas von 'oneOf' bei #/paths//page_view_total_reqs/get/parameters/0
Fehlende erforderliche Eigenschaft: schema bei #/
Fehlende erforderliche Eigenschaft: content bei #/
Fehlende erforderliche Eigenschaft: $ref bei #/paths//page_view_total_reqs/get/parameters/0
JSON_OBJECT_VALIDATION_FAILED
bei Function.o [as syntax] (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:73766)
bei validateSchema (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:5021)
bei SwaggerParser.validate (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:3171)
z-schema Validierungsfehler: JSON_OBJECT_VALIDATION_FAILED
bei ZSchema.getLastError (https://apitools.dev/swagger-parser/online/js/bundle.min.js:17:211187)
bei validateSchema (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:4925)
bei SwaggerParser.validate (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:3171)
Also habe ich nach einer anderen OpenAPI- oder Swagger-Datei der Discourse-API gesucht. Ich habe nur diese hier gefunden.
Sie ist in Zeile 426 etwas defekt, aber ich habe sie repariert.
Nachdem ich graphql-mesh eingerichtet habe, habe ich eine funktionierende GraphQL-API erhalten! Aber…
Diese Swagger-Datei ist unvollständig oder zu alt. Es gibt nur 4 Queries, keine Mutations, der Typ user hat nur wenige Eigenschaften… ![]()
Gibt es irgendwo eine Swagger- oder OpenAPI-Datei von Discourse?
Das klingt nach vielversprechender Arbeit. Gut gemacht! Es wäre gut, wenn Discourse sich an einige offene Spezifikationen wie Swagger/OpenAPI halten würde. Ich hoffe, du findest die Informationen, die du suchst.
Ich habe im Moment nicht viel Zeit dafür, werde aber später noch einmal nachschauen.
[quote=“ManUtopiK, Beitrag: 7, Thema: 149576”]
Also, ich habe nach einer anderen OpenAPI- oder Swagger-Datei der Discourse-API gesucht. Ich habe nur diese hier gefunden.
Sie ist an Zeile 426 etwas fehlerhaft, aber ich habe sie repariert.
Nachdem ich graphql-mesh eingerichtet habe, habe ich eine funktionierende GraphQL-API! Aber…
Diese Swagger-Datei ist unvollständig oder veraltet. Es gibt nur 4 Abfragen, keine Mutationen, der Typ „user
Ich habe versucht, ‘Sonstiges’ abzustimmen, aber es hat nicht funktioniert.
Entschuldige die späte Antwort. Ich habe deine Frage übersehen.
Ja, du kannst mit einem Discourse-Hasura-GraphQL-Endpunkt arbeiten:
