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.
- 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 +82 -77
- 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,58 +1,58 @@
|
|
|
1
|
-
# Scheduler (Scheduler)
|
|
2
|
-
|
|
3
|
-
**Acesso Studio:** `/studio/scheduler`
|
|
4
|
-
**API Endpoint:** `/v3/scheduler`
|
|
5
|
-
|
|
6
|
-
## O que é
|
|
7
|
-
|
|
8
|
-
Execução de códigos JAVA em datas e horários agendados (expressões CRON). Permite agendar tarefas e automações para rodar em horários ou intervalos pré-definidos.
|
|
9
|
-
|
|
10
|
-
## Quando usar
|
|
11
|
-
|
|
12
|
-
- Para gerar relatórios automatizados (ex: toda sexta às 10h)
|
|
13
|
-
- Para debitar pontos de jogadores inativos
|
|
14
|
-
- Para enviar lembretes automáticos de metas
|
|
15
|
-
- Para campanhas temporais com início/fim automático
|
|
16
|
-
|
|
17
|
-
## Script Runtime Environment (Wrapper Class)
|
|
18
|
-
|
|
19
|
-
O script do scheduler **não é standalone** — ele é inserido dentro de uma classe Java wrapper gerada pelo Funifier, idêntica à do Public Endpoint (ver `public.md` para a lista completa de imports).
|
|
20
|
-
|
|
21
|
-
### Regras
|
|
22
|
-
|
|
23
|
-
1. **NÃO use `import`** — todos os imports já estão no wrapper (Unirest, Groovy JSON, Funifier entities/utils, Apache HTTP, Simple Java Mail, etc.)
|
|
24
|
-
2. Se precisar de uma classe não importada, use o nome completo: `com.example.MinhaClasse`
|
|
25
|
-
3. **`manager`** (ManagerFactory) está disponível como campo da classe
|
|
26
|
-
4. **Método principal:** `void execute()` (sem parâmetros)
|
|
27
|
-
5. **Timeout padrão de 10 segundos** — pode ser customizado via campo `timeout` (em **segundos**) na API: `POST /v3/scheduler` com `{"_id": "scheduler_id", "timeout": 30}`. Este campo não aparece no Studio.
|
|
28
|
-
6. Scripts rodam em **Groovy** — cuidado com `$` em GStrings
|
|
29
|
-
7. Use apenas **ASCII em comentários**
|
|
30
|
-
|
|
31
|
-
> 📖 Ver `public.md` → **Script Runtime Environment** para a lista completa de imports e bibliotecas disponíveis.
|
|
32
|
-
|
|
33
|
-
## Checklist de Configuração no Studio
|
|
34
|
-
|
|
35
|
-
- [ ] Definir nome e descrição do scheduler
|
|
36
|
-
- [ ] Definir expressão CRON
|
|
37
|
-
- [ ] Escrever script Java
|
|
38
|
-
- [ ] Testar em ambiente de homologação
|
|
39
|
-
|
|
40
|
-
## API Endpoints
|
|
41
|
-
|
|
42
|
-
### Listar Schedulers
|
|
43
|
-
**Método:** GET
|
|
44
|
-
**Endpoint:** `/v3/scheduler`
|
|
45
|
-
|
|
46
|
-
### Criar Scheduler
|
|
47
|
-
**Método:** POST
|
|
48
|
-
**Endpoint:** `/v3/scheduler`
|
|
49
|
-
|
|
50
|
-
### Deletar Scheduler
|
|
51
|
-
**Método:** DELETE
|
|
52
|
-
**Endpoint:** `/v3/scheduler/:id`
|
|
53
|
-
|
|
54
|
-
## Validações e Testes
|
|
55
|
-
|
|
56
|
-
- [ ] Scheduler aparece na lista
|
|
57
|
-
- [ ] Expressão CRON é válida
|
|
58
|
-
- [ ] Script executa no horário configurado
|
|
1
|
+
# Scheduler (Scheduler)
|
|
2
|
+
|
|
3
|
+
**Acesso Studio:** `/studio/scheduler`
|
|
4
|
+
**API Endpoint:** `/v3/scheduler`
|
|
5
|
+
|
|
6
|
+
## O que é
|
|
7
|
+
|
|
8
|
+
Execução de códigos JAVA em datas e horários agendados (expressões CRON). Permite agendar tarefas e automações para rodar em horários ou intervalos pré-definidos.
|
|
9
|
+
|
|
10
|
+
## Quando usar
|
|
11
|
+
|
|
12
|
+
- Para gerar relatórios automatizados (ex: toda sexta às 10h)
|
|
13
|
+
- Para debitar pontos de jogadores inativos
|
|
14
|
+
- Para enviar lembretes automáticos de metas
|
|
15
|
+
- Para campanhas temporais com início/fim automático
|
|
16
|
+
|
|
17
|
+
## Script Runtime Environment (Wrapper Class)
|
|
18
|
+
|
|
19
|
+
O script do scheduler **não é standalone** — ele é inserido dentro de uma classe Java wrapper gerada pelo Funifier, idêntica à do Public Endpoint (ver `public.md` para a lista completa de imports).
|
|
20
|
+
|
|
21
|
+
### Regras
|
|
22
|
+
|
|
23
|
+
1. **NÃO use `import`** — todos os imports já estão no wrapper (Unirest, Groovy JSON, Funifier entities/utils, Apache HTTP, Simple Java Mail, etc.)
|
|
24
|
+
2. Se precisar de uma classe não importada, use o nome completo: `com.example.MinhaClasse`
|
|
25
|
+
3. **`manager`** (ManagerFactory) está disponível como campo da classe
|
|
26
|
+
4. **Método principal:** `void execute()` (sem parâmetros)
|
|
27
|
+
5. **Timeout padrão de 10 segundos** — pode ser customizado via campo `timeout` (em **segundos**) na API: `POST /v3/scheduler` com `{"_id": "scheduler_id", "timeout": 30}`. Este campo não aparece no Studio.
|
|
28
|
+
6. Scripts rodam em **Groovy** — cuidado com `$` em GStrings
|
|
29
|
+
7. Use apenas **ASCII em comentários**
|
|
30
|
+
|
|
31
|
+
> 📖 Ver `public.md` → **Script Runtime Environment** para a lista completa de imports e bibliotecas disponíveis.
|
|
32
|
+
|
|
33
|
+
## Checklist de Configuração no Studio
|
|
34
|
+
|
|
35
|
+
- [ ] Definir nome e descrição do scheduler
|
|
36
|
+
- [ ] Definir expressão CRON
|
|
37
|
+
- [ ] Escrever script Java
|
|
38
|
+
- [ ] Testar em ambiente de homologação
|
|
39
|
+
|
|
40
|
+
## API Endpoints
|
|
41
|
+
|
|
42
|
+
### Listar Schedulers
|
|
43
|
+
**Método:** GET
|
|
44
|
+
**Endpoint:** `/v3/scheduler`
|
|
45
|
+
|
|
46
|
+
### Criar Scheduler
|
|
47
|
+
**Método:** POST
|
|
48
|
+
**Endpoint:** `/v3/scheduler`
|
|
49
|
+
|
|
50
|
+
### Deletar Scheduler
|
|
51
|
+
**Método:** DELETE
|
|
52
|
+
**Endpoint:** `/v3/scheduler/:id`
|
|
53
|
+
|
|
54
|
+
## Validações e Testes
|
|
55
|
+
|
|
56
|
+
- [ ] Scheduler aparece na lista
|
|
57
|
+
- [ ] Expressão CRON é válida
|
|
58
|
+
- [ ] Script executa no horário configurado
|
|
@@ -1,169 +1,169 @@
|
|
|
1
|
-
# Security (Segurança)
|
|
2
|
-
|
|
3
|
-
**Acesso Studio:** Gamification Settings → "Mais" → Security → "Change your gamification security settings"
|
|
4
|
-
**Armazenamento:** Coleção `security`, documento com `_id` = API Key da gamificação
|
|
5
|
-
|
|
6
|
-
## Estrutura do Documento
|
|
7
|
-
|
|
8
|
-
```json
|
|
9
|
-
{
|
|
10
|
-
"_id": "API_KEY_DA_GAMIFICACAO",
|
|
11
|
-
"roles": [
|
|
12
|
-
{ "name": "public", "scope": "read_all", "timeout": "" },
|
|
13
|
-
{ "name": "player", "scope": "read_all, write_all, delete_all, database", "timeout": "" }
|
|
14
|
-
],
|
|
15
|
-
"apps": [
|
|
16
|
-
{ "name": "Nome do App", "app_secret": "GUID_GERADO", "scope": "read_all, write_all, delete_all, database" }
|
|
17
|
-
]
|
|
18
|
-
}
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Roles
|
|
22
|
-
|
|
23
|
-
Definem o nível de acesso dos tokens Bearer (jogadores logados) e Basic (acesso público).
|
|
24
|
-
|
|
25
|
-
### Campos
|
|
26
|
-
- `name` — Identificador da role (ex: `public`, `player`, `admin`)
|
|
27
|
-
- `scope` — Permissões separadas por vírgula
|
|
28
|
-
- `timeout` — Tempo de expiração do token (ex: `7d`, `1h`). **⚠️ NÃO usar string vazia `""`** — causa NPE no auth. Omitir o campo ou usar `null` para timeout padrão (7 dias).
|
|
29
|
-
|
|
30
|
-
### Scopes Disponíveis
|
|
31
|
-
| Scope | Descrição |
|
|
32
|
-
|-------|-----------|
|
|
33
|
-
| `read_all` | Leitura em todas as coleções |
|
|
34
|
-
| `write_all` | Escrita em todas as coleções |
|
|
35
|
-
| `delete_all` | Exclusão em todas as coleções |
|
|
36
|
-
| `database` | **Obrigatório** para acessar `/v3/database`. Sem ele, POST retorna 201 mas não persiste |
|
|
37
|
-
|
|
38
|
-
### Roles Comuns
|
|
39
|
-
- **`public`** — `read_all, write_database_signup__c` — Para acesso não autenticado (signup, landing page). Usa token Basic. Precisa de `write_database_signup__c` para o signup pattern funcionar.
|
|
40
|
-
- **`player`** — `read_all, write_all, delete_all, database` — Para usuários logados. Usa token Bearer.
|
|
41
|
-
|
|
42
|
-
### ⚠️ Lição Crítica
|
|
43
|
-
A palavra **`database`** deve estar literalmente no scope para que `/v3/database` funcione. Mesmo com `write_all` e `read_all`, sem `database` as operações falham silenciosamente.
|
|
44
|
-
|
|
45
|
-
## Apps
|
|
46
|
-
|
|
47
|
-
Apps geram tokens Basic não-expirantes para uso em triggers, endpoints públicos e integrações server-side.
|
|
48
|
-
|
|
49
|
-
### Campos
|
|
50
|
-
- `name` — Nome descritivo do app
|
|
51
|
-
- `app_secret` — GUID gerado pelo Funifier (via `/v3/util/guid/new`)
|
|
52
|
-
- `scope` — Permissões (mesmo formato das roles)
|
|
53
|
-
|
|
54
|
-
### Token Basic do App
|
|
55
|
-
```
|
|
56
|
-
Basic base64(API_KEY + ":" + APP_SECRET)
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Exemplo:
|
|
60
|
-
```javascript
|
|
61
|
-
var basicToken = 'Basic ' + btoa('69ab1a9a607db81962b92cd2:69ab3566607db81962b9686e');
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Como Criar via API (sem Studio UI)
|
|
65
|
-
|
|
66
|
-
### 1. Obter token de autenticação do Studio
|
|
67
|
-
O Studio armazena o token em `localStorage` com a chave `marketplace_authorization`:
|
|
68
|
-
```javascript
|
|
69
|
-
var auth = localStorage.getItem('marketplace_authorization');
|
|
70
|
-
// Retorna: "Bearer eyJ..."
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### 2. Gerar GUID para App Secret
|
|
74
|
-
```
|
|
75
|
-
GET https://service2.funifier.com/v3/util/guid/new
|
|
76
|
-
Authorization: Bearer <studio_token>
|
|
77
|
-
```
|
|
78
|
-
Retorna: `{ "guid": "69ab3566607db81962b9686e" }`
|
|
79
|
-
|
|
80
|
-
### 3. Criar/Atualizar Security Document
|
|
81
|
-
```
|
|
82
|
-
PUT https://service2.funifier.com/v3/database/security
|
|
83
|
-
Authorization: Bearer <studio_token>
|
|
84
|
-
Content-Type: application/json
|
|
85
|
-
|
|
86
|
-
{
|
|
87
|
-
"_id": "API_KEY",
|
|
88
|
-
"roles": [...],
|
|
89
|
-
"apps": [...]
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
**⚠️ PUT é upsert** — substitui o documento inteiro. Sempre incluir roles E apps existentes.
|
|
94
|
-
|
|
95
|
-
### 4. Verificar
|
|
96
|
-
```
|
|
97
|
-
GET https://service2.funifier.com/v3/database/security/API_KEY?strict=true
|
|
98
|
-
Authorization: Bearer <studio_token>
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## Navegação no Studio (Browser Automation)
|
|
102
|
-
|
|
103
|
-
1. Abrir `https://my.funifier.com`
|
|
104
|
-
2. Selecionar a gamificação desejada (botão "Select")
|
|
105
|
-
3. Se gamificação nova, clicar "Começar do Zero" para inicializar
|
|
106
|
-
4. Clicar no nome da gamificação na sidebar (link para `/studio/gamification/me`)
|
|
107
|
-
5. Expandir seção "Mais"
|
|
108
|
-
6. Clicar "Change your gamification security settings"
|
|
109
|
-
7. Na página Security: botão "Apps" expande a seção de Apps, botão "Roles" expande Roles
|
|
110
|
-
|
|
111
|
-
**⚠️ SPA Redirect:** Se a gamificação não foi inicializada (wizard "Escolha o melhor caminho"), qualquer navegação para `/studio/security` redireciona para o wizard. Primeiro clicar "Começar do Zero".
|
|
112
|
-
|
|
113
|
-
## Token Basic da Gamificação (público)
|
|
114
|
-
Para acesso público sem App (signup, leitura):
|
|
115
|
-
```
|
|
116
|
-
Basic base64(API_KEY + ":")
|
|
117
|
-
```
|
|
118
|
-
Nota: dois-pontos no final, sem app_secret. Usa a role `public` se existir.
|
|
119
|
-
|
|
120
|
-
## Auth Token (`/v3/auth/token`)
|
|
121
|
-
|
|
122
|
-
### Request (JSON body)
|
|
123
|
-
```json
|
|
124
|
-
{
|
|
125
|
-
"grant_type": "password",
|
|
126
|
-
"apiKey": "API_KEY",
|
|
127
|
-
"username": "player_email",
|
|
128
|
-
"password": "plain_text_password"
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
**⚠️ Campos obrigatórios:**
|
|
133
|
-
- `grant_type` — DEVE ser `"password"` (sem isso, retorna `invalid_grant`)
|
|
134
|
-
- `username` — NÃO `login` (campo frontend pode usar `login` mas API espera `username`)
|
|
135
|
-
- A senha do Player no banco DEVE ser BCrypt hash (`$2a$...`). Senha em texto plano causa `"Invalid salt version"`
|
|
136
|
-
|
|
137
|
-
### Response
|
|
138
|
-
```json
|
|
139
|
-
{
|
|
140
|
-
"access_token": "eyJ...",
|
|
141
|
-
"token_type": "Bearer",
|
|
142
|
-
"expires_in": "1772..."
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### Campos da Security que afetam auth
|
|
147
|
-
| Campo | Tipo | Descrição |
|
|
148
|
-
|-------|------|-----------|
|
|
149
|
-
| `requirePassword` | boolean | Se `true`, valida senha BCrypt. **NÃO** é `passwordRequired` |
|
|
150
|
-
| `createPlayerIfDontExist` | boolean | Se `true`, cria player automaticamente no login. **NÃO** é `autoCreatePlayer` |
|
|
151
|
-
|
|
152
|
-
### ⚠️ Role timeout NUNCA string vazia
|
|
153
|
-
```json
|
|
154
|
-
// ❌ ERRADO — causa NPE no auth (DateUtil.fromKeyword("+") falha)
|
|
155
|
-
{ "name": "player", "scope": "...", "timeout": "" }
|
|
156
|
-
|
|
157
|
-
// ✅ CORRETO — omitir campo para timeout padrão (7 dias)
|
|
158
|
-
{ "name": "player", "scope": "..." }
|
|
159
|
-
|
|
160
|
-
// ✅ CORRETO — valor explícito
|
|
161
|
-
{ "name": "player", "scope": "...", "timeout": "7d" }
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
## Validações e Testes
|
|
165
|
-
- [ ] Role `public` criada com scope `read_all`
|
|
166
|
-
- [ ] Role `player` criada com scope incluindo `database`
|
|
167
|
-
- [ ] App criada com secret gerado
|
|
168
|
-
- [ ] Token Basic do App acessa `/v3/database/collections`
|
|
169
|
-
- [ ] Token Basic público (sem app) acessa endpoints de leitura
|
|
1
|
+
# Security (Segurança)
|
|
2
|
+
|
|
3
|
+
**Acesso Studio:** Gamification Settings → "Mais" → Security → "Change your gamification security settings"
|
|
4
|
+
**Armazenamento:** Coleção `security`, documento com `_id` = API Key da gamificação
|
|
5
|
+
|
|
6
|
+
## Estrutura do Documento
|
|
7
|
+
|
|
8
|
+
```json
|
|
9
|
+
{
|
|
10
|
+
"_id": "API_KEY_DA_GAMIFICACAO",
|
|
11
|
+
"roles": [
|
|
12
|
+
{ "name": "public", "scope": "read_all", "timeout": "" },
|
|
13
|
+
{ "name": "player", "scope": "read_all, write_all, delete_all, database", "timeout": "" }
|
|
14
|
+
],
|
|
15
|
+
"apps": [
|
|
16
|
+
{ "name": "Nome do App", "app_secret": "GUID_GERADO", "scope": "read_all, write_all, delete_all, database" }
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Roles
|
|
22
|
+
|
|
23
|
+
Definem o nível de acesso dos tokens Bearer (jogadores logados) e Basic (acesso público).
|
|
24
|
+
|
|
25
|
+
### Campos
|
|
26
|
+
- `name` — Identificador da role (ex: `public`, `player`, `admin`)
|
|
27
|
+
- `scope` — Permissões separadas por vírgula
|
|
28
|
+
- `timeout` — Tempo de expiração do token (ex: `7d`, `1h`). **⚠️ NÃO usar string vazia `""`** — causa NPE no auth. Omitir o campo ou usar `null` para timeout padrão (7 dias).
|
|
29
|
+
|
|
30
|
+
### Scopes Disponíveis
|
|
31
|
+
| Scope | Descrição |
|
|
32
|
+
|-------|-----------|
|
|
33
|
+
| `read_all` | Leitura em todas as coleções |
|
|
34
|
+
| `write_all` | Escrita em todas as coleções |
|
|
35
|
+
| `delete_all` | Exclusão em todas as coleções |
|
|
36
|
+
| `database` | **Obrigatório** para acessar `/v3/database`. Sem ele, POST retorna 201 mas não persiste |
|
|
37
|
+
|
|
38
|
+
### Roles Comuns
|
|
39
|
+
- **`public`** — `read_all, write_database_signup__c` — Para acesso não autenticado (signup, landing page). Usa token Basic. Precisa de `write_database_signup__c` para o signup pattern funcionar.
|
|
40
|
+
- **`player`** — `read_all, write_all, delete_all, database` — Para usuários logados. Usa token Bearer.
|
|
41
|
+
|
|
42
|
+
### ⚠️ Lição Crítica
|
|
43
|
+
A palavra **`database`** deve estar literalmente no scope para que `/v3/database` funcione. Mesmo com `write_all` e `read_all`, sem `database` as operações falham silenciosamente.
|
|
44
|
+
|
|
45
|
+
## Apps
|
|
46
|
+
|
|
47
|
+
Apps geram tokens Basic não-expirantes para uso em triggers, endpoints públicos e integrações server-side.
|
|
48
|
+
|
|
49
|
+
### Campos
|
|
50
|
+
- `name` — Nome descritivo do app
|
|
51
|
+
- `app_secret` — GUID gerado pelo Funifier (via `/v3/util/guid/new`)
|
|
52
|
+
- `scope` — Permissões (mesmo formato das roles)
|
|
53
|
+
|
|
54
|
+
### Token Basic do App
|
|
55
|
+
```
|
|
56
|
+
Basic base64(API_KEY + ":" + APP_SECRET)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Exemplo:
|
|
60
|
+
```javascript
|
|
61
|
+
var basicToken = 'Basic ' + btoa('69ab1a9a607db81962b92cd2:69ab3566607db81962b9686e');
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Como Criar via API (sem Studio UI)
|
|
65
|
+
|
|
66
|
+
### 1. Obter token de autenticação do Studio
|
|
67
|
+
O Studio armazena o token em `localStorage` com a chave `marketplace_authorization`:
|
|
68
|
+
```javascript
|
|
69
|
+
var auth = localStorage.getItem('marketplace_authorization');
|
|
70
|
+
// Retorna: "Bearer eyJ..."
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 2. Gerar GUID para App Secret
|
|
74
|
+
```
|
|
75
|
+
GET https://service2.funifier.com/v3/util/guid/new
|
|
76
|
+
Authorization: Bearer <studio_token>
|
|
77
|
+
```
|
|
78
|
+
Retorna: `{ "guid": "69ab3566607db81962b9686e" }`
|
|
79
|
+
|
|
80
|
+
### 3. Criar/Atualizar Security Document
|
|
81
|
+
```
|
|
82
|
+
PUT https://service2.funifier.com/v3/database/security
|
|
83
|
+
Authorization: Bearer <studio_token>
|
|
84
|
+
Content-Type: application/json
|
|
85
|
+
|
|
86
|
+
{
|
|
87
|
+
"_id": "API_KEY",
|
|
88
|
+
"roles": [...],
|
|
89
|
+
"apps": [...]
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**⚠️ PUT é upsert** — substitui o documento inteiro. Sempre incluir roles E apps existentes.
|
|
94
|
+
|
|
95
|
+
### 4. Verificar
|
|
96
|
+
```
|
|
97
|
+
GET https://service2.funifier.com/v3/database/security/API_KEY?strict=true
|
|
98
|
+
Authorization: Bearer <studio_token>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Navegação no Studio (Browser Automation)
|
|
102
|
+
|
|
103
|
+
1. Abrir `https://my.funifier.com`
|
|
104
|
+
2. Selecionar a gamificação desejada (botão "Select")
|
|
105
|
+
3. Se gamificação nova, clicar "Começar do Zero" para inicializar
|
|
106
|
+
4. Clicar no nome da gamificação na sidebar (link para `/studio/gamification/me`)
|
|
107
|
+
5. Expandir seção "Mais"
|
|
108
|
+
6. Clicar "Change your gamification security settings"
|
|
109
|
+
7. Na página Security: botão "Apps" expande a seção de Apps, botão "Roles" expande Roles
|
|
110
|
+
|
|
111
|
+
**⚠️ SPA Redirect:** Se a gamificação não foi inicializada (wizard "Escolha o melhor caminho"), qualquer navegação para `/studio/security` redireciona para o wizard. Primeiro clicar "Começar do Zero".
|
|
112
|
+
|
|
113
|
+
## Token Basic da Gamificação (público)
|
|
114
|
+
Para acesso público sem App (signup, leitura):
|
|
115
|
+
```
|
|
116
|
+
Basic base64(API_KEY + ":")
|
|
117
|
+
```
|
|
118
|
+
Nota: dois-pontos no final, sem app_secret. Usa a role `public` se existir.
|
|
119
|
+
|
|
120
|
+
## Auth Token (`/v3/auth/token`)
|
|
121
|
+
|
|
122
|
+
### Request (JSON body)
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"grant_type": "password",
|
|
126
|
+
"apiKey": "API_KEY",
|
|
127
|
+
"username": "player_email",
|
|
128
|
+
"password": "plain_text_password"
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**⚠️ Campos obrigatórios:**
|
|
133
|
+
- `grant_type` — DEVE ser `"password"` (sem isso, retorna `invalid_grant`)
|
|
134
|
+
- `username` — NÃO `login` (campo frontend pode usar `login` mas API espera `username`)
|
|
135
|
+
- A senha do Player no banco DEVE ser BCrypt hash (`$2a$...`). Senha em texto plano causa `"Invalid salt version"`
|
|
136
|
+
|
|
137
|
+
### Response
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"access_token": "eyJ...",
|
|
141
|
+
"token_type": "Bearer",
|
|
142
|
+
"expires_in": "1772..."
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Campos da Security que afetam auth
|
|
147
|
+
| Campo | Tipo | Descrição |
|
|
148
|
+
|-------|------|-----------|
|
|
149
|
+
| `requirePassword` | boolean | Se `true`, valida senha BCrypt. **NÃO** é `passwordRequired` |
|
|
150
|
+
| `createPlayerIfDontExist` | boolean | Se `true`, cria player automaticamente no login. **NÃO** é `autoCreatePlayer` |
|
|
151
|
+
|
|
152
|
+
### ⚠️ Role timeout NUNCA string vazia
|
|
153
|
+
```json
|
|
154
|
+
// ❌ ERRADO — causa NPE no auth (DateUtil.fromKeyword("+") falha)
|
|
155
|
+
{ "name": "player", "scope": "...", "timeout": "" }
|
|
156
|
+
|
|
157
|
+
// ✅ CORRETO — omitir campo para timeout padrão (7 dias)
|
|
158
|
+
{ "name": "player", "scope": "..." }
|
|
159
|
+
|
|
160
|
+
// ✅ CORRETO — valor explícito
|
|
161
|
+
{ "name": "player", "scope": "...", "timeout": "7d" }
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Validações e Testes
|
|
165
|
+
- [ ] Role `public` criada com scope `read_all`
|
|
166
|
+
- [ ] Role `player` criada com scope incluindo `database`
|
|
167
|
+
- [ ] App criada com secret gerado
|
|
168
|
+
- [ ] Token Basic do App acessa `/v3/database/collections`
|
|
169
|
+
- [ ] Token Basic público (sem app) acessa endpoints de leitura
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
# Staging (Staging)
|
|
2
|
-
|
|
3
|
-
**Acesso Studio:** `/studio/integration/staging`
|
|
4
|
-
|
|
5
|
-
## O que é
|
|
6
|
-
|
|
7
|
-
Gerenciamento de ambientes de homologação e produção, com clonagem e migração de dados. Permite criar e gerenciar ambientes de homologação (staging) separados do ambiente de produção. Possibilita clonar o ambiente produtivo para testes e migrar dados entre servidores.
|
|
8
|
-
|
|
9
|
-
## Quando usar
|
|
10
|
-
|
|
11
|
-
- Para testar novas funcionalidades sem impactar produção
|
|
12
|
-
- Para validar atualizações antes do go-live
|
|
13
|
-
- Para migrar dados entre servidores de diferentes regiões
|
|
14
|
-
- Para criar ambientes espelho de produção
|
|
15
|
-
|
|
16
|
-
## Checklist de Configuração no Studio
|
|
17
|
-
|
|
18
|
-
- [ ] Criar ambiente de staging
|
|
19
|
-
- [ ] Clonar dados de produção para staging
|
|
20
|
-
- [ ] Testar novas funcionalidades em staging
|
|
21
|
-
- [ ] Migrar alterações aprovadas para produção
|
|
22
|
-
|
|
23
|
-
## Validações e Testes
|
|
24
|
-
|
|
25
|
-
- [ ] Ambiente de staging é criado corretamente
|
|
26
|
-
- [ ] Dados são clonados sem perda
|
|
27
|
-
- [ ] Alterações em staging não afetam produção
|
|
28
|
-
- [ ] Migração para produção funciona
|
|
1
|
+
# Staging (Staging)
|
|
2
|
+
|
|
3
|
+
**Acesso Studio:** `/studio/integration/staging`
|
|
4
|
+
|
|
5
|
+
## O que é
|
|
6
|
+
|
|
7
|
+
Gerenciamento de ambientes de homologação e produção, com clonagem e migração de dados. Permite criar e gerenciar ambientes de homologação (staging) separados do ambiente de produção. Possibilita clonar o ambiente produtivo para testes e migrar dados entre servidores.
|
|
8
|
+
|
|
9
|
+
## Quando usar
|
|
10
|
+
|
|
11
|
+
- Para testar novas funcionalidades sem impactar produção
|
|
12
|
+
- Para validar atualizações antes do go-live
|
|
13
|
+
- Para migrar dados entre servidores de diferentes regiões
|
|
14
|
+
- Para criar ambientes espelho de produção
|
|
15
|
+
|
|
16
|
+
## Checklist de Configuração no Studio
|
|
17
|
+
|
|
18
|
+
- [ ] Criar ambiente de staging
|
|
19
|
+
- [ ] Clonar dados de produção para staging
|
|
20
|
+
- [ ] Testar novas funcionalidades em staging
|
|
21
|
+
- [ ] Migrar alterações aprovadas para produção
|
|
22
|
+
|
|
23
|
+
## Validações e Testes
|
|
24
|
+
|
|
25
|
+
- [ ] Ambiente de staging é criado corretamente
|
|
26
|
+
- [ ] Dados são clonados sem perda
|
|
27
|
+
- [ ] Alterações em staging não afetam produção
|
|
28
|
+
- [ ] Migração para produção funciona
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
# Static Repo (Repositório Estático)
|
|
2
|
-
|
|
3
|
-
**Acesso Studio:** `/studio/static`
|
|
4
|
-
**API Endpoint:** `/v3/static`
|
|
5
|
-
|
|
6
|
-
## O que é
|
|
7
|
-
|
|
8
|
-
Hospedagem de interfaces e conteúdos estáticos em subdomínios Funifier. Permite criar repositórios públicos nos servidores da Funifier para hospedar interfaces gráficas customizadas. Os conteúdos podem ser enviados manualmente, sincronizados via Git ou upload de arquivos.
|
|
9
|
-
|
|
10
|
-
## Quando usar
|
|
11
|
-
|
|
12
|
-
- Para hospedar interface exclusiva da gamificação
|
|
13
|
-
- Para criar páginas personalizadas em subdomínio (ex: seugame.funifier.app)
|
|
14
|
-
- Para deploy de frontends customizados
|
|
15
|
-
|
|
16
|
-
## Checklist de Configuração no Studio
|
|
17
|
-
|
|
18
|
-
- [ ] Criar repositório estático
|
|
19
|
-
- [ ] Fazer upload dos arquivos (HTML, CSS, JS)
|
|
20
|
-
- [ ] Configurar subdomínio
|
|
21
|
-
- [ ] Testar acesso público
|
|
22
|
-
|
|
23
|
-
## API Endpoints
|
|
24
|
-
|
|
25
|
-
### Listar Repositórios
|
|
26
|
-
**Método:** GET
|
|
27
|
-
**Endpoint:** `/v3/static`
|
|
28
|
-
|
|
29
|
-
### Criar Repositório
|
|
30
|
-
**Método:** POST
|
|
31
|
-
**Endpoint:** `/v3/static`
|
|
32
|
-
|
|
33
|
-
### Deletar Repositório
|
|
34
|
-
**Método:** DELETE
|
|
35
|
-
**Endpoint:** `/v3/static/:id`
|
|
36
|
-
|
|
37
|
-
## Validações e Testes
|
|
38
|
-
|
|
39
|
-
- [ ] Repositório é criado com sucesso
|
|
40
|
-
- [ ] Arquivos são acessíveis via URL pública
|
|
41
|
-
- [ ] Subdomínio funciona corretamente
|
|
1
|
+
# Static Repo (Repositório Estático)
|
|
2
|
+
|
|
3
|
+
**Acesso Studio:** `/studio/static`
|
|
4
|
+
**API Endpoint:** `/v3/static`
|
|
5
|
+
|
|
6
|
+
## O que é
|
|
7
|
+
|
|
8
|
+
Hospedagem de interfaces e conteúdos estáticos em subdomínios Funifier. Permite criar repositórios públicos nos servidores da Funifier para hospedar interfaces gráficas customizadas. Os conteúdos podem ser enviados manualmente, sincronizados via Git ou upload de arquivos.
|
|
9
|
+
|
|
10
|
+
## Quando usar
|
|
11
|
+
|
|
12
|
+
- Para hospedar interface exclusiva da gamificação
|
|
13
|
+
- Para criar páginas personalizadas em subdomínio (ex: seugame.funifier.app)
|
|
14
|
+
- Para deploy de frontends customizados
|
|
15
|
+
|
|
16
|
+
## Checklist de Configuração no Studio
|
|
17
|
+
|
|
18
|
+
- [ ] Criar repositório estático
|
|
19
|
+
- [ ] Fazer upload dos arquivos (HTML, CSS, JS)
|
|
20
|
+
- [ ] Configurar subdomínio
|
|
21
|
+
- [ ] Testar acesso público
|
|
22
|
+
|
|
23
|
+
## API Endpoints
|
|
24
|
+
|
|
25
|
+
### Listar Repositórios
|
|
26
|
+
**Método:** GET
|
|
27
|
+
**Endpoint:** `/v3/static`
|
|
28
|
+
|
|
29
|
+
### Criar Repositório
|
|
30
|
+
**Método:** POST
|
|
31
|
+
**Endpoint:** `/v3/static`
|
|
32
|
+
|
|
33
|
+
### Deletar Repositório
|
|
34
|
+
**Método:** DELETE
|
|
35
|
+
**Endpoint:** `/v3/static/:id`
|
|
36
|
+
|
|
37
|
+
## Validações e Testes
|
|
38
|
+
|
|
39
|
+
- [ ] Repositório é criado com sucesso
|
|
40
|
+
- [ ] Arquivos são acessíveis via URL pública
|
|
41
|
+
- [ ] Subdomínio funciona corretamente
|