funifier-mcp 0.2.0 → 0.2.3
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.
- package/.cursor/rules/funifier.mdc +91 -0
- package/.github/copilot-instructions.md +83 -0
- package/AGENTS.md +97 -0
- package/README.md +247 -78
- package/datasource-funifier-docs/knowledge/guides/aggregates.md +152 -152
- package/datasource-funifier-docs/knowledge/guides/database-access.md +132 -132
- package/datasource-funifier-docs/knowledge/guides/java-entities.md +373 -373
- package/datasource-funifier-docs/knowledge/guides/java-libraries.md +330 -330
- package/datasource-funifier-docs/knowledge/guides/java-managers.md +509 -509
- package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +271 -271
- package/datasource-funifier-docs/knowledge/index.md +121 -121
- package/datasource-funifier-docs/knowledge/modules/achievement.md +46 -46
- package/datasource-funifier-docs/knowledge/modules/action-log.md +88 -88
- package/datasource-funifier-docs/knowledge/modules/action.md +80 -80
- package/datasource-funifier-docs/knowledge/modules/auth.md +104 -104
- package/datasource-funifier-docs/knowledge/modules/avatar.md +28 -28
- package/datasource-funifier-docs/knowledge/modules/backup.md +40 -40
- package/datasource-funifier-docs/knowledge/modules/challenge.md +91 -91
- package/datasource-funifier-docs/knowledge/modules/compact.md +40 -40
- package/datasource-funifier-docs/knowledge/modules/competition.md +149 -149
- package/datasource-funifier-docs/knowledge/modules/crossword.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/csv-data.md +30 -30
- package/datasource-funifier-docs/knowledge/modules/custom-object.md +53 -53
- package/datasource-funifier-docs/knowledge/modules/database.md +241 -241
- package/datasource-funifier-docs/knowledge/modules/folder.md +111 -111
- package/datasource-funifier-docs/knowledge/modules/kpi-formulas.md +23 -23
- package/datasource-funifier-docs/knowledge/modules/lastmile.md +45 -45
- package/datasource-funifier-docs/knowledge/modules/leaderboard.md +98 -98
- package/datasource-funifier-docs/knowledge/modules/level.md +83 -83
- package/datasource-funifier-docs/knowledge/modules/lottery.md +112 -112
- package/datasource-funifier-docs/knowledge/modules/marketplace.md +27 -27
- package/datasource-funifier-docs/knowledge/modules/mystery.md +82 -82
- package/datasource-funifier-docs/knowledge/modules/notification.md +40 -40
- package/datasource-funifier-docs/knowledge/modules/patterns.md +1096 -1096
- package/datasource-funifier-docs/knowledge/modules/player.md +101 -101
- package/datasource-funifier-docs/knowledge/modules/point.md +67 -67
- package/datasource-funifier-docs/knowledge/modules/public.md +253 -253
- package/datasource-funifier-docs/knowledge/modules/question.md +136 -136
- package/datasource-funifier-docs/knowledge/modules/quiz.md +163 -163
- package/datasource-funifier-docs/knowledge/modules/scheduler.md +58 -58
- package/datasource-funifier-docs/knowledge/modules/security.md +169 -169
- package/datasource-funifier-docs/knowledge/modules/staging.md +28 -28
- package/datasource-funifier-docs/knowledge/modules/static-repo.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/story.md +42 -42
- package/datasource-funifier-docs/knowledge/modules/studio-page.md +180 -180
- package/datasource-funifier-docs/knowledge/modules/swap.md +132 -132
- package/datasource-funifier-docs/knowledge/modules/team.md +75 -75
- package/datasource-funifier-docs/knowledge/modules/trigger.md +189 -189
- package/datasource-funifier-docs/knowledge/modules/upload.md +155 -155
- package/datasource-funifier-docs/knowledge/modules/virtual-good.md +99 -99
- package/datasource-funifier-docs/knowledge/modules/webhook.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/websocket.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/widget.md +42 -42
- package/datasource-funifier-docs/process-gtm-saas.md +143 -143
- package/datasource-funifier-docs/process-instagram.md +88 -88
- package/datasource-funifier-docs/process.md +1826 -1826
- package/datasource-funifier-docs/readme.md +132 -132
- package/dist/cli/config-writers.js +11 -11
- package/dist/mcp/bundle.js +55 -52
- package/package.json +70 -67
- package/skills/funifier-create-aggregate/SKILL.md +126 -126
- package/skills/funifier-create-custom-page/SKILL.md +126 -126
- package/skills/funifier-create-scheduler/SKILL.md +126 -126
- 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
|