funifier-mcp 0.2.0 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/.cursor/rules/funifier.mdc +91 -0
  2. package/.github/copilot-instructions.md +83 -0
  3. package/AGENTS.md +97 -0
  4. package/README.md +247 -78
  5. package/datasource-funifier-docs/knowledge/guides/aggregates.md +152 -152
  6. package/datasource-funifier-docs/knowledge/guides/database-access.md +132 -132
  7. package/datasource-funifier-docs/knowledge/guides/java-entities.md +373 -373
  8. package/datasource-funifier-docs/knowledge/guides/java-libraries.md +330 -330
  9. package/datasource-funifier-docs/knowledge/guides/java-managers.md +509 -509
  10. package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +271 -271
  11. package/datasource-funifier-docs/knowledge/index.md +121 -121
  12. package/datasource-funifier-docs/knowledge/modules/achievement.md +46 -46
  13. package/datasource-funifier-docs/knowledge/modules/action-log.md +88 -88
  14. package/datasource-funifier-docs/knowledge/modules/action.md +80 -80
  15. package/datasource-funifier-docs/knowledge/modules/auth.md +104 -104
  16. package/datasource-funifier-docs/knowledge/modules/avatar.md +28 -28
  17. package/datasource-funifier-docs/knowledge/modules/backup.md +40 -40
  18. package/datasource-funifier-docs/knowledge/modules/challenge.md +91 -91
  19. package/datasource-funifier-docs/knowledge/modules/compact.md +40 -40
  20. package/datasource-funifier-docs/knowledge/modules/competition.md +149 -149
  21. package/datasource-funifier-docs/knowledge/modules/crossword.md +41 -41
  22. package/datasource-funifier-docs/knowledge/modules/csv-data.md +30 -30
  23. package/datasource-funifier-docs/knowledge/modules/custom-object.md +53 -53
  24. package/datasource-funifier-docs/knowledge/modules/database.md +241 -241
  25. package/datasource-funifier-docs/knowledge/modules/folder.md +111 -111
  26. package/datasource-funifier-docs/knowledge/modules/kpi-formulas.md +23 -23
  27. package/datasource-funifier-docs/knowledge/modules/lastmile.md +45 -45
  28. package/datasource-funifier-docs/knowledge/modules/leaderboard.md +98 -98
  29. package/datasource-funifier-docs/knowledge/modules/level.md +83 -83
  30. package/datasource-funifier-docs/knowledge/modules/lottery.md +112 -112
  31. package/datasource-funifier-docs/knowledge/modules/marketplace.md +27 -27
  32. package/datasource-funifier-docs/knowledge/modules/mystery.md +82 -82
  33. package/datasource-funifier-docs/knowledge/modules/notification.md +40 -40
  34. package/datasource-funifier-docs/knowledge/modules/patterns.md +1096 -1096
  35. package/datasource-funifier-docs/knowledge/modules/player.md +101 -101
  36. package/datasource-funifier-docs/knowledge/modules/point.md +67 -67
  37. package/datasource-funifier-docs/knowledge/modules/public.md +253 -253
  38. package/datasource-funifier-docs/knowledge/modules/question.md +136 -136
  39. package/datasource-funifier-docs/knowledge/modules/quiz.md +163 -163
  40. package/datasource-funifier-docs/knowledge/modules/scheduler.md +58 -58
  41. package/datasource-funifier-docs/knowledge/modules/security.md +169 -169
  42. package/datasource-funifier-docs/knowledge/modules/staging.md +28 -28
  43. package/datasource-funifier-docs/knowledge/modules/static-repo.md +41 -41
  44. package/datasource-funifier-docs/knowledge/modules/story.md +42 -42
  45. package/datasource-funifier-docs/knowledge/modules/studio-page.md +180 -180
  46. package/datasource-funifier-docs/knowledge/modules/swap.md +132 -132
  47. package/datasource-funifier-docs/knowledge/modules/team.md +75 -75
  48. package/datasource-funifier-docs/knowledge/modules/trigger.md +189 -189
  49. package/datasource-funifier-docs/knowledge/modules/upload.md +155 -155
  50. package/datasource-funifier-docs/knowledge/modules/virtual-good.md +99 -99
  51. package/datasource-funifier-docs/knowledge/modules/webhook.md +41 -41
  52. package/datasource-funifier-docs/knowledge/modules/websocket.md +41 -41
  53. package/datasource-funifier-docs/knowledge/modules/widget.md +42 -42
  54. package/datasource-funifier-docs/process-gtm-saas.md +143 -143
  55. package/datasource-funifier-docs/process-instagram.md +88 -88
  56. package/datasource-funifier-docs/process.md +1826 -1826
  57. package/datasource-funifier-docs/readme.md +132 -132
  58. package/dist/cli/config-writers.js +11 -11
  59. package/dist/mcp/bundle.js +82 -77
  60. package/package.json +70 -67
  61. package/skills/funifier-create-aggregate/SKILL.md +126 -126
  62. package/skills/funifier-create-custom-page/SKILL.md +126 -126
  63. package/skills/funifier-create-scheduler/SKILL.md +126 -126
  64. package/skills/funifier-create-trigger/SKILL.md +127 -127
