Penguin Adinfo

O Penguin Adinfo é um recurso que tem como objetivo o controle e padronização do uso de parametrização e nomenclatura de mídia digital.

A solução proposta é uma API open source que através de rotas de requisição trabalha inputs de URLs a parametrizar e seus respectivos campos para devolver a parametrização já com uma validação dos campos preenchidos e de status de requisição dos links.

Os principais componentes no uso da aplicação são a configuração, um JSON contendo quais campos são aceitos na taxonomia de mídia, o permissionamento para controle de ações permitidas por nível de acesso, e o arquivo de parametrização, um CSV contendo a lista de URLs e os campos preenchidos conforme o que foi configurado.

Principais propostas de valor

NPM Run

Requisitos para utilização

Produtos do GCP (sugestão)

O adinfo pode ser implementado em diferentes provedores de nuvem ou em ambientes on-premise. Listaremos aqui sugestões de serviços do GCP que podem ser utilizados para complementar a infraestrutura da API.

Instalação

Clone o projeto do github para sua máquina local ou Cloud Shell

git clone https://github.com/DP6/penguin-adinfo.git

Instalação GCP via Terraform

Pré-requisitos

  1. Google Cloud SDK;
  2. Pacote zip;
  3. Terraform;
  4. Habilitar o App Engine em ambiente de execução Node.js, Firestore e Cloud Storage (necessário ter um billing ativo), no GCP;
  5. Gerar uma senha com o Bcrypt Generator para informar no usuário owner do adinfo;
  6. Criar o arquivo gcp_key_terraform.json contendo a chave json de uma conta de serviço GCP com as permissões necessárias para as subidas dos serviços via terraform;
  7. Criação do arquivo .env especificado na sessão Configuração do ambiente de desenvolvimento.

Passos

  1. Execute o script terraform_deploy.sh;

  2. Informe o nome da empresa, ferramenta analítica utilizada para a criação de um exemplo de configuração (Adobe Analytics ou Google Analytics) e o id do projeto. Também é possível informar o número da porta onde o adinfo irá rodar, entretanto esse último valor é opcional, caso nenhuma porta seja específica, por padrão ele executará na porta 443;

  3. Crie uma coleção no Firestore com o nome de tokens e insira um primeiro token com os seguintes campos (deixe o id do documento vazio para que seja gerado automaticamente):

