funifier-mcp 0.1.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 +351 -351
- package/datasource-funifier-docs/knowledge/guides/aggregates.md +152 -0
- package/datasource-funifier-docs/knowledge/guides/database-access.md +132 -0
- package/datasource-funifier-docs/knowledge/guides/java-entities.md +373 -0
- package/datasource-funifier-docs/knowledge/guides/java-libraries.md +330 -0
- package/datasource-funifier-docs/knowledge/guides/java-managers.md +509 -0
- package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +271 -0
- package/datasource-funifier-docs/knowledge/index.md +121 -0
- package/datasource-funifier-docs/knowledge/modules/achievement.md +46 -0
- package/datasource-funifier-docs/knowledge/modules/action-log.md +88 -0
- package/datasource-funifier-docs/knowledge/modules/action.md +80 -0
- package/datasource-funifier-docs/knowledge/modules/auth.md +104 -0
- package/datasource-funifier-docs/knowledge/modules/avatar.md +28 -0
- package/datasource-funifier-docs/knowledge/modules/backup.md +40 -0
- package/datasource-funifier-docs/knowledge/modules/challenge.md +91 -0
- package/datasource-funifier-docs/knowledge/modules/compact.md +40 -0
- package/datasource-funifier-docs/knowledge/modules/competition.md +149 -0
- package/datasource-funifier-docs/knowledge/modules/crossword.md +41 -0
- package/datasource-funifier-docs/knowledge/modules/csv-data.md +30 -0
- package/datasource-funifier-docs/knowledge/modules/custom-object.md +53 -0
- package/datasource-funifier-docs/knowledge/modules/database.md +241 -0
- package/datasource-funifier-docs/knowledge/modules/folder.md +111 -0
- package/datasource-funifier-docs/knowledge/modules/kpi-formulas.md +23 -0
- package/datasource-funifier-docs/knowledge/modules/lastmile.md +45 -0
- package/datasource-funifier-docs/knowledge/modules/leaderboard.md +98 -0
- package/datasource-funifier-docs/knowledge/modules/level.md +83 -0
- package/datasource-funifier-docs/knowledge/modules/lottery.md +112 -0
- package/datasource-funifier-docs/knowledge/modules/marketplace.md +27 -0
- package/datasource-funifier-docs/knowledge/modules/mystery.md +82 -0
- package/datasource-funifier-docs/knowledge/modules/notification.md +40 -0
- package/datasource-funifier-docs/knowledge/modules/patterns.md +1096 -0
- package/datasource-funifier-docs/knowledge/modules/player.md +101 -0
- package/datasource-funifier-docs/knowledge/modules/point.md +67 -0
- package/datasource-funifier-docs/knowledge/modules/public.md +253 -0
- package/datasource-funifier-docs/knowledge/modules/question.md +136 -0
- package/datasource-funifier-docs/knowledge/modules/quiz.md +163 -0
- package/datasource-funifier-docs/knowledge/modules/scheduler.md +58 -0
- package/datasource-funifier-docs/knowledge/modules/security.md +169 -0
- package/datasource-funifier-docs/knowledge/modules/staging.md +28 -0
- package/datasource-funifier-docs/knowledge/modules/static-repo.md +41 -0
- package/datasource-funifier-docs/knowledge/modules/story.md +42 -0
- package/datasource-funifier-docs/knowledge/modules/studio-page.md +180 -0
- package/datasource-funifier-docs/knowledge/modules/swap.md +132 -0
- package/datasource-funifier-docs/knowledge/modules/team.md +75 -0
- package/datasource-funifier-docs/knowledge/modules/trigger.md +189 -0
- package/datasource-funifier-docs/knowledge/modules/upload.md +155 -0
- package/datasource-funifier-docs/knowledge/modules/virtual-good.md +99 -0
- package/datasource-funifier-docs/knowledge/modules/webhook.md +41 -0
- package/datasource-funifier-docs/knowledge/modules/websocket.md +41 -0
- package/datasource-funifier-docs/knowledge/modules/widget.md +42 -0
- package/datasource-funifier-docs/process-gtm-saas.md +143 -0
- package/datasource-funifier-docs/process-instagram.md +88 -0
- package/datasource-funifier-docs/process.md +1826 -0
- package/datasource-funifier-docs/readme.md +132 -0
- package/dist/cli/config-writers.d.ts +15 -0
- package/dist/cli/config-writers.d.ts.map +1 -0
- package/dist/cli/config-writers.js +55 -0
- package/dist/cli/config-writers.js.map +1 -0
- package/dist/cli/config-writers.test.d.ts +2 -0
- package/dist/cli/config-writers.test.d.ts.map +1 -0
- package/dist/cli/config-writers.test.js +55 -0
- package/dist/cli/config-writers.test.js.map +1 -0
- package/dist/cli/copy.d.ts +6 -0
- package/dist/cli/copy.d.ts.map +1 -0
- package/dist/cli/copy.js +63 -0
- package/dist/cli/copy.js.map +1 -0
- package/dist/cli/copy.test.d.ts +2 -0
- package/dist/cli/copy.test.d.ts.map +1 -0
- package/dist/cli/copy.test.js +94 -0
- package/dist/cli/copy.test.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +167 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/paths.d.ts +7 -0
- package/dist/cli/paths.d.ts.map +1 -0
- package/dist/cli/paths.js +62 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/paths.test.d.ts +2 -0
- package/dist/cli/paths.test.d.ts.map +1 -0
- package/dist/cli/paths.test.js +50 -0
- package/dist/cli/paths.test.js.map +1 -0
- package/dist/cli/platforms.d.ts +22 -0
- package/dist/cli/platforms.d.ts.map +1 -0
- package/dist/cli/platforms.js +50 -0
- package/dist/cli/platforms.js.map +1 -0
- package/dist/cli/prompts.d.ts +7 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +49 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/bundle.js +98 -50
- package/dist/mcp/index.js +18 -1
- package/dist/mcp/index.js.map +1 -1
- package/package.json +70 -65
- package/skills/funifier-create-action/SKILL.md +86 -86
- package/skills/funifier-create-aggregate/SKILL.md +126 -87
- package/skills/funifier-create-challenge/SKILL.md +87 -87
- package/skills/funifier-create-custom-page/SKILL.md +126 -87
- package/skills/funifier-create-leaderboard/SKILL.md +87 -87
- package/skills/funifier-create-level/SKILL.md +86 -86
- package/skills/funifier-create-point/SKILL.md +86 -86
- package/skills/funifier-create-quiz/SKILL.md +86 -86
- package/skills/funifier-create-scheduler/SKILL.md +126 -87
- package/skills/funifier-create-trigger/SKILL.md +127 -88
- package/skills/funifier-create-virtual-good/SKILL.md +86 -86
- package/skills/funifier-debug/SKILL.md +90 -90
- package/skills/funifier-help/SKILL.md +85 -85
- package/skills/funifier-implement-frontend/SKILL.md +89 -89
- package/skills/funifier-index/SKILL.md +50 -50
|
@@ -0,0 +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
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Folder (Pasta)
|
|
2
|
+
|
|
3
|
+
**Acesso Studio:** `/studio/folder`
|
|
4
|
+
**API Endpoint:** `/v3/folder`
|
|
5
|
+
|
|
6
|
+
## O que é
|
|
7
|
+
|
|
8
|
+
Organização de conteúdos e monitoramento do progresso em cursos ou trilhas. Permite criar pastas virtuais para agrupar conteúdos como quizzes, desafios, materiais de estudo e jogos, facilitando o acompanhamento do progresso dos jogadores em jornadas de aprendizagem ou trilhas gamificadas.
|
|
9
|
+
|
|
10
|
+
## Quando usar
|
|
11
|
+
|
|
12
|
+
- Para estruturar cursos online
|
|
13
|
+
- Para criar trilhas de capacitação
|
|
14
|
+
- Para acompanhar progresso em treinamentos
|
|
15
|
+
- Para organizar conteúdos em hierarquias (módulos → aulas → conteúdos)
|
|
16
|
+
|
|
17
|
+
## Checklist de Configuração no Studio
|
|
18
|
+
|
|
19
|
+
- [ ] Criar estrutura hierárquica de pastas
|
|
20
|
+
- [ ] Definir títulos das pastas
|
|
21
|
+
- [ ] Associar conteúdos às pastas (quizzes, desafios, textos)
|
|
22
|
+
- [ ] Definir tipos de conteúdo (folder_content_type)
|
|
23
|
+
- [ ] Configurar pasta-pai (parent) para hierarquia
|
|
24
|
+
|
|
25
|
+
## API Endpoints
|
|
26
|
+
|
|
27
|
+
### Listar Pastas
|
|
28
|
+
**Método:** GET
|
|
29
|
+
**Endpoint:** `/v3/database/folder`
|
|
30
|
+
|
|
31
|
+
### Criar Pasta
|
|
32
|
+
**Método:** POST
|
|
33
|
+
**Endpoint:** `/v3/folder`
|
|
34
|
+
|
|
35
|
+
**Exemplo de Body:**
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"title": "CoreDrives",
|
|
39
|
+
"parent": "D0MmmNf"
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Deletar Pasta
|
|
44
|
+
**Método:** DELETE
|
|
45
|
+
**Endpoint:** `/v3/folder/:id`
|
|
46
|
+
|
|
47
|
+
### Obter Breadcrumb
|
|
48
|
+
**Método:** POST
|
|
49
|
+
**Endpoint:** `/v3/folder/breadcrumb`
|
|
50
|
+
|
|
51
|
+
**Exemplo de Body:**
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"folder": "CD1"
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Listar Tipos de Conteúdo
|
|
59
|
+
**Método:** GET
|
|
60
|
+
**Endpoint:** `/v3/database/folder_content_type`
|
|
61
|
+
|
|
62
|
+
### Criar/Atualizar Tipo de Conteúdo
|
|
63
|
+
**Método:** PUT
|
|
64
|
+
**Endpoint:** `/v3/database/folder_content_type`
|
|
65
|
+
|
|
66
|
+
**Exemplo de Body:**
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"_id": "text",
|
|
70
|
+
"input": "formulary",
|
|
71
|
+
"form": [
|
|
72
|
+
{ "name": "title", "type": "string", "title": "Title" },
|
|
73
|
+
{ "name": "content", "type": "text", "title": "Content" }
|
|
74
|
+
],
|
|
75
|
+
"title": "Text",
|
|
76
|
+
"entity": "text__c"
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Casos de Uso Comuns
|
|
81
|
+
|
|
82
|
+
- **Curso Online:** Pasta raiz "Curso de Vendas" → Subpastas "Módulo 1", "Módulo 2" → Conteúdos (textos, vídeos, quizzes)
|
|
83
|
+
- **Trilha de Capacitação:** Pastas representam etapas; cada etapa contém materiais e avaliações
|
|
84
|
+
- **Catálogo de Produtos:** Pastas como categorias; conteúdos como fichas de produto
|
|
85
|
+
- **Onboarding:** Pastas representam fases do onboarding; progresso monitora completude
|
|
86
|
+
|
|
87
|
+
## Progresso do Jogador
|
|
88
|
+
|
|
89
|
+
O Folder monitora automaticamente o progresso do jogador dentro da árvore de diretórios. Isso permite:
|
|
90
|
+
|
|
91
|
+
- Saber que um jogador completou X% de um curso
|
|
92
|
+
- Registrar action logs ao progredir (aciona técnicas de jogos)
|
|
93
|
+
- Criar desafios vinculados à completude de um folder (ex: "Complete o curso para ganhar 500 XP")
|
|
94
|
+
|
|
95
|
+
## Integração com Outras Técnicas
|
|
96
|
+
|
|
97
|
+
| Técnica | Integração |
|
|
98
|
+
|---------|-----------|
|
|
99
|
+
| **Challenge** | Desafio completado quando jogador termina todos os itens de um folder |
|
|
100
|
+
| **Quiz** | Quizzes podem ser conteúdos dentro de um folder |
|
|
101
|
+
| **Point** | Pontos concedidos ao progredir no folder |
|
|
102
|
+
| **Achievement** | Conquista desbloqueada ao completar 100% do folder |
|
|
103
|
+
|
|
104
|
+
## Validações e Testes
|
|
105
|
+
|
|
106
|
+
- [ ] Pasta aparece na lista
|
|
107
|
+
- [ ] Hierarquia pai-filho funciona
|
|
108
|
+
- [ ] Breadcrumb retorna caminho correto
|
|
109
|
+
- [ ] Conteúdos são associados corretamente
|
|
110
|
+
- [ ] Progresso do jogador é calculado corretamente
|
|
111
|
+
- [ ] Action log é gerado ao progredir
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# KPI Formulas (Fórmulas de KPI)
|
|
2
|
+
|
|
3
|
+
## O que é
|
|
4
|
+
|
|
5
|
+
Configuração de regras e cálculos avançados para avaliar ações dos jogadores. Permite criar fórmulas customizadas para avaliação de desempenho e resultados, indo além das regras padrão dos outros módulos.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Para cálculos avançados de desempenho que os módulos padrão não atendem
|
|
10
|
+
- Para fórmulas considerando múltiplos critérios (quantidade, valor, tempo)
|
|
11
|
+
- Para regras avançadas de rankings
|
|
12
|
+
- **Importante:** usar com critério, apenas quando recursos padrão não atendem
|
|
13
|
+
|
|
14
|
+
## Checklist de Configuração
|
|
15
|
+
|
|
16
|
+
- [ ] Definir a fórmula de cálculo
|
|
17
|
+
- [ ] Vincular aos desafios ou rankings relevantes
|
|
18
|
+
- [ ] Testar com dados reais
|
|
19
|
+
|
|
20
|
+
## Validações e Testes
|
|
21
|
+
|
|
22
|
+
- [ ] Fórmula retorna resultados esperados
|
|
23
|
+
- [ ] Cálculo funciona com diferentes combinações de dados
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# LastMile (Última Milha)
|
|
2
|
+
|
|
3
|
+
**Acesso Studio:** `/studio/lastmile`
|
|
4
|
+
**API Endpoint:** `/v3/lastmile`
|
|
5
|
+
|
|
6
|
+
## O que é
|
|
7
|
+
|
|
8
|
+
Envio de mensagens motivacionais quando o jogador está próximo de uma meta. Permite configurar mensagens automáticas para engajar e lembrar os jogadores sobre metas e desafios que estão prestes a serem concluídos, aumentando a taxa de finalização.
|
|
9
|
+
|
|
10
|
+
## Quando usar
|
|
11
|
+
|
|
12
|
+
- Para lembrar jogadores que estão perto de completar desafios
|
|
13
|
+
- Para aumentar taxa de conclusão de metas
|
|
14
|
+
- Para enviar mensagens motivacionais personalizadas
|
|
15
|
+
- Para engajar jogadores que estão a 80-90% de uma meta
|
|
16
|
+
|
|
17
|
+
## Dependências
|
|
18
|
+
|
|
19
|
+
- **Challenge**: desafios devem existir para monitorar progresso
|
|
20
|
+
|
|
21
|
+
## Checklist de Configuração no Studio
|
|
22
|
+
|
|
23
|
+
- [ ] Definir condição de disparo (% de progresso)
|
|
24
|
+
- [ ] Definir mensagem motivacional
|
|
25
|
+
- [ ] Vincular ao desafio ou meta específica
|
|
26
|
+
|
|
27
|
+
## API Endpoints
|
|
28
|
+
|
|
29
|
+
### Listar LastMile
|
|
30
|
+
**Método:** GET
|
|
31
|
+
**Endpoint:** `/v3/lastmile`
|
|
32
|
+
|
|
33
|
+
### Criar LastMile
|
|
34
|
+
**Método:** POST
|
|
35
|
+
**Endpoint:** `/v3/lastmile`
|
|
36
|
+
|
|
37
|
+
### Deletar LastMile
|
|
38
|
+
**Método:** DELETE
|
|
39
|
+
**Endpoint:** `/v3/lastmile/:id`
|
|
40
|
+
|
|
41
|
+
## Validações e Testes
|
|
42
|
+
|
|
43
|
+
- [ ] Configuração de LastMile aparece na lista
|
|
44
|
+
- [ ] Mensagem é disparada ao atingir % configurado
|
|
45
|
+
- [ ] Jogador recebe notificação corretamente
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Leaderboard (Ranking)
|
|
2
|
+
|
|
3
|
+
**Acesso Studio:** `/studio/leaderboard`
|
|
4
|
+
**API Endpoint:** `/v3/leaderboard`
|
|
5
|
+
|
|
6
|
+
## O que é
|
|
7
|
+
|
|
8
|
+
Criação e gestão de rankings. Permite comparar o desempenho dos jogadores utilizando diferentes critérios, como pontos, tempo, ou métricas customizadas. Rankings podem ser individuais, por equipes, por período ou por status.
|
|
9
|
+
|
|
10
|
+
## Quando usar
|
|
11
|
+
|
|
12
|
+
- Para criar competição saudável entre jogadores
|
|
13
|
+
- Para dar visibilidade ao desempenho
|
|
14
|
+
- Para motivar através de comparação social
|
|
15
|
+
- Para rankings semanais, mensais ou em tempo real
|
|
16
|
+
|
|
17
|
+
## Dependências
|
|
18
|
+
|
|
19
|
+
- **Point** ou **Action**: o critério de ranking deve estar configurado
|
|
20
|
+
|
|
21
|
+
## Checklist de Configuração no Studio
|
|
22
|
+
|
|
23
|
+
- [ ] Definir título e descrição
|
|
24
|
+
- [ ] Definir tipo de principal (0 = jogador, 1 = equipe)
|
|
25
|
+
- [ ] Definir operação (tipo de métrica, item, ordenação)
|
|
26
|
+
- [ ] Definir período (semanal, mensal, tempo real)
|
|
27
|
+
- [ ] Vincular técnicas de jogo
|
|
28
|
+
|
|
29
|
+
## API Endpoints
|
|
30
|
+
|
|
31
|
+
### Listar Leaderboards
|
|
32
|
+
**Método:** GET
|
|
33
|
+
**Endpoint:** `/v3/leaderboard`
|
|
34
|
+
|
|
35
|
+
**Exemplo de Resposta:**
|
|
36
|
+
```json
|
|
37
|
+
[
|
|
38
|
+
{
|
|
39
|
+
"title": "Top Players",
|
|
40
|
+
"description": "Players with the most points xp in the week",
|
|
41
|
+
"principalType": 0,
|
|
42
|
+
"operation": {
|
|
43
|
+
"type": 3,
|
|
44
|
+
"achievement_type": 0,
|
|
45
|
+
"item": "xp",
|
|
46
|
+
"filters": [],
|
|
47
|
+
"sort": -1,
|
|
48
|
+
"sub": false
|
|
49
|
+
},
|
|
50
|
+
"period": {
|
|
51
|
+
"type": 0,
|
|
52
|
+
"timeAmount": 1,
|
|
53
|
+
"timeScale": 6
|
|
54
|
+
},
|
|
55
|
+
"techniques": ["GT03"],
|
|
56
|
+
"_id": "DTjTvZ5"
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Criar Leaderboard
|
|
62
|
+
**Método:** POST
|
|
63
|
+
**Endpoint:** `/v3/leaderboard`
|
|
64
|
+
(Body igual ao exemplo de resposta acima)
|
|
65
|
+
|
|
66
|
+
### Deletar Leaderboard
|
|
67
|
+
**Método:** DELETE
|
|
68
|
+
**Endpoint:** `/v3/leaderboard/:id`
|
|
69
|
+
|
|
70
|
+
### Obter Lista de Líderes
|
|
71
|
+
**Método:** POST
|
|
72
|
+
**Endpoint:** `/v3/leaderboard/:id/leader/aggregate?period=&live=true`
|
|
73
|
+
|
|
74
|
+
**Exemplo de Resposta:**
|
|
75
|
+
```json
|
|
76
|
+
[
|
|
77
|
+
{
|
|
78
|
+
"_id": "tom_D0zCMvq",
|
|
79
|
+
"total": 30,
|
|
80
|
+
"position": 1,
|
|
81
|
+
"move": "up",
|
|
82
|
+
"player": "tom",
|
|
83
|
+
"name": "Tom",
|
|
84
|
+
"boardId": "DTjTvZ5"
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Resetar Cache
|
|
90
|
+
**Método:** GET
|
|
91
|
+
**Endpoint:** `/v3/leaderboard/reset`
|
|
92
|
+
|
|
93
|
+
## Validações e Testes
|
|
94
|
+
|
|
95
|
+
- [ ] Leaderboard aparece na lista GET /v3/leaderboard
|
|
96
|
+
- [ ] Lista de líderes retorna jogadores ordenados
|
|
97
|
+
- [ ] Período está configurado corretamente
|
|
98
|
+
- [ ] Cache pode ser resetado com sucesso
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Level (Nível)
|
|
2
|
+
|
|
3
|
+
**Acesso Studio:** `/studio/level`
|
|
4
|
+
**API Endpoint:** `/v3/level`
|
|
5
|
+
|
|
6
|
+
## O que é
|
|
7
|
+
|
|
8
|
+
Sistema de progressão por níveis. Permite definir a progressão dos jogadores com base em pontos acumulados ou outros critérios, atribuindo títulos ou benefícios a cada nível. Pode-se exigir desafios específicos para desbloquear certos níveis.
|
|
9
|
+
|
|
10
|
+
## Quando usar
|
|
11
|
+
|
|
12
|
+
- Para criar senso de progressão e conquista
|
|
13
|
+
- Para desbloquear funcionalidades por nível
|
|
14
|
+
- Para segmentar jogadores por experiência
|
|
15
|
+
- Exemplos: Júnior → Pleno → Sênior; faixas coloridas
|
|
16
|
+
|
|
17
|
+
## Dependências
|
|
18
|
+
|
|
19
|
+
- **Point**: a categoria de ponto usada para progressão deve existir antes
|
|
20
|
+
- **Configuração global**: definir qual ponto controla os níveis via `/v3/database/level_config`
|
|
21
|
+
|
|
22
|
+
## Checklist de Configuração no Studio
|
|
23
|
+
|
|
24
|
+
- [ ] Definir _id do nível (ex: L0, L1, L2)
|
|
25
|
+
- [ ] Definir nome do nível (ex: "Apprentice", "Master")
|
|
26
|
+
- [ ] Definir descrição motivadora
|
|
27
|
+
- [ ] Definir minPoints (pontuação mínima crescente)
|
|
28
|
+
- [ ] Definir position (ordem sequencial, iniciando em 0)
|
|
29
|
+
- [ ] Configurar categoria de ponto global (level_config)
|
|
30
|
+
|
|
31
|
+
## API Endpoints
|
|
32
|
+
|
|
33
|
+
### Listar Níveis
|
|
34
|
+
**Método:** GET
|
|
35
|
+
**Endpoint:** `/v3/level`
|
|
36
|
+
|
|
37
|
+
### Criar Nível
|
|
38
|
+
**Método:** POST
|
|
39
|
+
**Endpoint:** `/v3/level`
|
|
40
|
+
|
|
41
|
+
**Exemplo de Body:**
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"level": "Apprentice",
|
|
45
|
+
"position": 0,
|
|
46
|
+
"description": "It indicates that you are learning and growing.",
|
|
47
|
+
"minPoints": 10,
|
|
48
|
+
"notifications": [],
|
|
49
|
+
"requirements": [],
|
|
50
|
+
"i18n": {},
|
|
51
|
+
"extra": {},
|
|
52
|
+
"techniques": ["GT85"],
|
|
53
|
+
"_id": "L0"
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Excluir Nível
|
|
58
|
+
**Método:** DELETE
|
|
59
|
+
**Endpoint:** `/v3/level/:id`
|
|
60
|
+
|
|
61
|
+
### Configurar Ponto Global para Níveis
|
|
62
|
+
**Método:** PUT
|
|
63
|
+
**Endpoint:** `/v3/database/level_config`
|
|
64
|
+
|
|
65
|
+
**Exemplo de Body:**
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"_id": "global",
|
|
69
|
+
"pointCategory": "xp"
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Atualizar Posições dos Níveis
|
|
74
|
+
**Método:** PUT
|
|
75
|
+
**Endpoint:** `/v3/level/position`
|
|
76
|
+
**Descrição:** Recalcula posições com base no minPoints.
|
|
77
|
+
|
|
78
|
+
## Validações e Testes
|
|
79
|
+
|
|
80
|
+
- [ ] Níveis aparecem na lista GET /v3/level
|
|
81
|
+
- [ ] minPoints é crescente entre níveis
|
|
82
|
+
- [ ] level_config aponta para o ponto correto
|
|
83
|
+
- [ ] Ao ganhar pontos suficientes, jogador sobe de nível automaticamente
|