Eu estava trabalhando em um projeto recentemente, em que associava extração de dados de três serviços independentes. As pessoas que estariam usando meu aplicativo tinham usuários e atividades em cada um deles. Meu software estava descobrindo quem era quem e agregando os dados em uma visão consolidada.
Enquanto escrevia os clientes para as diferentes APIs, percebi um padrão comum emergindo. Depois de receber os dados de que precisava, transformei-os em uma forma que pudesse usar e coloquei-os no modelo, geralmente com um find_or_create_by
.
Decidi construir uma gema que lidaria com isso usando um arquivo yaml simples no diretório de configuração. Cada arquivo seria nomeado após um serviço e em cada serviço seria um conjunto de recursos.
Isso resulta em um arquivo de configuração como:
# config/spigot/github.yml
user:
full_name: name
login: username
contact: email
A ordem dos valores-chave foi surpreendentemente importante. Comecei com as chaves sendo o nome do atributo em seu banco de dados. No entanto, quando você começa a considerar os dados da API com hashes aninhados, fica difícil transmitir a estrutura de maneira adequada. Invertê-lo para imitar a estrutura dos dados recebidos torna o formato do arquivo de configuração muito mais claro à primeira vista.
O Spigot lê esse arquivo e o usa para obter os valores necessários dos dados e os formata em algo que seu modelo possa entender. A única outra informação de que seu modelo precisa é de qual serviço os dados estão vindo. Resultando em uma assinatura de método como esta:
User.find_or_create_by_api(:github, data)
Bom e limpo, exatamente o que eu estava procurando. Depois que terminei de escrever a gema, publiquei-a e incluí-a no projeto original que forneceu a razão para escrever a gema em primeiro lugar. Foi ótimo quando eu defini o arquivo de configuração e substituí quatro métodos em meu modelo de usuário, e funcionou na primeira tentativa.
Infelizmente, outros problemas estão surgindo, agora que estou entrando na implementação real. Existem casos extremos, como preparar os dados antes, construir associações depois, interpolar valores como um gravatar_id em um url. Esses tipos de coisas devem ser tratadas por seu arquivo de configuração no final. Esperançosamente, depois de mais algum trabalho, o Spigot pode cuidar de todos esses casos e ajudar as pessoas a limpar o consumo de API.