Pagination – Synchroniser une démarche à faible volumétrie (polling simple)
Exemple de cas d'usage : votre démarche a moins de 100 changements sur ses dossiers par jour et vous souhaitez synchroniser tous les dossiers dans votre SI.
Nos API renvoient jusqu'à 100 dossiers maximum par requête. De fait, si il y a moins de 100 dossiers modifiés par jours sur votre démarche, une tache planifiée (ex quotidienne) récupérant tous les derniers dossiers modifiées vous permettra de suivre tous les dossiers.
Ainsi il est plus intéressant d'éviter la compléxité d'un mechanisme de pagination au profit d'un mechanisme de polling.
require'date'require'net/http'require'uri'require'json'ENDPOINT=URI('https://www.demarches-simplifiees.fr/api/v2/graphql')### that's the GraphQL part.QUERY=<<~QUERYquery getDemarche( $demarcheNumber: Int! $last: Int $after: String $updatedSince: ISO8601DateTime $includeDossiers: Boolean = true ) { demarche(number: $demarcheNumber) { dossiers( last: $last after: $after updatedSince: $updatedSince ) @include(if: $includeDossiers) { pageInfo { ...PageInfoFragment } nodes { id dateDerniereModification } pageInfo { endCursor hasNextPage } } } } fragment PageInfoFragment on PageInfo { hasPreviousPage hasNextPage endCursor }QUERY### that's the HTTP part# open an http connexion to our GraphQL endpointdefopen_http_connection http =Net::HTTP.new(ENDPOINT.host,ENDPOINT.port)ifENDPOINT.scheme =='https' http.use_ssl =true http.verify_mode =OpenSSL::SSL::VERIFY_NONEend httpend# the headers of our http query, include authdefrequest_headers {"Content-Type"=>"application/json","Authorization"=>"Bearer #{ENV.fetch('API_TOKEN') { raise'missing env var API_TOKEN' }}" }end# given an http connexion, request the API for pagedefrequest_page(http)# the data of our query data = {"query"=>QUERY,"operationName"=>"getDemarche","variables"=> {"demarcheNumber":ENV.fetch('DEMARCHE_NUMBER') { raise'missing env var DEMARCHE_NUMBER' }.to_i,"last":1,# récupérer le derniers, le sens de la pagination"updatedSince":Date.new(2020,2,22).iso8601 # récuperer les dossiers par ordre de derniere date de mise a jour } } req =Net::HTTP::Post.new(ENDPOINT, request_headers) req.body = data.to_json response = http.request(req) data =JSON.parse(response.body) dataendhttp = open_http_connection# check if we persisted a cursor so we continue pollingdata = request_page(http)dossiers = data.dig('data','demarche','dossiers','nodes')puts"Info: fetched dossiers ids: #{dossiers.map { _1['number'] }.join(', ')}"puts"Debug: #{data.inspect}"