Was this page helpful?

Configurando ambiente de produção

    Instalação

    Esta seção descreve como instalar o graphql-ufg a partir do código fonte.

    Instalação de pacotes requeridos:

    Os seguintes pacotes são requeridos para a instalação do graphql-ufg:

    Package Description
    Docker A Better Way to Build Apps
    Docker-compose Compose is a tool for defining and running multi-container Docker applications.
    Git Is a version control system

     

    Instalação

    Passo a passo com exemplos para instalar e rodar este software em ambiente local

    a. Faça uma cópia do projeto para seu computador:

    git clone http://git.cercomp.ufg.br/joserochadocarmo/graphql-ufg.git
    

    b. Agora entre dentro da pasta do projeto execute o comando abaixo para criarmos uma imagem no docker:

    docker build -t graphql-ufg .
    
     
    c. Agora com a image criada é só rodar o projeto, com o seguinte comando na mesma pasta:
    docker-compose up -d

    d. Pronto, agora é só acessar pelo navegador, bem rápido né?

    https://localhost:3000/ --URL raiz: 
    https://localhost:3000/explore --Para escrever consultas utilizamos o Graphiql

    Executando consultas

    Há diversas maneiras de integrar com um backend graphql, a solicitação(request) é da mesma forma que é feita com rest, podemos utilizar curl, o navegador, jquery, Postman e qualquer linguagem de programaçao!

    Exemplos:

    CURL

    curl -XPOST -d 'query={Weby{sites(limit:10){name}}}&pretty' https://localhost:3000/graphql
    curl -XPOST -d '{"query": "query($numberOfBuilds:Int) { viewer { user { name builds(first: $numberOfBuilds) { edges { node { number branch message } } } } } }","variables": { "numberOfBuilds": 1 }}' 'https://localhost:3000/graphql' -H 'Authorization: Bearer xxxxxxx'

    No browser

    http://127.0.0.1:3000/graphql?query={Weby { sites{ title }}}&pretty=true

    Java

    httpClientForGraphql=HttpClients.createDefault();
    HttpPost httpPost= new HttpPost("https://localhost:3000/graphql");
    String query= "query\":\"{Weby{sites(limit:10){name}}}";
    StringEntity params= new StringEntity(query);
    httpPost.setEntity(params);
    httpResponseFromGraphql= httpClientForGraphql.execute(httpPost);
    

    Javascript

    fetch("https://localhost:3000/graphql",
        {
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            method: "POST",
            body: "{'query': 'query { Sites { id, name } }'}"
        })
        .then(function (res) {
            console.log(res);
        })

    Polymer

    <iron-ajax url="https://localhost:3000/graphql"
      params='{"query":"{Weby { sites{title} }"}'
      method="POST" last-response="{{sites}}" auto>
    </iron-ajax>
    

    Opções

    A api Graphql da UFG aceita as seguintes opções:

    • pretty: Apresenta os dados de forma mais legível, serve para os formatos JSON, CSV e XML, default é falso.
    • query: Parâmetro obrigatório como uma consulta para o Grpahql executar.
    • type: Parâmetro para especificar o tipo de retorno: type=json, type=csv, type=xml, type=json_flat, padrão é json. pode-se utilizar o pretty para visualizar no navegador.
    • variables: Valor em formato json a serem passados para query.
    • operationName: Se a consulta contem multiplas operações, este parâmentro especifica qual operação de ser executada.
    • expire: Utilizado para fazer cache de consultas graphql, expire=60s, faz cache da consulta por 60 segundos. expire=86400s, um dia de cache.

    Validação de uma query

    Esta rota é utilizado em casos mais complexos, que exigem por exemplo o cadastro de uma query.https://localhost:3000/validQuery?query=%7B%0A%20%20Censo%7B%0A%20%20%20%20CensoAluno%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20nome%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D

    Retornar o metadado de uma query

    Esta rota é utilizado em casos mais complexos, que exigem por exemplo descriçoes, nomes de fields, alias do field.https://localhost:3000/metadataQuery?query=%7B%0A%20%20Censo%7B%0A%20%20%20%20CensoAluno%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20nome%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D

    Uso de Diretivas

    O graphql suporta o uso de directivas, que ajudam na manipulação de dados, como por exemplo, a formatação de datas, números e textos.

    ALERTA: É contra indicado o uso de diretivas para retornar dados não paginados, ou seja, quanto maior o numero de linhas retornados utilizando directivas e sem paginar, pior será a perfomance.

    As directivas de datas utilizam o moment.js, e as outras o lodash.js

     {
       Weby {
         Sites(limit: 10) {
           title @capitalize
           description @template(as:"SITE: ${toUpper(input)}")
           titleUpper: title @upperCase
           titleLower: title @lowerCase
           titleCamel: title @camelCase
           created_at
           ano: created_at @date(as: "YYYY")
           daysAgo: created_at @date(as: "days ago")  @upperCase
           LLLL: created_at @date(as: "LLLL")
           l: created_at @date(as: "l")
           format: created_at @date(as: "DD/MM/YYYY")
           formatTime: created_at @date(as: "DD/MM/YYYY h:mm:ss a")
           dataDefault: created_at @default(to:"NADA AINDA") #Se null ou indefinido
           sexo @yesNo(asTrue:"Feminino",asFalse:"Masculino")
           ativo @yesNo
           cor_raca @decode(as:"0-BRANCA,1-PARDO,2-AMARELO,3-NEGRO")
         }
       }
     }

    Mostrar a idade com uso de uma diretiva

    dt_nascimento: data_de_nascimento @fromNow(as:true)

    Modo de debug

    DEBUG=join-monster npm run dev

    Adicionar um order by dinamicamente

    where: (unidadesTable, args) => {
         !args.order && (args.order ="sigla ASC");
         return customWhere(args);
    }

    Logging

    A arquitetura de log do projeto é feita utilizando o pacote pino.js do Node.js e o Redis para as consultas Graphql.

    log.info('hello world')
    log.debug('WTF?')
    log.error('this is at error level')

    Em desenvolvimento o log é printado no shell, em produção é gravado em um arquivo.

    Por motivos de performace, em produção, somente log.error é registrado e deve ser utilizado corretamente. log.error, deve ser utilizado quando você realmente necessita que tal mensagem da exceção seja registrado. Erros de validação, ou de uma regra de negócio deve-se utilizar log.info, log.debug.

    Enviando emails

    A arquitetura de envio de emails utiliza o nodemailer.js.

    Veja como é facil enviar emails:

    // Você pode criar mais de um client smtp
    const mail = require('../../lib/datasources')('zimbra');
    
    let mailOptions = {
        from: '"noreply" <noreply@ufg.br>', // sender address
        to: 'joserocha@ufg.br', // list of receivers
        subject: 'Hello From Graphql ✔', // Subject line
        text: 'Hello world !', // plain text body
        html: '<b>Hello world do integra-ufg !</b>' // html body
    };
    
    mail.sendMail(mailOptions, (error, info) => {
        if (error) {
            log.error(error);
            return error;
        }
        log.debug('Message %s sent: %s', info.messageId, info.response);
    });
    
    //Enviar email de forma assincrona
    
    return new Promise((resolve, reject) => {
        mail.sendMail(mailOptions, (err, data) => {
            if (err) {
                return reject(err);
            } else {
                return resolve(data);
            }
        });
    });
    Was this page helpful?
    Marcadores (Editar marcadores)
    • No tags
    Estatísticas da página
    440 view(s), 7 edit(s) and 14717 character(s)

    Comentários

    Faça o login para escrever um comentário.

    Anexar arquivo

    Anexos