Qualcuno ha pensato di collegare Hasura al database Postgres di Discourse per un FE potenzialmente più personalizzato (o limitato)?

  • L’ho provato, ottima idea
  • L’ho provato, pessima idea
  • Non l’ho ancora provato, ma sembra interessante
  • Perché dovresti perdere tempo con questo?
  • Non lo so…
  • Altro
0 voters

Che bello, è esattamente quello che ho fatto qualche giorno fa!
Lavoro con Hasura/nuxt.js da un anno su diversi progetti.
Hasura è molto potente e le funzionalità in arrivo sono molto promettenti!

Mi piace molto il forum di Discourse (ma non conosco Ruby ed Ember), quindi ho provato a integrarci Hasura.

Poiché non sono uno sviluppatore Ruby, ho dovuto installarlo, ma ho avuto alcuni problemi nel configurare l’ambiente di sviluppo sul mio Mac. Sto lottando con il gem cppjieba_rb

Quindi ho semplicemente preso questo dump e lo ho configurato su PostgreSQL e Hasura.

Tutte le tabelle sembrano essere state importate. C’è solo una vista? (badge_posts)
Ho anche tracciato tutte le relazioni tra chiavi esterne, quindi posso eseguire query di questo tipo:

{
  posts {
    id
    user_id
    bookmarks {
      id
      name
    }
    uploads {
      id
      url
    }
  }
}

Questo è dove mi trovo ora…

Wow, promettente. Proverei a avviare un contenitore Hasura in un ambiente live e riferirei su ciò che ottengo. Possiamo confrontare le nostre osservazioni.

Per vostra informazione, per ottenere un shell psql in esecuzione sul server di database Postgres di Discourse in esecuzione, potete eseguire docker exec --user postgres -it app psql -d discourse. Per ottenere un dump completo, potete eseguire (nota: sto rimuovendo l’opzione -t qui poiché non è necessaria in questo caso):

docker exec --user postgres -i app pg_dump -Fc -d discourse > discourse.sql.pgcustom

Dovreste ora essere in grado di ripristinarlo su un Postgres containerizzato (docker pull postgres:10.12) e collegarlo a Hasura per lo sviluppo (utile principalmente a livello di sola lettura, poiché ora si tratta di un database separato).

Per farlo a livello di produzione, imposterei l’ambiente fornito da Discourse e ospiterei il vostro database su un servizio come Amazon RDS. Avrete così un facile accesso in lettura e scrittura a tale database.

Per ripristinare il dump sopra indicato in locale:

  1. Create una rete Docker:
docker network create discourse-dev-net
  1. In una prima 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

(Se desiderate che venga eseguito in background, credo possiate semplicemente sostituire -it con -d; -p 2345:5432 è opzionale ma comodo se volete connettervi a Postgres dal vostro host)

  1. In un’altra shell, create l’utente discourse in Postgres (necessario per il 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

(in seguito inserite la password due volte quando richiesto; ho usato discourse come password)

  1. Eseguite il ripristino:
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
  1. Per collegare Hasura al database sopra:
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

(Ora potete visitare http://localhost:1234)

Avendo sperimentato il database ereditato, ciò che @Falco afferma in questo post è molto evidente.

Non viene sfruttata quasi per nulla la potenza di Postgres. Quasi tutta la logica viene gestita nell’ambiente Ruby.

La mia conclusione è quindi che questo non è affatto di grande aiuto di per sé.

Un altro approccio consiste nell’utilizzare la funzionalità di schema remoto di Hasura, ma per farlo Discourse avrebbe bisogno di un’API GraphQL, non REST… quindi anche questo, di per sé, non è molto utile.

Tuttavia, esiste la possibilità di incapsulare API REST preesistenti in un livello GraphQL. Questo sembra più promettente rispetto a quanto sopra (o meglio, in combinazione con quanto sopra). In questo articolo, fanno riferimento a un repository con codice boilerplate per iniziare.

Grazie per le vostre risposte.

Non conosco molto bene Docker, ma il mio problema non è lì. Dato che non riesco a configurare un ambiente di sviluppo per Discourse, non ho un database… Solo questo dump vuoto.

Comunque, ho appena caricato questo dump su un’istanza di Heroku! Quindi potete provarlo dal vivo :slight_smile:
Andate su questo GraphiQL online e impostate questo endpoint:
https://discourse-hasura.herokuapp.com/v1/graphql
Potete sperimentare con esso! Non c’è alcuna password di amministratore, quindi potete anche eseguire mutazioni e sottoscrizioni…

È quello che ho scoperto quando ho testato Discourse su Hasura! Tutte le funzioni personalizzate, i trigger, i campi calcolati… sono definiti in Ruby. Poco portabile :confused:

Non utile, manca l’API GraphQL di Discourse. Ma questa è una potente funzionalità di Hasura. La uso molto con un GraphQL personalizzato di Stripe. Se avessimo un’API GraphQL per Discourse, potremmo collegarla al nostro GraphQL con lo schema remoto!

Sì, ma dovremmo costruire tutto lo schema e i resolver. Un sacco di lavoro!
Credo sia meglio utilizzare l’API aperta di Discourse qui: https://docs.discourse.org/ (nel pulsante di download) e utilizzarla con un generatore GraphQL come https://graphql-mesh.com/docs/handlers/openapi
Ci proverò appena possibile…

Ok, non vedo l’ora! Ho provato con graphql-mesh.
Quindi, il file OpenAPI sotto il pulsante di download in https://docs.discourse.org/ sembra rotto :confused:
Ho testato la validità qui con questo output:

Swagger schema validation failed. 
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/3
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/3
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/3
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/2
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/2
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/2
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/1
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/1
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/1
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/0
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/0
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/0
 
JSON_OBJECT_VALIDATION_FAILED

Error: Swagger schema validation failed. 
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/3
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/3
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/3
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/2
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/2
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/2
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/1
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/1
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/1
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/0
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/0
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/0
 
JSON_OBJECT_VALIDATION_FAILED
    at o (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:73766)
    at https://apitools.dev/swagger-parser/online/js/bundle.min.js:17:227596

SyntaxError: Swagger schema validation failed. 
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/3
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/3
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/3
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/2
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/2
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/2
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/1
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/1
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/1
  Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/0
    Data does not match any schemas from 'oneOf' at #/paths//page_view_total_reqs/get/parameters/0
      Missing required property: schema at #/
      Missing required property: content at #/
    Missing required property: $ref at #/paths//page_view_total_reqs/get/parameters/0
 
JSON_OBJECT_VALIDATION_FAILED
    at Function.o [as syntax] (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:73766)
    at validateSchema (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:5021)
    at SwaggerParser.validate (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:3171)

z-schema validation error: JSON_OBJECT_VALIDATION_FAILED
    at ZSchema.getLastError (https://apitools.dev/swagger-parser/online/js/bundle.min.js:17:211187)
    at validateSchema (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:4925)
    at SwaggerParser.validate (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:3171)

Quindi ho cercato un altro file OpenAPI o Swagger dell’API di Discourse. Ho trovato solo questo.
È leggermente rotto alla riga 426, ma l’ho corretto.

Dopo aver configurato graphql-mesh, ho ottenuto un’API GraphQL funzionante! Ma…
Questo file Swagger non è completo o è troppo vecchio. Ci sono solo 4 query, nessuna mutation, il tipo user ha poche proprietà… :confused:

Esiste da qualche parte un file Swagger o OpenAPI di Discourse?

Un lavoro che promette. Ottimo lavoro! Sarebbe utile se Discourse aderisse a specifiche Open come Swagger/OpenAPI. Spero tu trovi le informazioni che stai cercando.

Al momento non ho molto tempo per questo, ma ci tornerò sopra in seguito.

Lavoro interessante. Hai pubblicato questo codice da qualche parte per vedere quali query graphql sono possibili allo stato attuale?

Ho provato a votare ‘Altro’, ma non ha funzionato.

Scusa per la risposta in ritardo. Avevo perso la tua domanda.
Sì, puoi interagire con un endpoint GraphQL di Discourse Hasura: