- Testei, boa ideia
- Testei, má ideia
- Ainda não testei, mas parece interessante
- Por que perder tempo com isso?
- Não sei…
- Outro
Que legal, foi exatamente isso que fiz alguns dias atrás!
Trabalho com Hasura e nuxt.js há um ano em vários projetos.
O Hasura é muito poderoso, e os recursos que estão chegando são muito promissores!
Eu gosto muito do fórum Discourse (mas não conheço Ruby e Ember), então tentei integrá-lo ao Hasura.
Como não sou desenvolvedor Ruby, precisei instalá-lo, mas tive alguns problemas para configurar o ambiente de desenvolvimento no meu Mac. Estou tendo dificuldades com o gem cppjieba_rb…
Então, peguei apenas esse dump e configurei no PostgreSQL e no Hasura.
Parece que todas as tabelas foram importadas. Existe apenas uma view? (badge_posts)
Também mapeei todas as relações de chaves estrangeiras, então posso fazer consultas como esta:
{
posts {
id
user_id
bookmarks {
id
name
}
uploads {
id
url
}
}
}
É isso que consegui até agora…
Uau, promissor. Eu tentaria iniciar um container Hasura em um ambiente ao vivo e relataria o que obtivesse. Podemos trocar ideias.
Para sua informação, para obter um shell psql em execução do servidor de banco de dados Postgres do Discourse em execução, você pode executar docker exec --user postgres -it app psql -d discourse. Assim, para obter um dump completo, você pode executar (observe que estou removendo a opção -t aqui, pois não é necessária neste caso):
docker exec --user postgres -i app pg_dump -Fc -d discourse > discourse.sql.pgcustom
Agora você deve conseguir restaurar isso em um Postgres em Docker (docker pull postgres:10.12) e conectá-lo ao Hasura para desenvolvimento (realmente útil apenas no nível de somente leitura, pois agora é um banco de dados separado).
Para fazer isso em nível de produção, eu configuraria o ambiente fornecido pelo Discourse e hospedaria seu banco de dados em algo como o Amazon RDS. Assim, você terá acesso fácil para leitura e escrita nesse banco de dados.
Para restaurar o dump acima localmente:
- Crie uma rede Docker:
docker network create discourse-dev-net
- Em um primeiro terminal:
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 quiser que ele seja executado em segundo plano, acredito que basta substituir -it por -d; -p 2345:5432 é opcional, mas conveniente se quiser conectar-se ao Postgres a partir do seu host)
- Em outro terminal, crie o usuário discourse no Postgres (necessário para o 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
(você então digitará a senha duas vezes no prompt; eu usei discourse como senha)
- Execute a restauração:
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
- Para conectar o Hasura ao acima:
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
(Agora você pode acessar http://localhost:1234)
Depois de brincar um pouco com o banco de dados herdado, fica muito evidente o que @Falco diz nesta postagem.
O poder do Postgres é pouco utilizado. Quase toda a lógica é feita no mundo do Ruby.
Portanto, minha conclusão é que isso, por si só, não é de grande ajuda.
Outra abordagem seria usar a funcionalidade de esquema remoto do Hasura, mas, para isso, o Discourse precisaria de uma API GraphQL, não REST… então, também não é muito útil por si só.
No entanto, existe a possibilidade de envolver APIs REST pré-existentes em uma camada GraphQL. Isso parece mais promissor do que o anterior (ou melhor, em combinação com o anterior). Neste artigo, eles apontam para um repositório com código boilerplate para começar.
Obrigado pelas suas respostas.
Eu não domino muito bem o Docker, mas meu problema não está aí. Como não consigo configurar um ambiente de desenvolvimento do Discourse, não tenho banco de dados… Apenas esse dump vazio.
De qualquer forma, acabei de enviar esse dump em uma instância do Heroku! Então vocês podem testar ao vivo ![]()
Acesse esse GraphiQL online e configure o seguinte endpoint:
https://discourse-hasura.herokuapp.com/v1/graphql
Vocês podem brincar com ele! Não há senha de administrador, então também podem fazer mutações e assinaturas…
Isso é o que descobri ao testar o Discourse no Hasura! Todas as funções personalizadas, gatilhos, campos computados… são definidos no Ruby. Ruim para portabilidade ![]()
Não é útil, falta a API GraphQL do Discourse. Mas essa é uma funcionalidade poderosa do Hasura. Eu a uso bastante com uma API GraphQL personalizada do Stripe. Se conseguirmos uma API GraphQL do Discourse, podemos conectá-la ao nosso próprio GraphQL com esquema remoto!
Sim, mas teríamos que construir todo o esquema e os resolvers. Muito trabalho!
Acho que é melhor usar a API aberta do Discourse aqui: https://docs.discourse.org/ (no botão de download) e usá-la com um gerador GraphQL como https://graphql-mesh.com/docs/handlers/openapi
Vou tentar o mais breve possível…
Ok, mal posso esperar!. Tentei com graphql-mesh.
Então, o arquivo OpenAPI disponível sob o botão de download em https://docs.discourse.org/ parece estar quebrado ![]()
Testei a validade aqui com esta saída:
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)
Então, procurei por outro arquivo OpenAPI ou Swagger da API do Discourse. Encontrei apenas este.
Ele está um pouco quebrado na linha 426, mas eu corrigi.
Depois de configurar o graphql-mesh, obtive uma API GraphQL funcional! Mas…
Este arquivo Swagger não está completo ou está muito antigo. Há apenas 4 consultas, sem mutações, o tipo user com poucos propriedades… ![]()
Existe em algum lugar um arquivo Swagger ou OpenAPI do Discourse?
Trabalho com uma sonoridade promissora. Bem feito! Seria bom se o Discourse seguisse algumas especificações abertas como Swagger/OpenAPI. Espero que encontre as informações que está procurando.
Não tenho muito tempo para isso agora, mas voltarei a verificar em algum momento.
Trabalho interessante. Você publicou esse código em algum lugar para ver quais queries graphql são possíveis no estado atual?
Tentei votar em Outro, mas não funcionou.
Desculpe pela resposta tardia. Eu perdi sua pergunta.
Sim, você pode usar um endpoint GraphQL do Discourse Hasura:
