-
Notifications
You must be signed in to change notification settings - Fork 7
/
index.html
598 lines (598 loc) · 42 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
<!doctype html>
<html class="default no-js">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>penguin-adinfo</title>
<meta name="description" content="Documentation for penguin-adinfo">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="assets/css/main.css">
<script async src="assets/js/search.js" id="search-script"></script>
</head>
<body>
<header>
<div class="tsd-page-toolbar">
<div class="container">
<div class="table-wrap">
<div class="table-cell" id="tsd-search" data-index="assets/js/search.json" data-base=".">
<div class="field">
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label>
<input id="tsd-search-field" type="text" />
</div>
<ul class="results">
<li class="state loading">Preparing search index...</li>
<li class="state failure">The search index is not available</li>
</ul>
<a href="index.html" class="title">penguin-adinfo</a>
</div>
<div class="table-cell" id="tsd-widgets">
<div id="tsd-filter">
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
<div class="tsd-filter-group">
<div class="tsd-select" id="tsd-filter-visibility">
<span class="tsd-select-label">All</span>
<ul class="tsd-select-list">
<li data-value="public">Public</li>
<li data-value="protected">Public/Protected</li>
<li data-value="private" class="selected">All</li>
</ul>
</div>
<input type="checkbox" id="tsd-filter-inherited" checked />
<label class="tsd-widget" for="tsd-filter-inherited">Inherited</label>
<input type="checkbox" id="tsd-filter-externals" checked />
<label class="tsd-widget" for="tsd-filter-externals">Externals</label>
</div>
</div>
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
</div>
</div>
</div>
</div>
<div class="tsd-page-title">
<div class="container">
<h1>penguin-adinfo</h1>
</div>
</div>
</header>
<div class="container container-main">
<div class="row">
<div class="col-8 col-content">
<div class="tsd-panel tsd-typography">
<a href="#penguin-adinfo" id="penguin-adinfo" style="color: inherit; text-decoration: none;">
<h1>Penguin Adinfo</h1>
</a>
<div align="center">
<img src="https://raw.githubusercontent.com/DP6/templates-centro-de-inovacoes/main/public/images/centro_de_inovacao_dp6.png" height="100px" />
</div>
<div align="center">
<img src="https://img.shields.io/codacy/grade/6276f660577e41e0a7b7e4605c4f0434">
<img src="https://img.shields.io/codacy/coverage/6276f660577e41e0a7b7e4605c4f0434">
<img src="https://img.shields.io/github/issues/DP6/penguin-adinfo">
<img src="https://img.shields.io/github/license/DP6/penguin-adinfo">
</div>
<p>O Penguin Adinfo é um recurso que tem como objetivo o <strong>controle</strong> e <strong>padronização</strong> do uso de parametrização e nomenclatura de mídia digital.</p>
<p>A solução proposta é uma <strong>API</strong> open source que através de rotas de requisição trabalha <em>inputs</em> de URLs a parametrizar e seus respectivos campos para devolver a parametrização já com uma <strong>validação</strong> dos campos preenchidos e de status de requisição dos links.</p>
<p>Os principais componentes no uso da aplicação são a <strong>configuração</strong>, um JSON contendo quais campos são aceitos na taxonomia de mídia, o <strong>permissionamento</strong> para controle de ações permitidas por nível de acesso, e o <strong>arquivo de parametrização</strong>, um CSV contendo a lista de URLs e os campos preenchidos conforme o que foi configurado.</p>
<a href="#principais-propostas-de-valor" id="principais-propostas-de-valor" style="color: inherit; text-decoration: none;">
<h2>Principais propostas de valor</h2>
</a>
<ul>
<li>Independência de qualquer programa para a abertura das planilhas durante o processo de parametrização, o que comumente compromete a performance pelo uso extensivo de fórmulas.</li>
<li>Possibilidade do uso da API em planilhas, externalizando o processamento para uma transformação puramente sobre os dados.Controle de permissões com 3 níveis, cada qual incluindo os seguintes: Controle de <strong>acessos</strong>, edição de <strong>configurações</strong>, realização da <strong>parametrização</strong>.</li>
<li>Os acessos podem ser divididos em grupos ou projetos, para que por exemplo diferentes agências possam todas ter seu nível de configuração, mas apenas para suas próprias campanhas.</li>
<li>Escalabilidade de uso por suportar grandes tamanhos de arquivo e histórico.</li>
</ul>
<a href="#npm-run" id="npm-run" style="color: inherit; text-decoration: none;">
<h2>NPM Run</h2>
</a>
<ul>
<li><strong>start</strong>: executa a aplicação;</li>
<li><strong>unit-test</strong>: Realiza uma bateria de testes unitários dos arquivos de typescript presentes na pasta test/;</li>
<li><strong>test</strong>: Realiza uma bateria de testes unitários dos arquivos de typescript presentes na pasta test/;</li>
<li><strong>lint</strong>: Submete o código a uma avaliação do <a href="https://eslint.org/">ESLint</a>;</li>
<li><strong>lint-fix</strong>: Submete o código a uma avaliação do <a href="https://eslint.org/">ESLint</a> e aplica correções automaticamente ao código;</li>
<li><strong>compile</strong>: Compila o código do typescript para javascript, guardando-o na pasta dist/;</li>
<li><strong>auto-compile</strong>: Realiza a compilação dos arquivos typescript em tempo real, armazenando o resultado dentro da pasta dist/, sem excluir o conteúdo anterior;</li>
<li><strong>prettier</strong>: Formata todo o código das pastas src/ e test/, utilizando o <a href="https://prettier.io/">Prettier</a>, de acordo com a configuração descrita no arquivo .prettierrc;</li>
<li><strong>coverage</strong>: Análise da cobertura dos testes;</li>
<li><strong>build</strong>: Executa o compile do código typescript para javascript.</li>
</ul>
<a href="#requisitos-para-utilização" id="requisitos-para-utilização" style="color: inherit; text-decoration: none;">
<h2>Requisitos para utilização</h2>
</a>
<ul>
<li>Ambiente de hospedagem de aplicações, em nuvem ou on-premise;</li>
<li>Banco de dados para armazenamento de arquivos no formato csv;</li>
<li>Banco de dados NoSQL para armazenamento de objetos JSON.</li>
</ul>
<a href="#produtos-do-gcp-sugestão" id="produtos-do-gcp-sugestão" style="color: inherit; text-decoration: none;">
<h3>Produtos do GCP (sugestão)</h3>
</a>
<p>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.</p>
<ul>
<li>App Engine</li>
<li>Cloud Storage</li>
<li>Firestore</li>
</ul>
<a href="#instalação" id="instalação" style="color: inherit; text-decoration: none;">
<h2>Instalação</h2>
</a>
<p>Clone o projeto do github para sua máquina local ou Cloud Shell</p>
<pre><code class="language-console">git clone https://github.com/DP6/penguin-adinfo.git
</code></pre>
<a href="#instalação-gcp-via-terraform" id="instalação-gcp-via-terraform" style="color: inherit; text-decoration: none;">
<h3>Instalação GCP via Terraform</h3>
</a>
<a href="#pré-requisitos" id="pré-requisitos" style="color: inherit; text-decoration: none;">
<h4>Pré-requisitos</h4>
</a>
<ol>
<li><a href="https://cloud.google.com/sdk/docs/install?hl=pt-br">Google Cloud SDK</a>;</li>
<li>Pacote zip;</li>
<li><a href="https://www.terraform.io/">Terraform</a>;</li>
<li>Habilitar o App Engine em ambiente de execução Node.js, Firestore e Cloud Storage (necessário ter um billing ativo), no GCP;</li>
<li>Gerar uma senha com o <a href="https://bcrypt-generator.com/">Bcrypt Generator</a> para informar no usuário owner do adinfo;</li>
<li>Criar o arquivo <strong>gcp_key_terraform.json</strong> 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;</li>
<li>Criação do arquivo <strong>.env</strong> especificado na sessão <strong>Configuração do ambiente de desenvolvimento</strong>.</li>
</ol>
<a href="#passos" id="passos" style="color: inherit; text-decoration: none;">
<h4>Passos</h4>
</a>
<ol>
<li><p>Execute o script <strong>terraform_deploy.sh</strong>;</p>
</li>
<li><p>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;</p>
</li>
<li><p>Crie uma coleção no Firestore com o nome de <strong>tokens</strong> e insira um primeiro token com os seguintes campos (deixe o id do documento vazio para que seja gerado automaticamente):</p>
</li>
</ol>
<pre><code><span style="color: #000000">{</span>
<span style="color: #000000"> company: </span><span style="color: #A31515">"NOME_EMPRESA"</span><span style="color: #000000"> (</span><span style="color: #001080">string</span><span style="color: #000000">),</span>
<span style="color: #000000"> agency: </span><span style="color: #A31515">"agencia do usuário"</span><span style="color: #000000"> (</span><span style="color: #001080">string</span><span style="color: #000000">,</span>
<span style="color: #000000"> </span><span style="color: #001080">permission</span><span style="color: #000000">: </span><span style="color: #A31515">"owner"</span><span style="color: #000000"> (</span><span style="color: #001080">string</span><span style="color: #000000">)</span>
<span style="color: #000000"> </span><span style="color: #001080">email</span><span style="color: #000000">: </span><span style="color: #A31515">"email_do_usuario"</span><span style="color: #000000"> (</span><span style="color: #001080">string</span><span style="color: #000000">)</span>
<span style="color: #000000"> </span><span style="color: #001080">password</span><span style="color: #000000">: </span><span style="color: #A31515">"senha_criptografada"</span><span style="color: #000000"> (</span><span style="color: #001080">string</span><span style="color: #000000">),</span>
<span style="color: #000000"> </span><span style="color: #001080">activate</span><span style="color: #000000">: </span><span style="color: #0000FF">true</span><span style="color: #000000"> (</span><span style="color: #001080">boolean</span><span style="color: #000000">)</span>
<span style="color: #000000">}</span>
</code></pre>
<a href="#instalação-manual---gcp" id="instalação-manual---gcp" style="color: inherit; text-decoration: none;">
<h3>Instalação manual - GCP</h3>
</a>
<p>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.</p>
<a href="#configuração-do-firestore-e-storage" id="configuração-do-firestore-e-storage" style="color: inherit; text-decoration: none;">
<h4>Configuração do Firestore e Storage</h4>
</a>
<p>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 <strong>FirestoreConnectionSingleton</strong> e <strong>StorageConnectionSingleton</strong>.</p>
<a href="#configuração-inicial-do-storage" id="configuração-inicial-do-storage" style="color: inherit; text-decoration: none;">
<h5>Configuração inicial do Storage</h5>
</a>
<p>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.</p>
<a href="#configuração-inicial-do-firestore" id="configuração-inicial-do-firestore" style="color: inherit; text-decoration: none;">
<h5>Configuração inicial do Firestore</h5>
</a>
<p>Para a configuração inicial do Firestore, são necessárias quatro coleções.</p>
<ul>
<li><p><strong>companies</strong>: essa coleção deve deve conter um documento com o nome da empresa. Dentro desse documento, uma segunda coleção deve ser criada com o nome <em>config</em>. Seguindo a estrutura: companies > [nome_empresa] > config;</p>
</li>
<li><p><strong>blocklist</strong>: coleção criada para armazenar tokens bloqueados de login;</p>
</li>
<li><p><strong>campaigns</strong>: coleção criada para armazenar as campanhas de cada agência;</p>
</li>
<li><p><strong>agencies</strong>: coleção criada para armazenar as agências que utilizam o adinfo;</p>
</li>
<li><p><strong>tokens</strong>: essa coleção também deve ser criada com um documento seguindo a estrutura:</p>
<pre><code><span style="color: #000000">{</span>
<span style="color: #000000"> company: </span><span style="color: #A31515">"NOME_EMPRESA"</span><span style="color: #000000"> (</span><span style="color: #001080">string</span><span style="color: #000000">),</span>
<span style="color: #000000"> agency: </span><span style="color: #A31515">"agencia do usuário"</span><span style="color: #000000"> (</span><span style="color: #001080">string</span><span style="color: #000000">,</span>
<span style="color: #000000"> </span><span style="color: #001080">permission</span><span style="color: #000000">: </span><span style="color: #A31515">"owner"</span><span style="color: #000000"> (</span><span style="color: #001080">string</span><span style="color: #000000">),</span>
<span style="color: #000000"> </span><span style="color: #001080">email</span><span style="color: #000000">: </span><span style="color: #A31515">"email_do_usuario"</span><span style="color: #000000"> (</span><span style="color: #001080">string</span><span style="color: #000000">),</span>
<span style="color: #000000"> </span><span style="color: #001080">password</span><span style="color: #000000">: </span><span style="color: #A31515">"senha_criptografada"</span><span style="color: #000000"> (</span><span style="color: #001080">string</span><span style="color: #000000">),</span>
<span style="color: #000000"> </span><span style="color: #001080">activate</span><span style="color: #000000">: </span><span style="color: #0000FF">true</span><span style="color: #000000"> (</span><span style="color: #001080">boolean</span><span style="color: #000000">)</span>
<span style="color: #000000">}</span>
</code></pre>
<p>Para esse documento, é importante manter o Código do Documento gerado automaticamente pelo google, pois ele será utilizado como o ID do usuário em alguns processos.
O campo <strong>password</strong> deve ser informado com a criptografia. Para preenchimento manual é possível utilizar o <a href="https://bcrypt-generator.com/">Bcrypt Generator</a> para gerar a senha criptografada.
O campo <em>agency</em> diz respeito a agência a qual pertence o usuário que está sendo criado. Caso o nível de permissão desse usuário seja "owner" ou "admin", deixe este campo em branco.</p>
</li>
<li><p><strong>campaigns</strong>: Essa coleção deve ser criada na raiz do firestore , mas não há a necessidade de criar nenhum documento dentro dela. Os documentos serão gerados automaticamente conforme o uso do adinfo, armazenando as campanhas que serão criadas e seus atributos</p>
</li>
<li><p><strong>blocklist</strong>: Essa coleção deve ser criada na raiz do firestore , mas não há a necessidade de criar nenhum documento dentro dela. Os documentos serão gerados automaticamente conforme o uso do adinfo, adicionando os tokens dos usuários que derem logout na aplicação, pois este token, mesmo que ainda válido, não deve ser usado ainda para acessar a interface.</p>
</li>
</ul>
<a href="#padrão-do-objeto-de-configuração" id="padrão-do-objeto-de-configuração" style="color: inherit; text-decoration: none;">
<h6>Padrão do Objeto de Configuração</h6>
</a>
<p>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 <strong>config_1</strong> e ele deve conter os campos: <strong>version</strong> inicialmente com o valor 1 (number), <strong>insertTime</strong> no formato <em>yyyyMMddHHmmss</em>, <strong>csvSeparator</strong>, <strong>separator</strong>, <strong>spaceSeparator</strong>, <strong>columns</strong> e um campo para a ferramenta de analytics, sendo esse o valor de <strong>ga</strong> ou <strong>adobe</strong>.</p>
<p>Todos estes campos serão utilizados para realizar a parametrização do arquivo CSV que a API irá receber.</p>
<p>Aqui a API disponibiliza a funcionalidade de definirmos no campo <strong>csvSeparator</strong> 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.</p>
<p>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 <em>vírgula</em> ou <em>ponto e vírgula</em> 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.</p>
<p>Abaixo segue uma explicação e um exemplo de todos os campos das configurações.</p>
<table>
<thead>
<tr>
<th>Chave</th>
<th>Tipo</th>
<th>Descrição</th>
<th>Obrigatório</th>
</tr>
</thead>
<tbody><tr>
<td>csvSeparator</td>
<td>Array</td>
<td>Array que irá conter todos os separadores de colunas que os arquivos CSV poderão conter.</td>
<td>Não</td>
</tr>
<tr>
<td>separator</td>
<td>String</td>
<td>String que será utilizada na concatenação dos campos.</td>
<td>Sim</td>
</tr>
<tr>
<td>spaceSeparator</td>
<td>String</td>
<td>String que substituirá o espaço na URL, caso alguma campo tenha preenchido com mais de uma palavra.</td>
<td>Sim</td>
</tr>
<tr>
<td>columns</td>
<td>Objeto</td>
<td>Objeto contendo as colunas do CSV e seus valores de aceitação.</td>
<td>Sim</td>
</tr>
<tr>
<td>dependenciesConfig</td>
<td>Objeto</td>
<td>Objeto contendo as regras de dependências de validação.</td>
<td>Não</td>
</tr>
<tr>
<td>insertTime</td>
<td>String</td>
<td>Data da criação do config no formato <em>YYYYMMDDHHmmSS</em>.</td>
<td>Sim</td>
</tr>
<tr>
<td>version</td>
<td>Number</td>
<td>Número da versão do config.</td>
<td>Sim</td>
</tr>
<tr>
<td>{{veículo}}</td>
<td>Objeto</td>
<td>Chave do veículo de mídia com suas configurações e quais colunas pertencem a cada configuração.</td>
<td>Não</td>
</tr>
<tr>
<td>{{ferramenta de analytics}}</td>
<td>Objeto</td>
<td>Chave da ferramenta de analytics com suas configurações e quais colunas pertencem a cada configuração. Essa chave precisa obrigatoriamente receber o valor <strong>ga</strong> ou <strong>adobe</strong>.</td>
<td>Sim</td>
</tr>
</tbody></table>
<p><strong>Exemplo de configuração</strong>:</p>
<pre><code class="language-javascript"><span style="color: #000000">{</span>
<span style="color: #000000"> </span><span style="color: #A31515">"separator"</span><span style="color: #000000">: </span><span style="color: #A31515">":"</span><span style="color: #000000">,</span>
<span style="color: #000000"> </span><span style="color: #A31515">"spaceSeparator"</span><span style="color: #000000">: </span><span style="color: #A31515">"_"</span><span style="color: #000000">,</span>
<span style="color: #000000"> </span><span style="color: #A31515">"csvSeparator"</span><span style="color: #000000">: [</span><span style="color: #A31515">","</span><span style="color: #000000">, </span><span style="color: #A31515">";"</span><span style="color: #000000">, </span><span style="color: #A31515">"|"</span><span style="color: #000000">],</span>
<span style="color: #000000"> </span><span style="color: #A31515">"version"</span><span style="color: #000000">: </span><span style="color: #098658">1</span><span style="color: #000000">,</span>
<span style="color: #000000"> </span><span style="color: #A31515">"insertTime"</span><span style="color: #000000">: </span><span style="color: #A31515">"20220101000000"</span><span style="color: #000000">,</span>
<span style="color: #000000"> </span><span style="color: #A31515">"columns"</span><span style="color: #000000">: {</span>
<span style="color: #000000"> </span><span style="color: #008000">//Colunas que aparecerão no CSV</span>
<span style="color: #000000"> </span><span style="color: #008000">//A chave representa a coluna do CSV e o vetor de valores</span>
<span style="color: #000000"> </span><span style="color: #008000">//representam os possíveis valores de preenchimento dos campos.</span>
<span style="color: #000000"> </span><span style="color: #008000">//É possível informar valores ou expressões regulares para a validação.</span>
<span style="color: #000000"> </span><span style="color: #008000">//As expressão regulares devem estar entre /,</span>
<span style="color: #000000"> </span><span style="color: #008000">//assim como na chave "Produto"</span>
<span style="color: #000000"> </span><span style="color: #A31515">"Tipo de Compra"</span><span style="color: #001080">:</span><span style="color: #000000"> [</span><span style="color: #A31515">"cpa"</span><span style="color: #000000">, </span><span style="color: #A31515">"cpc"</span><span style="color: #000000">],</span>
<span style="color: #000000"> </span><span style="color: #A31515">"Dispositivo"</span><span style="color: #001080">:</span><span style="color: #000000"> [</span><span style="color: #A31515">"desktop e mobile"</span><span style="color: #000000">],</span>
<span style="color: #000000"> </span><span style="color: #A31515">"Produto"</span><span style="color: #001080">:</span><span style="color: #000000"> [</span><span style="color: #A31515">"/.*/"</span><span style="color: #000000">]</span>
<span style="color: #000000"> },</span>
<span style="color: #000000"> </span><span style="color: #A31515">"ga"</span><span style="color: #000000">: {</span>
<span style="color: #000000"> </span><span style="color: #008000">//Ferramenta de analytics, um outro valor possível seria "adobe"</span>
<span style="color: #000000"> </span><span style="color: #008000">//As chaves são os parâmetros que a ferramenta aceita</span>
<span style="color: #000000"> </span><span style="color: #008000">//Os valores passados no vetor são referentes às</span>
<span style="color: #000000"> </span><span style="color: #008000">//colunas do CSV que o formam</span>
<span style="color: #000000"> </span><span style="color: #A31515">"utm_source"</span><span style="color: #001080">:</span><span style="color: #000000"> [</span><span style="color: #A31515">"Tipo de Compra"</span><span style="color: #000000">, </span><span style="color: #A31515">"Dispositivo"</span><span style="color: #000000">],</span>
<span style="color: #000000"> </span><span style="color: #A31515">"utm_campaign"</span><span style="color: #001080">:</span><span style="color: #000000"> [</span><span style="color: #A31515">"Produto"</span><span style="color: #000000">]</span>
<span style="color: #000000"> },</span>
<span style="color: #000000"> </span><span style="color: #A31515">"googleads"</span><span style="color: #000000">: {</span>
<span style="color: #000000"> </span><span style="color: #008000">//Configuração do veículo de mídia</span>
<span style="color: #000000"> </span><span style="color: #008000">//As chaves são os parâmetros do veículos.</span>
<span style="color: #000000"> </span><span style="color: #008000">//Os valores passados no vetor são referentes às</span>
<span style="color: #000000"> </span><span style="color: #008000">//colunas do CSV que o formam,</span>
<span style="color: #000000"> </span><span style="color: #008000">//semelhante à ferramenta de analytics.</span>
<span style="color: #000000"> </span><span style="color: #A31515">"campanha"</span><span style="color: #001080">:</span><span style="color: #000000"> [</span><span style="color: #A31515">"Tipo de Compra"</span><span style="color: #000000">, </span><span style="color: #A31515">"Dispositivo"</span><span style="color: #000000">],</span>
<span style="color: #000000"> </span><span style="color: #A31515">"ad"</span><span style="color: #001080">:</span><span style="color: #000000"> [</span><span style="color: #A31515">"Produto"</span><span style="color: #000000">]</span>
<span style="color: #000000"> },</span>
<span style="color: #000000"> </span><span style="color: #A31515">"dependenciesConfig"</span><span style="color: #000000">: [</span>
<span style="color: #000000"> </span><span style="color: #008000">//Campo de configurações de depêndencias</span>
<span style="color: #000000"> {</span>
<span style="color: #000000"> </span><span style="color: #008000">//De acordo com o exemplo, se a coluna "Dispositivo"</span>
<span style="color: #000000"> </span><span style="color: #008000">//for preenchida com algum valor que contenha</span>
<span style="color: #000000"> </span><span style="color: #008000">//a palavra "mobile", então a coluna "Tipo de Compra"</span>
<span style="color: #000000"> </span><span style="color: #008000">//só poderá ser preenchida com os valores: cpc ou cpa.</span>
<span style="color: #000000"> </span><span style="color: #008000">//Se a chave hasMatch estivesse com o valor "false"</span>
<span style="color: #000000"> </span><span style="color: #008000">//significaria que a regra para a coluna "Tipo de Compra"</span>
<span style="color: #000000"> </span><span style="color: #008000">//só seria aplicada, caso o valor preenchido na coluna "Dispositivo"</span>
<span style="color: #000000"> </span><span style="color: #008000">//não contivesse a palavra "mobile".</span>
<span style="color: #000000"> </span><span style="color: #A31515">"columnReference"</span><span style="color: #001080">:</span><span style="color: #000000"> </span><span style="color: #A31515">"Dispositivo"</span><span style="color: #000000">,</span>
<span style="color: #000000"> </span><span style="color: #A31515">"valuesReference"</span><span style="color: #001080">:</span><span style="color: #000000"> [</span><span style="color: #A31515">"/.*mobile.*/"</span><span style="color: #000000">],</span>
<span style="color: #000000"> </span><span style="color: #A31515">"hasMatch"</span><span style="color: #001080">:</span><span style="color: #000000"> </span><span style="color: #0000FF">true</span><span style="color: #000000">,</span>
<span style="color: #000000"> </span><span style="color: #A31515">"columnDestiny"</span><span style="color: #001080">:</span><span style="color: #000000"> </span><span style="color: #A31515">"Tipo de Compra"</span><span style="color: #000000">,</span>
<span style="color: #000000"> </span><span style="color: #A31515">"matches"</span><span style="color: #001080">:</span><span style="color: #000000"> [</span><span style="color: #A31515">"cpc"</span><span style="color: #000000">, </span><span style="color: #A31515">"cpa"</span><span style="color: #000000">]</span>
<span style="color: #000000"> }</span>
<span style="color: #000000"> ],</span>
<span style="color: #000000"> </span><span style="color: #A31515">"insertTime"</span><span style="color: #000000">: </span><span style="color: #A31515">"20211201193242"</span><span style="color: #000000">,</span>
<span style="color: #000000"> </span><span style="color: #A31515">"version"</span><span style="color: #000000">: </span><span style="color: #098658">1</span><span style="color: #000000">,</span>
<span style="color: #000000">}</span>
</code></pre>
<a href="#banco-de-dados-alternativos" id="banco-de-dados-alternativos" style="color: inherit; text-decoration: none;">
<h3>Banco de dados alternativos</h3>
</a>
<p>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.</p>
<a href="#criação-dos-novos-scripts" id="criação-dos-novos-scripts" style="color: inherit; text-decoration: none;">
<h3>Criação dos novos scripts</h3>
</a>
<p>Caso o usuário opte por utilizar um banco de arquivos diferentes do Storage, é necessário que o script da nova classe herde de <strong>FileStore</strong>.</p>
<p>No caso de substituir o uso do Firestore para armazenamento de chaves. A nova classe deve herdar de <strong>ObjectStore</strong>.</p>
<a href="#configuração-do-ambiente-de-desenvolvimento" id="configuração-do-ambiente-de-desenvolvimento" style="color: inherit; text-decoration: none;">
<h2>Configuração do ambiente de desenvolvimento</h2>
</a>
<ol>
<li><strong>Arquivo .env</strong>: O arquivo .env deve estar localizado na raiz do projeto. É necessário editar as seguintes variáveis</li>
</ol>
<ul>
<li>ENV: Deve apresentar o valor 'development', caso o ambiente atual seja o ambiente de desenvolvimento local, ou 'prod', caso o ambiente seja de produção;</li>
<li>PORT: Deve conter o número da porta onde a API será acessada. Em caso de omissão desse parâmetro, a porta considerada será 443;</li>
<li>BUCKET: Deve conter o nome do bucket do storage onde os arquivos CSVs serão salvos. Para o deplou via Terraform, preencher o nome do bucket seguindo o padrão: {gcp_project_id}-adinfo-files-{company};</li>
<li>GCP_PROJECT_ID: Deve conter o id do projeto no GCP, caso o adinfo esteja hospedado no GCP;</li>
<li>GCP_KEY: Deve conter o JSON da chave de acesso aos serviços do GCP;</li>
<li>JWT_KEY: Chave para geração de assinaturas do JWT;</li>
<li>SALT: Configuração de salt do JWT;</li>
<li>EXPIRES_TOKEN: Duração do token JWT.</li>
</ul>
<ol start="2">
<li><strong>Arquivo .gitignore</strong>: Checar se o arquivo .gitignore está ignorando do arquivo .env.</li>
</ol>
<a href="#como-contribuir" id="como-contribuir" style="color: inherit; text-decoration: none;">
<h2>Como contribuir</h2>
</a>
<p>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.</p>
<a href="#requisitos-obrigatórios" id="requisitos-obrigatórios" style="color: inherit; text-decoration: none;">
<h3>Requisitos obrigatórios</h3>
</a>
<p>Só serão aceitas contribuições que estiverem seguindo os seguintes requisitos:</p>
<ul>
<li><a href="https://www.conventionalcommits.org/en/v1.0.0/">Padrão de commit</a></li>
<li><a href="https://www.atlassian.com/br/git/tutorials/comparing-workflows/gitflow-workflow">Padrão de criação de branches</a></li>
</ul>
<a href="#documentação-de-desenvolvimento" id="documentação-de-desenvolvimento" style="color: inherit; text-decoration: none;">
<h3>Documentação de desenvolvimento</h3>
</a>
<p>A <a href="./docs/index.html">documentação do código</a> pode ser encontrada em docs/index.html.</p>
<p>A <a href="./Routes.md">documentação de rotas da API</a> se encontra no arquivo Routes.md.</p>
<a href="#suporte" id="suporte" style="color: inherit; text-decoration: none;">
<h2>Suporte:</h2>
</a>
<p><strong>DP6 Koopa-troopa Team</strong></p>
<p><em>e-mail: <a href="mailto:[email protected]">[email protected]</a></em></p>
<img src="https://raw.githubusercontent.com/DP6/templates-centro-de-inovacoes/main/public/images/koopa.png" height="100px" width=50px/>
</div>
</div>
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
<nav class="tsd-navigation primary">
<ul>
<li class=" ">
<a href="modules.html">Exports</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/errors_stringemptyerror.html">Errors/<wbr>String<wbr>Empty<wbr>Error</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/errors_validatecolumnexistserror.html">Errors/<wbr>Validate<wbr>Column<wbr>Exists<wbr>Error</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/errors_validatefielddependencyerror.html">Errors/<wbr>Validate<wbr>Field<wbr>Dependency<wbr>Error</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/errors_validatefielderror.html">Errors/<wbr>Validate<wbr>Field<wbr>Error</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/errors_validaterulesforcolumnerror.html">Errors/<wbr>Validate<wbr>Rules<wbr>For<wbr>Column<wbr>Error</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/handlers_abstracthandler.html">Handlers/<wbr>Abstract<wbr>Handler</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/handlers_handler.html">Handlers/<wbr>Handler</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/handlers_stringemptyhandler.html">Handlers/<wbr>String<wbr>Empty<wbr>Handler</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/handlers_validatecolumnexistshandler.html">Handlers/<wbr>Validate<wbr>Column<wbr>Exists<wbr>Handler</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/handlers_validatefielddependencyhandler.html">Handlers/<wbr>Validate<wbr>Field<wbr>Dependency<wbr>Handler</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/handlers_validatefieldhandler.html">Handlers/<wbr>Validate<wbr>Field<wbr>Handler</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/handlers_validaterulesforcolumnhandler.html">Handlers/<wbr>Validate<wbr>Rules<wbr>For<wbr>Column<wbr>Handler</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/app.html">app</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/controllers_builder.html">controllers/<wbr>Builder</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_adobe.html">models/<wbr>Adobe</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_analyticstool.html">models/<wbr>Analytics<wbr>Tool</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_apiresponse.html">models/<wbr>Api<wbr>Response</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_blocklist.html">models/<wbr>Block<wbr>List</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_campaign.html">models/<wbr>Campaign</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_config.html">models/<wbr>Config</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_dao_agencydao.html">models/DAO/<wbr>AgencyDAO</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_dao_campaigndao.html">models/DAO/<wbr>CampaignDAO</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_dao_configdao.html">models/DAO/<wbr>ConfigDAO</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_dao_filedao.html">models/DAO/<wbr>FileDAO</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_dao_filestore.html">models/DAO/<wbr>File<wbr>Store</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_dao_objectstore.html">models/DAO/<wbr>Object<wbr>Store</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_dao_programmaticuserdao.html">models/DAO/<wbr>Programmatic<wbr>UserDAO</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_dao_userdao.html">models/DAO/<wbr>UserDAO</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_dependencyconfig.html">models/<wbr>Dependency<wbr>Config</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_facebookads.html">models/<wbr>Facebook<wbr>Ads</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_ga.html">models/GA</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_generalvehicle.html">models/<wbr>General<wbr>Vehicle</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_googleads.html">models/<wbr>Google<wbr>Ads</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_jwt.html">models/JWT</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_log.html">models/<wbr>Log</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_parametrizer.html">models/<wbr>Parametrizer</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_parametrizerfactory.html">models/<wbr>Parametrizer<wbr>Factory</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_programmaticuser.html">models/<wbr>Programmatic<wbr>User</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_routespermission.html">models/<wbr>Routes<wbr>Permission</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_templateexcel.html">models/<wbr>Template<wbr>Excel</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_user.html">models/<wbr>User</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_vehicle.html">models/<wbr>Vehicle</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_cloud_firestoreconnectionsingleton.html">models/cloud/<wbr>Firestore<wbr>Connection<wbr>Singleton</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_cloud_loggingsingleton.html">models/cloud/<wbr>Logging<wbr>Singleton</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/models_cloud_storageconnectionsingleton.html">models/cloud/<wbr>Storage<wbr>Connection<wbr>Singleton</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/routes_agency.html">routes/agency</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/routes_build.html">routes/build</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/routes_campaign.html">routes/campaign</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/routes_config.html">routes/config</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/routes_csv.html">routes/csv</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/routes_login.html">routes/login</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/routes_register.html">routes/register</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/routes_routes.html">routes/routes</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/routes_template.html">routes/template</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/routes_user.html">routes/user</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/utils_csvutils.html">utils/<wbr>Csv<wbr>Utils</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/utils_dateutils.html">utils/<wbr>Date<wbr>Utils</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/utils_jsonutils.html">utils/<wbr>Json<wbr>Utils</a>
</li>
<li class=" tsd-kind-module">
<a href="modules/utils_stringutils.html">utils/<wbr>String<wbr>Utils</a>
</li>
</ul>
</nav>
<nav class="tsd-navigation secondary menu-sticky">
<ul class="before-current">
</ul>
</nav>
</div>
</div>
</div>
<footer class="with-border-bottom">
<div class="container">
<h2>Legend</h2>
<div class="tsd-legend-group">
<ul class="tsd-legend">
<li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
</ul>
</div>
</div>
</footer>
<div class="container tsd-generator">
<p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p>
</div>
<div class="overlay"></div>
<script src="assets/js/main.js"></script>
</body>
</html>