Move GraphQL code examples to the GraphQL docs

While this leads to a bit of duplication, since now the same code is in
both the Spanish and English texts, and it makes it harder to actually
run the code, it'll make it easier for people reading the documentation
to find the code, and we get rid of the confusingly-named `doc/` folder.
This commit is contained in:
Javi Martín
2024-09-17 15:45:30 +02:00
parent a5aa39f6e2
commit d00b431f58
4 changed files with 224 additions and 99 deletions

View File

@@ -17,6 +17,8 @@
* [Ejemplo de consulta demasiado profunda](#ejemplo-de-consulta-demasiado-profunda)
* [Ejemplo de consulta demasiado compleja](#ejemplo-de-consulta-demasiado-compleja)
* [Ejemplos de código](#ejemplos-de-codigo)
* [Ejemplo sencillo](#ejemplo-sencillo)
* [Ejemplo con paginación](#ejemplo-con-paginacion)
<h2 id="caracteristicas">Características</h2>
@@ -425,4 +427,113 @@ La respuesta:
<h2 id="ejemplos-de-codigo">Ejemplos de código</h2>
El directorio [doc/api/examples](https://github.com/consuldemocracy/consuldemocracy/tree/master/doc/api/examples/ruby) contiene ejemplos de código para acceder a la API.
### Ejemplo sencillo
Este es un ejemplo sencillo de código accediendo a la API de la demo de Consul Democracy:
```ruby
require "net/http"
API_ENDPOINT = "https://demo.consuldemocracy.org/graphql".freeze
def make_request(query_string)
uri = URI(API_ENDPOINT)
uri.query = URI.encode_www_form(query: query_string)
request = Net::HTTP::Get.new(uri)
request[:accept] = "application/json"
Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |https|
https.request(request)
end
end
query = <<-GRAPHQL
{
proposal(id: 1) {
id,
title,
public_created_at
}
}
GRAPHQL
response = make_request(query)
puts "Response code: #{response.code}"
puts "Response body: #{response.body}"
```
<h3 id="ejemplo-con-paginacion">Ejemplo con paginación</h3>
Y este es un ejemplo un tanto más complejo usando paginación, una vez más accediendo a la API de la demo de Consul Democracy:
```ruby
require "net/http"
require "json"
API_ENDPOINT = "https://demo.consuldemocracy.org/graphql".freeze
def make_request(query_string)
uri = URI(API_ENDPOINT)
uri.query = URI.encode_www_form(query: query_string)
request = Net::HTTP::Get.new(uri)
request[:accept] = "application/json"
Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |https|
https.request(request)
end
end
def build_query(options = {})
page_size = options[:page_size] || 25
page_size_parameter = "first: #{page_size}"
page_number = options[:page_number] || 0
after_parameter = page_number.positive? ? ", after: \"#{options[:next_cursor]}\"" : ""
<<-GRAPHQL
{
proposals(#{page_size_parameter}#{after_parameter}) {
pageInfo {
endCursor,
hasNextPage
},
edges {
node {
id,
title,
public_created_at
}
}
}
}
GRAPHQL
end
page_number = 0
next_cursor = nil
proposals = []
loop do
puts "> Requesting page #{page_number}"
query = build_query(page_size: 25, page_number: page_number, next_cursor: next_cursor)
response = make_request(query)
response_hash = JSON.parse(response.body)
page_info = response_hash["data"]["proposals"]["pageInfo"]
has_next_page = page_info["hasNextPage"]
next_cursor = page_info["endCursor"]
proposal_edges = response_hash["data"]["proposals"]["edges"]
puts "\tHTTP code: #{response.code}"
proposal_edges.each do |edge|
proposals << edge["node"]
end
page_number += 1
break unless has_next_page
end
```