{
	company: "NOME_EMPRESA" (string),
    agency: "agencia do usuário" (string,
	permission: "owner" (string)
	email: "email_do_usuario" (string)
	password: "senha_criptografada" (string),
    activate: true (boolean)
}

Instalação manual - GCP

Durante toda a etapa de desenvolvimento do adinfo ele é hospedado no serviço de App Engine do GCP, além de armazenar informações no Firestore e Storage.

Configuração do Firestore e Storage

Por padrão, ao utilizar o adinfo dentro do App Engine, basta conceder acesso à conta de serviço para o Storage e Firestore para que todos os recursos funcionem corretamente. Caso o adinfo esteja hospedado fora do GCP ou em outro projeto, é necessário informar a chave de autenticação na inicialização das classes, dentro nos arquivos FirestoreConnectionSingleton e StorageConnectionSingleton.

Configuração inicial do Storage

Crie um bucket para armazenar os arquivos do adinfo, o bucket em questão deve ser informado no .env. Por padrão os arquivos serão salvos dentro do bucket informado e separados dentro de pastas para cada agência.

Configuração inicial do Firestore

Para a configuração inicial do Firestore, são necessárias quatro coleções.

Padrão do Objeto de Configuração

Para utilizar a API, é necessário criar um documento de configuração no Firestore dentro da coleção: companies > [nome_empresa] > config. O nome do documento deve ser config_1 e ele deve conter os campos: version inicialmente com o valor 1 (number), insertTime no formato yyyyMMddHHmmss, csvSeparator, separator, spaceSeparator, columns e um campo para a ferramenta de analytics, sendo esse o valor de ga ou adobe.

Todos estes campos serão utilizados para realizar a parametrização do arquivo CSV que a API irá receber.

Aqui a API disponibiliza a funcionalidade de definirmos no campo csvSeparator uma lista contendo a prioridade de todos os possíveis caracteres que poderão ser utilizados como separadores no arquivo CSV pelos usuários. Com isso, a aplicação irá consultar essa fonte e utilizar o devido separador para parametrizar o arquivo submetido.

Entretanto, este campo no arquivo de configuração não é obrigatório. Caso o campo não seja preenchido, a aplicação irá tentar verificar se o arquivo submetido está utilizando vírgula ou ponto e vírgula como separador e utilizar o separador identificado para a parametrização. Caso não encontre nenhum dos dois caracteres, a API irá utilizar a vírgula como separador.

Abaixo segue uma explicação e um exemplo de todos os campos das configurações.

Chave Tipo Descrição Obrigatório
csvSeparator Array Array que irá conter todos os separadores de colunas que os arquivos CSV poderão conter. Não
separator String String que será utilizada na concatenação dos campos. Sim
spaceSeparator String String que substituirá o espaço na URL, caso alguma campo tenha preenchido com mais de uma palavra. Sim
columns Objeto Objeto contendo as colunas do CSV e seus valores de aceitação. Sim
dependenciesConfig Objeto Objeto contendo as regras de dependências de validação. Não
insertTime String Data da criação do config no formato YYYYMMDDHHmmSS. Sim
version Number Número da versão do config. Sim
  Objeto Chave do veículo de mídia com suas configurações e quais colunas pertencem a cada configuração. Não
  Objeto Chave da ferramenta de analytics com suas configurações e quais colunas pertencem a cada configuração. Essa chave precisa obrigatoriamente receber o valor ga ou adobe. Sim

Exemplo de configuração:

{
	"separator": ":",
	"spaceSeparator": "_",
	"csvSeparator": [",", ";", "|"],
    "version": 1,
    "insertTime": "20220101000000",
	"columns": {
		//Colunas que aparecerão no CSV
		//A chave representa a coluna do CSV e o vetor de valores
		//representam os possíveis valores de preenchimento dos campos.
		//É possível informar valores ou expressões regulares para a validação.
		//As expressão regulares devem estar entre /,
		//assim como na chave "Produto"
		"Tipo de Compra": ["cpa", "cpc"],
		"Dispositivo": ["desktop e mobile"],
		"Produto": ["/.*/"]
	},
	"ga": {
		//Ferramenta de analytics, um outro valor possível seria "adobe"
		//As chaves são os parâmetros que a ferramenta aceita
		//Os valores passados no vetor são referentes às
		//colunas do CSV que o formam
		"utm_source": ["Tipo de Compra", "Dispositivo"],
		"utm_campaign": ["Produto"]
	},
	"googleads": {
		//Configuração do veículo de mídia
		//As chaves são os parâmetros do veículos.
		//Os valores passados no vetor são referentes às
		//colunas do CSV que o formam,
		//semelhante à ferramenta de analytics.
		"campanha": ["Tipo de Compra", "Dispositivo"],
		"ad": ["Produto"]
	},
	"dependenciesConfig": [
		//Campo de configurações de depêndencias
		{
			//De acordo com o exemplo, se a coluna "Dispositivo"
			//for preenchida com algum valor que contenha
			//a palavra "mobile", então a coluna "Tipo de Compra"
			//só poderá ser preenchida com os valores: cpc ou cpa.
			//Se a chave hasMatch estivesse com o valor "false"
			//significaria que a regra para a coluna "Tipo de Compra"
			//só seria aplicada, caso o valor preenchido na coluna "Dispositivo"
			//não contivesse a palavra "mobile".
			"columnReference": "Dispositivo",
			"valuesReference": ["/.*mobile.*/"],
			"hasMatch": true,
			"columnDestiny": "Tipo de Compra",
			"matches": ["cpc", "cpa"]
		}
	],
	"insertTime": "20211201193242",
	"version": 1,
}

Banco de dados alternativos

Atualmente o adinfo não disponibiliza por padrão um código de acesso à banco de dados diferentes do Storage e Firestore. Para conexões com outros ambientes a criação dos scripts se faz necessária.

Criação dos novos scripts

Caso o usuário opte por utilizar um banco de arquivos diferentes do Storage, é necessário que o script da nova classe herde de FileStore.

No caso de substituir o uso do Firestore para armazenamento de chaves. A nova classe deve herdar de ObjectStore.

Configuração do ambiente de desenvolvimento

  1. Arquivo .env: O arquivo .env deve estar localizado na raiz do projeto. É necessário editar as seguintes variáveis
  1. Arquivo .gitignore: Checar se o arquivo .gitignore está ignorando do arquivo .env.

Como contribuir

Pull requests são bem-vindos! Nós vamos adorar ajuda para evoluir esse modulo. Sinta-se livre para navegar por issues abertas buscando por algo que possa fazer. Caso tenha uma nova feature ou bug, por favor abra uma nova issue para ser acompanhada pelo nosso time.

Requisitos obrigatórios

Só serão aceitas contribuições que estiverem seguindo os seguintes requisitos:

Documentação de desenvolvimento

A documentação do código pode ser encontrada em docs/index.html.

A documentação de rotas da API se encontra no arquivo Routes.md.

Suporte:

DP6 Koopa-troopa Team

e-mail: koopas@dp6.com.br