@@ -1,30 +1,30 @@
1
- # CSV Data (Dados CSV)
2
-
3
- **API Endpoint:** `/v3/csv`
4
-
5
- ## O que é
6
-
7
- Importação e exportação de dados no formato CSV. Permite importar ou exportar dados de forma fácil e segura, seja via upload manual ou FTP. Suporta arquivos criptografados para segurança no trânsito das informações.
8
-
9
- ## Quando usar
10
-
11
- - Para importar listas de jogadores em massa
12
- - Para exportar relatórios de desempenho
13
- - Para migrar dados de sistemas externos
14
- - Para importação segura via FTP com criptografia
15
-
16
- ## API Endpoints
17
-
18
- ### Importar CSV
19
- **Método:** POST
20
- **Endpoint:** `/v3/csv`
21
-
22
- ### Exportar CSV
23
- **Método:** GET
24
- **Endpoint:** `/v3/csv`
25
-
26
- ## Validações e Testes
27
-
28
- - [ ] Importação processa arquivo corretamente
29
- - [ ] Dados importados aparecem nas coleções corretas
30
- - [ ] Exportação gera arquivo CSV válido
1
+ # CSV Data (Dados CSV)
2
+
3
+ **API Endpoint:** `/v3/csv`
4
+
5
+ ## O que é
6
+
7
+ Importação e exportação de dados no formato CSV. Permite importar ou exportar dados de forma fácil e segura, seja via upload manual ou FTP. Suporta arquivos criptografados para segurança no trânsito das informações.
8
+
9
+ ## Quando usar
10
+
11
+ - Para importar listas de jogadores em massa
12
+ - Para exportar relatórios de desempenho
13
+ - Para migrar dados de sistemas externos
14
+ - Para importação segura via FTP com criptografia
15
+
16
+ ## API Endpoints
17
+
18
+ ### Importar CSV
19
+ **Método:** POST
20
+ **Endpoint:** `/v3/csv`
21
+
22
+ ### Exportar CSV
23
+ **Método:** GET
24
+ **Endpoint:** `/v3/csv`
25
+
26
+ ## Validações e Testes
27
+
28
+ - [ ] Importação processa arquivo corretamente
29
+ - [ ] Dados importados aparecem nas coleções corretas
30
+ - [ ] Exportação gera arquivo CSV válido
@@ -1,53 +1,53 @@
1
- # Custom Object (Objeto Customizado)
2
-
3
- ## O que é
4
-
5
- Criação de objetos personalizados para necessidades específicas. Permite criar e gerenciar coleções personalizadas no banco de dados (sufixo `__c`), que podem ser acessadas via API, triggers, schedulers e páginas personalizadas. Ideal para quando os módulos padrão não atendem a todos os requisitos do projeto.
6
-
7
- ## Quando usar
8
-
9
- - Para cadastrar entidades específicas do negócio (produtos, imóveis, etc.)
10
- - Para criar listas customizadas (pontos turísticos, categorias, etc.)
11
- - Para armazenar dados que não se encaixam nos módulos padrão
12
-
13
- ## API Endpoints
14
-
15
- Objetos customizados são acessados via o módulo Database:
16
-
17
- ### Listar Objetos
18
- **Método:** GET
19
- **Endpoint:** `/v3/database/<nome>__c`
20
-
21
- ### Criar Objeto
22
- **Método:** POST
23
- **Endpoint:** `/v3/database/<nome>__c`
24
-
25
- **Exemplo (coleção car__c):**
26
- ```json
27
- {
28
- "_id": "car001",
29
- "name": "Civic",
30
- "brand": "Honda",
31
- "price": 50000
32
- }
33
- ```
34
-
35
- ### Atualizar Objeto
36
- **Método:** PUT
37
- **Endpoint:** `/v3/database/<nome>__c`
38
-
39
- ### Excluir Objeto
40
- **Método:** DELETE
41
- **Endpoint:** `/v3/database/<nome>__c?q=_id:'car001'`
42
-
43
- ## Boas Práticas
44
-
45
- - Sempre usar sufixo `__c` no nome da coleção
46
- - Definir `_id` único para cada objeto
47
- - Criar índices para campos usados em consultas frequentes
48
-
49
- ## Validações e Testes
50
-
51
- - [ ] Coleção customizada aparece em GET /v3/database/collections
52
- - [ ] CRUD funciona corretamente
53
- - [ ] Triggers com entity `<nome>__c` funcionam
1
+ # Custom Object (Objeto Customizado)
2
+
3
+ ## O que é
4
+
5
+ Criação de objetos personalizados para necessidades específicas. Permite criar e gerenciar coleções personalizadas no banco de dados (sufixo `__c`), que podem ser acessadas via API, triggers, schedulers e páginas personalizadas. Ideal para quando os módulos padrão não atendem a todos os requisitos do projeto.
6
+
7
+ ## Quando usar
8
+
9
+ - Para cadastrar entidades específicas do negócio (produtos, imóveis, etc.)
10
+ - Para criar listas customizadas (pontos turísticos, categorias, etc.)
11
+ - Para armazenar dados que não se encaixam nos módulos padrão
12
+
13
+ ## API Endpoints
14
+
15
+ Objetos customizados são acessados via o módulo Database:
16
+
17
+ ### Listar Objetos
18
+ **Método:** GET
19
+ **Endpoint:** `/v3/database/<nome>__c`
20
+
21
+ ### Criar Objeto
22
+ **Método:** POST
23
+ **Endpoint:** `/v3/database/<nome>__c`
24
+
25
+ **Exemplo (coleção car__c):**
26
+ ```json
27
+ {
28
+ "_id": "car001",
29
+ "name": "Civic",
30
+ "brand": "Honda",
31
+ "price": 50000
32
+ }
33
+ ```
34
+
35
+ ### Atualizar Objeto
36
+ **Método:** PUT
37
+ **Endpoint:** `/v3/database/<nome>__c`
38
+
39
+ ### Excluir Objeto
40
+ **Método:** DELETE
41
+ **Endpoint:** `/v3/database/<nome>__c?q=_id:'car001'`
42
+
43
+ ## Boas Práticas
44
+
45
+ - Sempre usar sufixo `__c` no nome da coleção
46
+ - Definir `_id` único para cada objeto
47
+ - Criar índices para campos usados em consultas frequentes
48
+
49
+ ## Validações e Testes
50
+
51
+ - [ ] Coleção customizada aparece em GET /v3/database/collections
52
+ - [ ] CRUD funciona corretamente
53
+ - [ ] Triggers com entity `<nome>__c` funcionam
@@ -1,241 +1,241 @@
1
- # Database (Database)
2
-
3
- **API Endpoint:** `/v3/database`
4
-
5
- ## O que é
6
-
7
- Acesso direto à base de dados para operações avançadas. Oferece ferramentas para criar índices, executar comandos aggregate (MongoDB), importar dados em lote, e muito mais. Permite extrair relatórios personalizados e realizar manipulações complexas diretamente no banco de dados da gamificação. Cada gamificação tem seu próprio banco de dados.
8
-
9
- ## ⚠️ Requisito de Permissão Especial
10
-
11
- O endpoint `/v3/database` exige que a palavra **`database`** esteja presente no scope da Role do token, **além** das permissões padrão (`read_all`, `write_all`, `delete_all`). Sem ela:
12
-
13
- - **POST** retorna `201` mas **NÃO persiste os dados**
14
- - **GET** retorna `200` com **corpo vazio**
15
- - **Nenhuma mensagem de erro** é exibida
16
-
17
- **Scope mínimo para usar database:** `read_all, write_all, delete_all, database`
18
-
19
- Configurar em: `Studio > Security > Roles`
20
-
21
- > **Nota:** O jogador precisa fazer login novamente após alteração da Role para obter um token com as novas permissões.
22
-
23
- ## Quando usar
24
-
25
- - Para consultas avançadas com aggregates MongoDB
26
- - Para criar/gerenciar índices de performance
27
- - Para operações CRUD em qualquer coleção
28
- - Para inserção em massa (bulk)
29
- - Para acessar coleções customizadas (sufixo __c)
30
-
31
- ## API Endpoints
32
-
33
- ### Listar Coleções
34
- **Método:** GET
35
- **Endpoint:** `/v3/database/collections`
36
- **Descrição:** Lista todas as coleções existentes no banco.
37
-
38
- ### Buscar Registro por ID
39
- **Método:** GET
40
- **Endpoint:** `/v3/database/:collection/:id`
41
- **Query Params:**
42
- - `strict=true` — Preserva tipos BSON (datas como `{ $date }`, etc.)
43
- - Use `me` como ID para buscar dados do player autenticado
44
-
45
- ### Listar Dados de uma Coleção (com filtro)
46
- **Método:** GET
47
- **Endpoint:** `/v3/database/:collection`
48
- **Query Params:**
49
- - `q` — Filtro MongoDB (sintaxe Mongo, NÃO JSON). Inserido dentro de `{ $match: { <q> } }`
50
- - `strict=true` — Preserva tipos BSON
51
- - `max_results` — Máximo de resultados (default: 100)
52
-
53
- **Header:**
54
- - `Range: items=0-19` — Paginação (Range-based)
55
-
56
- **⚠️ IMPORTANTE:** O parâmetro correto de filtro é `q`, **NÃO** `_filter`. Parâmetros como `_filter`, `_sort`, `_limit` **NÃO existem** neste endpoint e são silenciosamente ignorados.
57
-
58
- **Exemplos de `q`:**
59
- ```
60
- ?q=userId:"ricardo@funifier.com"
61
- ?q=userId:"ricardo@funifier.com", type:"daily"
62
- ?q=status:"active", price:{$gte:100}
63
- ?q=_id:"abc123"
64
- ```
65
-
66
- **⚠️ Limitação:** O `GET` não suporta `$sort`. Internamente ele executa `{ $match: { <q> } }` via aggregate, sem estágios adicionais. Para queries com ordenação, use o endpoint `aggregate`.
67
-
68
- ### Contar Registros
69
- **Método:** GET
70
- **Endpoint:** `/v3/database/count?collection=:collection&q=:query`
71
- **Descrição:** Retorna `{ total: N }`.
72
-
73
- ### Criar Registro (Upsert)
74
- **Método:** POST
75
- **Endpoint:** `/v3/database/:collection`
76
- **Query Params:**
77
- - `strict=true` — Para preservar tipos BSON na resposta
78
-
79
- **Descrição:** Se `_id` não for fornecido, gera automaticamente um GUID curto. Executa triggers `before_create` e `after_create`.
80
-
81
- **Exemplo de Body:**
82
- ```json
83
- {
84
- "year": 2010,
85
- "fuel": "gasoline",
86
- "price": 50000,
87
- "name": "Civic",
88
- "description": "Honda Civic",
89
- "brand": "honda"
90
- }
91
- ```
92
-
93
- ### Atualizar Registro (Save/Upsert)
94
- **Método:** PUT
95
- **Endpoint:** `/v3/database/:collection`
96
- **Query Params:**
97
- - `strict=true` — Para preservar tipos BSON
98
-
99
- **Descrição:** Usa `save()` do MongoDB (upsert por `_id`). Executa triggers `before_update` e `after_update`. Se `_id` não existir, gera um novo.
100
-
101
- **⚠️ Player password safety:** Se a coleção for `player` e o token não tem permissão de ler senha, o PUT automaticamente preserva a senha existente (não sobrescreve com null).
102
-
103
- **Exemplo de Body:**
104
- ```json
105
- {
106
- "_id": "6553e49815865a7a732f5fc7",
107
- "year": 2010,
108
- "fuel": "gasoline",
109
- "price": 50000,
110
- "name": "Civic",
111
- "description": "Honda Civic",
112
- "brand": "honda"
113
- }
114
- ```
115
-
116
- ### Excluir Registro(s)
117
- **Método:** DELETE
118
- **Endpoint:** `/v3/database/:collection?q=:query`
119
-
120
- **Descrição:** O `q` precisa ter pelo menos 3 caracteres. Executa triggers `before_delete` e `after_delete` se total ≤ 20.000 registros. IDs são identificados antes da exclusão para passar aos triggers.
121
-
122
- **Exemplos:**
123
- ```
124
- DELETE /v3/database/checkin__c?q=_id:"abc123"
125
- DELETE /v3/database/signup__c?q=userId:"test@test.com"
126
- ```
127
-
128
- ### Executar Agregações
129
- **Método:** POST
130
- **Endpoint:** `/v3/database/:collection/aggregate`
131
- **Query Params:**
132
- - `q` — Filtro `$match` inicial (opcional, aplicado antes do pipeline)
133
- - `strict=true` — Preserva tipos BSON
134
- - `out` — Coleção destino para gravar resultados (deve terminar em `__c`)
135
- - `out_operation=replace` — Limpa coleção destino antes de gravar
136
-
137
- **Header:**
138
- - `Range: items=0-19` — Paginação
139
-
140
- **Descrição:** O `q` é aplicado como primeiro `$match`. Os estágios do body são adicionados em sequência após ele. Usa `allowDiskUse(true)` automaticamente.
141
-
142
- **Exemplo — Query com filtro e ordenação:**
143
- ```
144
- POST /v3/database/body_checkin__c/aggregate?q=userId:"ricardo@funifier.com"&strict=true
145
- Range: items=0-19
146
-
147
- [
148
- { "$sort": { "created": -1 } }
149
- ]
150
- ```
151
-
152
- **Exemplo — Agregação completa:**
153
- ```
154
- POST /v3/database/action_log/aggregate?strict=true
155
-
156
- [
157
- { "$match": { "actionId": "sell", "userId": "jerry" } },
158
- { "$group": { "_id": "$userId", "total": { "$sum": "$attributes.price" } } },
159
- { "$sort": { "total": -1 } },
160
- { "$limit": 10 }
161
- ]
162
- ```
163
-
164
- ### Inserção em Massa (Bulk)
165
- **Método:** POST
166
- **Endpoint:** `/v3/database/:collection/bulk`
167
- **Query Params:**
168
- - `async=true` — Processamento assíncrono (para grandes volumes)
169
-
170
- **Exemplo de Body:**
171
- ```json
172
- [
173
- { "_id": "car001", "year": 2010, "price": 60000, "name": "Honda Civic", "brand": "honda" },
174
- { "_id": "car002", "year": 2012, "price": 70000, "name": "Toyota Corolla", "brand": "toyota" }
175
- ]
176
- ```
177
-
178
- ### Drop Collection
179
- **Método:** DELETE
180
- **Endpoint:** `/v3/database/:collection/drop`
181
- **⚠️ CUIDADO:** Remove a coleção inteira!
182
-
183
- ### Listar Índices
184
- **Método:** GET
185
- **Endpoint:** `/v3/database/:collection/index`
186
-
187
- ### Criar Índice
188
- **Método:** POST
189
- **Endpoint:** `/v3/database/:collection/index`
190
-
191
- **Exemplo de Body:**
192
- ```json
193
- { "fuel": 1 }
194
- ```
195
-
196
- ### Excluir Índice
197
- **Método:** DELETE
198
- **Endpoint:** `/v3/database/:collection/index/:index_name`
199
-
200
- ## Paginação
201
-
202
- Usa header `Range` no padrão HTTP Range:
203
- ```
204
- Range: items=0-9 (primeiros 10)
205
- Range: items=10-19 (próximos 10)
206
- Range: items=0-99 (primeiros 100)
207
- ```
208
-
209
- Resposta inclui header `Content-Range` com total de registros.
210
-
211
- Default sem Range: retorna até 100 registros.
212
-
213
- ## Strict Mode (BSON Types)
214
-
215
- Quando `strict=true`:
216
- - **Datas** são retornadas como `{ "$date": "2026-03-06T10:00:00.000Z" }` (ISO-8601)
217
- - **Sem strict**, datas podem vir como timestamps numéricos ou strings
218
-
219
- Para **gravar** datas tipadas, enviar como:
220
- ```json
221
- { "created": { "$date": "2026-03-06T10:00:00.000Z" } }
222
- ```
223
-
224
- > **Regra:** Sempre use `strict=true` em GETs para preservar tipos BSON. Sem ele, datas viram strings/números e quebram queries.
225
-
226
- ## Criptografia de Campos (v4.0)
227
-
228
- Se habilitada (Studio > Security > Field Encryption):
229
- - Campos marcados são criptografados no POST/PUT e descriptografados no GET
230
- - Requer token com permissão `readEncryptedValues`
231
- - Usa AES com chave secreta do tenant
232
-
233
- ## Validações e Testes
234
-
235
- - [ ] Listar coleções retorna resultado
236
- - [ ] CRUD funciona na coleção alvo
237
- - [ ] Filtro `q` funciona corretamente
238
- - [ ] Aggregate com `q` + pipeline retorna dados filtrados e ordenados
239
- - [ ] Bulk insert registra múltiplos itens
240
- - [ ] Índices são criados/removidos corretamente
241
- - [ ] `strict=true` preserva tipos BSON
1
+ # Database (Database)
2
+
3
+ **API Endpoint:** `/v3/database`
4
+
5
+ ## O que é
6
+
7
+ Acesso direto à base de dados para operações avançadas. Oferece ferramentas para criar índices, executar comandos aggregate (MongoDB), importar dados em lote, e muito mais. Permite extrair relatórios personalizados e realizar manipulações complexas diretamente no banco de dados da gamificação. Cada gamificação tem seu próprio banco de dados.
8
+
9
+ ## ⚠️ Requisito de Permissão Especial
10
+
11
+ O endpoint `/v3/database` exige que a palavra **`database`** esteja presente no scope da Role do token, **além** das permissões padrão (`read_all`, `write_all`, `delete_all`). Sem ela:
12
+
13
+ - **POST** retorna `201` mas **NÃO persiste os dados**
14
+ - **GET** retorna `200` com **corpo vazio**
15
+ - **Nenhuma mensagem de erro** é exibida
16
+
17
+ **Scope mínimo para usar database:** `read_all, write_all, delete_all, database`
18
+
19
+ Configurar em: `Studio > Security > Roles`
20
+
21
+ > **Nota:** O jogador precisa fazer login novamente após alteração da Role para obter um token com as novas permissões.
22
+
23
+ ## Quando usar
24
+
25
+ - Para consultas avançadas com aggregates MongoDB
26
+ - Para criar/gerenciar índices de performance
27
+ - Para operações CRUD em qualquer coleção
28
+ - Para inserção em massa (bulk)
29
+ - Para acessar coleções customizadas (sufixo __c)
30
+
31
+ ## API Endpoints
32
+
33
+ ### Listar Coleções
34
+ **Método:** GET
35
+ **Endpoint:** `/v3/database/collections`
36
+ **Descrição:** Lista todas as coleções existentes no banco.
37
+
38
+ ### Buscar Registro por ID
39
+ **Método:** GET
40
+ **Endpoint:** `/v3/database/:collection/:id`
41
+ **Query Params:**
42
+ - `strict=true` — Preserva tipos BSON (datas como `{ $date }`, etc.)
43
+ - Use `me` como ID para buscar dados do player autenticado
44
+
45
+ ### Listar Dados de uma Coleção (com filtro)
46
+ **Método:** GET
47
+ **Endpoint:** `/v3/database/:collection`
48
+ **Query Params:**
49
+ - `q` — Filtro MongoDB (sintaxe Mongo, NÃO JSON). Inserido dentro de `{ $match: { <q> } }`
50
+ - `strict=true` — Preserva tipos BSON
51
+ - `max_results` — Máximo de resultados (default: 100)
52
+
53
+ **Header:**
54
+ - `Range: items=0-19` — Paginação (Range-based)
55
+
56
+ **⚠️ IMPORTANTE:** O parâmetro correto de filtro é `q`, **NÃO** `_filter`. Parâmetros como `_filter`, `_sort`, `_limit` **NÃO existem** neste endpoint e são silenciosamente ignorados.
57
+
58
+ **Exemplos de `q`:**
59
+ ```
60
+ ?q=userId:"ricardo@funifier.com"
61
+ ?q=userId:"ricardo@funifier.com", type:"daily"
62
+ ?q=status:"active", price:{$gte:100}
63
+ ?q=_id:"abc123"
64
+ ```
65
+
66
+ **⚠️ Limitação:** O `GET` não suporta `$sort`. Internamente ele executa `{ $match: { <q> } }` via aggregate, sem estágios adicionais. Para queries com ordenação, use o endpoint `aggregate`.
67
+
68
+ ### Contar Registros
69
+ **Método:** GET
70
+ **Endpoint:** `/v3/database/count?collection=:collection&q=:query`
71
+ **Descrição:** Retorna `{ total: N }`.
72
+
73
+ ### Criar Registro (Upsert)
74
+ **Método:** POST
75
+ **Endpoint:** `/v3/database/:collection`
76
+ **Query Params:**
77
+ - `strict=true` — Para preservar tipos BSON na resposta
78
+
79
+ **Descrição:** Se `_id` não for fornecido, gera automaticamente um GUID curto. Executa triggers `before_create` e `after_create`.
80
+
81
+ **Exemplo de Body:**
82
+ ```json
83
+ {
84
+ "year": 2010,
85
+ "fuel": "gasoline",
86
+ "price": 50000,
87
+ "name": "Civic",
88
+ "description": "Honda Civic",
89
+ "brand": "honda"
90
+ }
91
+ ```
92
+
93
+ ### Atualizar Registro (Save/Upsert)
94
+ **Método:** PUT
95
+ **Endpoint:** `/v3/database/:collection`
96
+ **Query Params:**
97
+ - `strict=true` — Para preservar tipos BSON
98
+
99
+ **Descrição:** Usa `save()` do MongoDB (upsert por `_id`). Executa triggers `before_update` e `after_update`. Se `_id` não existir, gera um novo.
100
+
101
+ **⚠️ Player password safety:** Se a coleção for `player` e o token não tem permissão de ler senha, o PUT automaticamente preserva a senha existente (não sobrescreve com null).
102
+
103
+ **Exemplo de Body:**
104
+ ```json
105
+ {
106
+ "_id": "6553e49815865a7a732f5fc7",
107
+ "year": 2010,
108
+ "fuel": "gasoline",
109
+ "price": 50000,
110
+ "name": "Civic",
111
+ "description": "Honda Civic",
112
+ "brand": "honda"
113
+ }
114
+ ```
115
+
116
+ ### Excluir Registro(s)
117
+ **Método:** DELETE
118
+ **Endpoint:** `/v3/database/:collection?q=:query`
119
+
120
+ **Descrição:** O `q` precisa ter pelo menos 3 caracteres. Executa triggers `before_delete` e `after_delete` se total ≤ 20.000 registros. IDs são identificados antes da exclusão para passar aos triggers.
121
+
122
+ **Exemplos:**
123
+ ```
124
+ DELETE /v3/database/checkin__c?q=_id:"abc123"
125
+ DELETE /v3/database/signup__c?q=userId:"test@test.com"
126
+ ```
127
+
128
+ ### Executar Agregações
129
+ **Método:** POST
130
+ **Endpoint:** `/v3/database/:collection/aggregate`
131
+ **Query Params:**
132
+ - `q` — Filtro `$match` inicial (opcional, aplicado antes do pipeline)
133
+ - `strict=true` — Preserva tipos BSON
134
+ - `out` — Coleção destino para gravar resultados (deve terminar em `__c`)
135
+ - `out_operation=replace` — Limpa coleção destino antes de gravar
136
+
137
+ **Header:**
138
+ - `Range: items=0-19` — Paginação
139
+
140
+ **Descrição:** O `q` é aplicado como primeiro `$match`. Os estágios do body são adicionados em sequência após ele. Usa `allowDiskUse(true)` automaticamente.
141
+
142
+ **Exemplo — Query com filtro e ordenação:**
143
+ ```
144
+ POST /v3/database/body_checkin__c/aggregate?q=userId:"ricardo@funifier.com"&strict=true
145
+ Range: items=0-19
146
+
147
+ [
148
+ { "$sort": { "created": -1 } }
149
+ ]
150
+ ```
151
+
152
+ **Exemplo — Agregação completa:**
153
+ ```
154
+ POST /v3/database/action_log/aggregate?strict=true
155
+
156
+ [
157
+ { "$match": { "actionId": "sell", "userId": "jerry" } },
158
+ { "$group": { "_id": "$userId", "total": { "$sum": "$attributes.price" } } },
159
+ { "$sort": { "total": -1 } },
160
+ { "$limit": 10 }
161
+ ]
162
+ ```
163
+
164
+ ### Inserção em Massa (Bulk)
165
+ **Método:** POST
166
+ **Endpoint:** `/v3/database/:collection/bulk`
167
+ **Query Params:**
168
+ - `async=true` — Processamento assíncrono (para grandes volumes)
169
+
170
+ **Exemplo de Body:**
171
+ ```json
172
+ [
173
+ { "_id": "car001", "year": 2010, "price": 60000, "name": "Honda Civic", "brand": "honda" },
174
+ { "_id": "car002", "year": 2012, "price": 70000, "name": "Toyota Corolla", "brand": "toyota" }
175
+ ]
176
+ ```
177
+
178
+ ### Drop Collection
179
+ **Método:** DELETE
180
+ **Endpoint:** `/v3/database/:collection/drop`
181
+ **⚠️ CUIDADO:** Remove a coleção inteira!
182
+
183
+ ### Listar Índices
184
+ **Método:** GET
185
+ **Endpoint:** `/v3/database/:collection/index`
186
+
187
+ ### Criar Índice
188
+ **Método:** POST
189
+ **Endpoint:** `/v3/database/:collection/index`
190
+
191
+ **Exemplo de Body:**
192
+ ```json
193
+ { "fuel": 1 }
194
+ ```
195
+
196
+ ### Excluir Índice
197
+ **Método:** DELETE
198
+ **Endpoint:** `/v3/database/:collection/index/:index_name`
199
+
200
+ ## Paginação
201
+
202
+ Usa header `Range` no padrão HTTP Range:
203
+ ```
204
+ Range: items=0-9 (primeiros 10)
205
+ Range: items=10-19 (próximos 10)
206
+ Range: items=0-99 (primeiros 100)
207
+ ```
208
+
209
+ Resposta inclui header `Content-Range` com total de registros.
210
+
211
+ Default sem Range: retorna até 100 registros.
212
+
213
+ ## Strict Mode (BSON Types)
214
+
215
+ Quando `strict=true`:
216
+ - **Datas** são retornadas como `{ "$date": "2026-03-06T10:00:00.000Z" }` (ISO-8601)
217
+ - **Sem strict**, datas podem vir como timestamps numéricos ou strings
218
+
219
+ Para **gravar** datas tipadas, enviar como:
220
+ ```json
221
+ { "created": { "$date": "2026-03-06T10:00:00.000Z" } }
222
+ ```
223
+
224
+ > **Regra:** Sempre use `strict=true` em GETs para preservar tipos BSON. Sem ele, datas viram strings/números e quebram queries.
225
+
226
+ ## Criptografia de Campos (v4.0)
227
+
228
+ Se habilitada (Studio > Security > Field Encryption):
229
+ - Campos marcados são criptografados no POST/PUT e descriptografados no GET
230
+ - Requer token com permissão `readEncryptedValues`
231
+ - Usa AES com chave secreta do tenant
232
+
233
+ ## Validações e Testes
234
+
235
+ - [ ] Listar coleções retorna resultado
236
+ - [ ] CRUD funciona na coleção alvo
237
+ - [ ] Filtro `q` funciona corretamente
238
+ - [ ] Aggregate com `q` + pipeline retorna dados filtrados e ordenados
239
+ - [ ] Bulk insert registra múltiplos itens
240
+ - [ ] Índices são criados/removidos corretamente
241
+ - [ ] `strict=true` preserva tipos BSON