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,271 @@
|
|
|
1
|
+
# Triggers Funifier
|
|
2
|
+
|
|
3
|
+
Triggers são códigos JAVA executados dentro do FUNIFIER ENGINE quando um evento específico acontece na gamificação. Oferecem flexibilidade para manipular informações em tempo real, permitindo mudar o comportamento padrão das técnicas de jogos e funcionalidades da plataforma.
|
|
4
|
+
|
|
5
|
+
**Acesso Studio:** `/studio/trigger`
|
|
6
|
+
**API Endpoint:** `/v3/trigger`
|
|
7
|
+
|
|
8
|
+
## Configuração de uma Trigger
|
|
9
|
+
|
|
10
|
+
Uma trigger é composta de três informações essenciais:
|
|
11
|
+
1. **Evento** (`event`): quando a trigger deve ser executada
|
|
12
|
+
2. **Entidade** (`entity`): que tipo de objeto está vinculado ao evento
|
|
13
|
+
3. **Script** (`script`): código Java a ser executado
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"name": "Make the player's name uppercase",
|
|
18
|
+
"_id": "DTv7uHc",
|
|
19
|
+
"description": "Before creating the player, change the letters of the name to uppercase",
|
|
20
|
+
"entity": "player",
|
|
21
|
+
"event": "before_create",
|
|
22
|
+
"script": "void trigger(event, entity, player, database){ entity.name = entity.name.toUpperCase(); }"
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Eventos e Entidades
|
|
27
|
+
|
|
28
|
+
### Eventos
|
|
29
|
+
|
|
30
|
+
| Evento | Quando é acionado |
|
|
31
|
+
|--------|-------------------|
|
|
32
|
+
| `before_create` | Antes de criar no banco |
|
|
33
|
+
| `after_create` | Depois de criar no banco |
|
|
34
|
+
| `before_update` | Antes de atualizar |
|
|
35
|
+
| `after_delete` | Depois de deletar |
|
|
36
|
+
| `before_win` | Antes de conquistar |
|
|
37
|
+
| `after_win` | Depois de conquistar |
|
|
38
|
+
|
|
39
|
+
### Combinações Comuns
|
|
40
|
+
|
|
41
|
+
| Evento | Entidade | Quando é acionado | Tipo do entity |
|
|
42
|
+
|--------|----------|-------------------|----------------|
|
|
43
|
+
| `before_create` | `player` | Antes de cadastrar jogador | Player |
|
|
44
|
+
| `after_create` | `player` | Depois de cadastrar jogador | Player |
|
|
45
|
+
| `before_update` | `player` | Antes de alterar jogador | Player |
|
|
46
|
+
| `after_delete` | `player` | Depois de remover jogador | Player |
|
|
47
|
+
| `after_create` | `challenge` | Depois de criar desafio | Challenge |
|
|
48
|
+
| `after_win` | `challenge` | Depois de completar desafio | Achievement |
|
|
49
|
+
| `before_create` | `action` | Antes de criar ação | Action |
|
|
50
|
+
| `before_win` | `action` | Antes de registrar action log | ActionLog |
|
|
51
|
+
| `after_win` | `level` | Depois de subir de nível | Achievement |
|
|
52
|
+
| `after_win` | `catalog_item` | Depois de comprar item | Achievement |
|
|
53
|
+
| `after_win` | `lottery` | Depois de ser sorteado | Achievement |
|
|
54
|
+
| `after_win` | `mystery_box` | Depois de ganhar prêmio surpresa | Achievement |
|
|
55
|
+
| `after_win` | `competition` | Depois de vencer competição | Achievement |
|
|
56
|
+
| `after_create` | `question_log` | Depois de responder pergunta | QuestionLog |
|
|
57
|
+
| `before_create` | `achievement` | Antes de registrar recompensa | Achievement |
|
|
58
|
+
| `before_create` | `<custom>__c` | Antes de criar objeto customizado | HashMap |
|
|
59
|
+
|
|
60
|
+
## Parâmetros do Script
|
|
61
|
+
|
|
62
|
+
```java
|
|
63
|
+
void trigger(event, entity, player, database) {
|
|
64
|
+
// event: String com o evento (ex: "before_create")
|
|
65
|
+
// entity: Objeto sendo manipulado (Player, ActionLog, Achievement, etc.)
|
|
66
|
+
// player: String com o ID do jogador
|
|
67
|
+
// database: Objeto para acessar o banco de dados
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Tipos de Objetos (entity)
|
|
72
|
+
|
|
73
|
+
### Player
|
|
74
|
+
```json
|
|
75
|
+
{"_id": "john", "name": "John Travolta", "email": "john@funifier.com", "image": {"small": {"url": "..."}, "medium": {"url": "..."}, "original": {"url": "..."}}, "teams": ["sales"], "extra": {"country": "USA", "department": "IT"}}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### ActionLog
|
|
79
|
+
```json
|
|
80
|
+
{"_id": "64a5d92", "actionId": "sell", "userId": "john", "time": {"$date": "2023-07-05T20:57:33.303Z"}, "attributes": {"product": "book", "price": 120}}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Achievement
|
|
84
|
+
```json
|
|
85
|
+
{"_id": "64a5d2", "player": "john", "total": 25.0, "type": 0, "item": "xp", "time": {"$date": "2023-07-05T20:57:33.303Z"}}
|
|
86
|
+
```
|
|
87
|
+
Tipos: `TYPE_POINT=0`, `TYPE_CHALLENGE=1`, `TYPE_VIRTUAL_GOOD=2`, `TYPE_LEVEL=3`
|
|
88
|
+
|
|
89
|
+
### Challenge
|
|
90
|
+
```json
|
|
91
|
+
{"challenge": "Watch Video", "active": true, "_id": "DTo8dS3", "rules": [{"actionId": "watch_video", "operator": 5, "total": 0}], "points": [{"total": 10.0, "category": "xp", "operation": 0}]}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Action
|
|
95
|
+
```json
|
|
96
|
+
{"_id": "sell", "action": "Sell", "attributes": [{"name": "product", "type": "String"}, {"name": "price", "type": "Number"}], "active": true}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Managers Disponíveis
|
|
100
|
+
|
|
101
|
+
### PlayerManager
|
|
102
|
+
```java
|
|
103
|
+
Player p = manager.getPlayerManager().findById("john");
|
|
104
|
+
manager.getPlayerManager().insert(player);
|
|
105
|
+
manager.getPlayerManager().delete("john");
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### ActionManager
|
|
109
|
+
```java
|
|
110
|
+
Action a = manager.getActionManager().findActionById("sell");
|
|
111
|
+
manager.getActionManager().track(actionLog);
|
|
112
|
+
List<Achievement> results = manager.getActionManager().trackSynchronous(actionLog);
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### CatalogManager
|
|
116
|
+
```java
|
|
117
|
+
CatalogItem item = manager.getCatalogManager().findItemById("DTj7lVn");
|
|
118
|
+
manager.getCatalogManager().purchase(achievement, true);
|
|
119
|
+
manager.getCatalogManager().undoPurchase("id");
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### LotteryManager
|
|
123
|
+
```java
|
|
124
|
+
Lottery l = manager.getLotteryManager().find("DTj0x5z");
|
|
125
|
+
manager.getLotteryManager().insertTicket(ticket);
|
|
126
|
+
manager.getLotteryManager().execute("DTj0x5z");
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### AchievementManager
|
|
130
|
+
```java
|
|
131
|
+
Achievement a = new Achievement();
|
|
132
|
+
a.player = "john"; a.total = 10; a.type = 0; a.item = "xp";
|
|
133
|
+
a.time = new Date(); a._id = Guid.newShortGuid();
|
|
134
|
+
manager.getAchievementManager().addAchievement(a);
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Acesso ao Banco de Dados (Jongo)
|
|
138
|
+
```java
|
|
139
|
+
// Salvar
|
|
140
|
+
manager.getJongoConnection().getCollection("email__c").save(payload);
|
|
141
|
+
|
|
142
|
+
// Buscar
|
|
143
|
+
Object result = manager.getJongoConnection().getCollection("player").findOne("{_id: 'john'}").as(Object.class);
|
|
144
|
+
|
|
145
|
+
// Deletar
|
|
146
|
+
manager.getJongoConnection().getCollection("car__c").remove("{_id: 'car001'}");
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Exemplos de Código
|
|
150
|
+
|
|
151
|
+
### Exemplo 1: Duplicar pontos para jogadores de TI
|
|
152
|
+
|
|
153
|
+
```java
|
|
154
|
+
/* "event": "before_create", "entity": "achievement" */
|
|
155
|
+
void trigger(event, entity, player, database) {
|
|
156
|
+
if(entity.type == Achievement.TYPE_POINT) {
|
|
157
|
+
Player currentPlayer = manager.getPlayerManager().findById(player);
|
|
158
|
+
if("IT".equals(currentPlayer.extra.department)) {
|
|
159
|
+
entity.total = entity.total * 2;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Exemplo 2: Dar ponto para todos os amigos
|
|
166
|
+
|
|
167
|
+
```java
|
|
168
|
+
/* "event": "before_create", "entity": "achievement" */
|
|
169
|
+
void trigger(event, entity, player, database) {
|
|
170
|
+
if(entity.type == Achievement.TYPE_POINT && entity.total >= 100) {
|
|
171
|
+
Player p = manager.getPlayerManager().findById(player);
|
|
172
|
+
for(String friend : p.friends) {
|
|
173
|
+
Achievement a = new Achievement();
|
|
174
|
+
a.player = friend; a.total = 1; a.type = 0;
|
|
175
|
+
a.item = entity.item; a.time = new Date();
|
|
176
|
+
a._id = Guid.newShortGuid();
|
|
177
|
+
manager.getAchievementManager().addAchievement(a);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Exemplo 3: Enviar email de boas-vindas
|
|
184
|
+
|
|
185
|
+
```java
|
|
186
|
+
/* "event": "after_create", "entity": "player" */
|
|
187
|
+
void trigger(event, entity, player, database) {
|
|
188
|
+
long total = manager.getPlayerManager().findTotal();
|
|
189
|
+
Email email = EmailBuilder
|
|
190
|
+
.startingBlank()
|
|
191
|
+
.from("Company", "your@company.com")
|
|
192
|
+
.to(entity.getName(), entity.email)
|
|
193
|
+
.withSubject("Welcome!")
|
|
194
|
+
.withPlainText("Welcome " + entity.name + ", you are member number " + total)
|
|
195
|
+
.buildEmail();
|
|
196
|
+
MailerBuilder.withSMTPServer("host", 587, "login", "password")
|
|
197
|
+
.buildMailer().sendMail(email);
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Exemplo 4: Requisição HTTP com Unirest
|
|
202
|
+
|
|
203
|
+
```java
|
|
204
|
+
/* "event": "after_win", "entity": "catalog_item" */
|
|
205
|
+
void trigger(event, entity, player, database) {
|
|
206
|
+
Player buyer = manager.getPlayerManager().findById(entity.player);
|
|
207
|
+
CatalogItem item = manager.getCatalogManager().findItemById(entity.item);
|
|
208
|
+
HashMap zap = new HashMap();
|
|
209
|
+
zap.put("purchase", entity);
|
|
210
|
+
zap.put("buyer", buyer);
|
|
211
|
+
zap.put("item", item);
|
|
212
|
+
HttpResponse<String> response = Unirest.post("https://hooks.zapier.com/hooks/catch/80/b6/")
|
|
213
|
+
.header("Content-Type", "application/json")
|
|
214
|
+
.body(JsonUtil.toJson(zap))
|
|
215
|
+
.asString();
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Exemplo 5: Criar código de convite
|
|
220
|
+
|
|
221
|
+
```java
|
|
222
|
+
/* "event": "before_create", "entity": "player" */
|
|
223
|
+
void trigger(event, entity, player, database) {
|
|
224
|
+
String code = Guid.shortTimeMillis();
|
|
225
|
+
entity.extra.put("code", code);
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Exemplo 6: Consultar objeto no banco
|
|
230
|
+
|
|
231
|
+
```java
|
|
232
|
+
/* "event": "before_win", "entity": "action" */
|
|
233
|
+
void trigger(event, entity, player, database) {
|
|
234
|
+
String id = entity.attributes.product;
|
|
235
|
+
Object product = database.getCollection("product__c").findOne("{_id:#}", id).as(Object.class);
|
|
236
|
+
entity.attributes.put("price", product.price);
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Exemplo 7: Executar aggregate no banco
|
|
241
|
+
|
|
242
|
+
```java
|
|
243
|
+
/* "event": "before_win", "entity": "action" */
|
|
244
|
+
void trigger(event, entity, player, database) {
|
|
245
|
+
org.jongo.MongoCollection collection = database.getCollection("achievement");
|
|
246
|
+
List<Object> highest = Arrays.asList(
|
|
247
|
+
collection.aggregate("{\"$match\": {\"type\": 0, \"item\": \"xp\"}}")
|
|
248
|
+
.and("{\"$group\": {\"_id\": \"$player\", \"total\": {\"$sum\": \"$total\"}}}")
|
|
249
|
+
.and("{\"$sort\": {\"total\": -1}}")
|
|
250
|
+
.and("{\"$limit\":1}")
|
|
251
|
+
.as(Object.class));
|
|
252
|
+
if(highest != null && highest.size() > 0) {
|
|
253
|
+
Object highestPointsPlayer = highest.get(0);
|
|
254
|
+
entity.attributes.put("highest", highestPointsPlayer.total);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Bibliotecas Disponíveis
|
|
260
|
+
|
|
261
|
+
- **org.simplejavamail** - Envio de emails
|
|
262
|
+
- **com.mashape.unirest** - Requisições HTTP
|
|
263
|
+
- **org.jongo** - Acesso ao MongoDB
|
|
264
|
+
- **JsonUtil** - Conversão JSON
|
|
265
|
+
- **Guid** - Geração de IDs únicos
|
|
266
|
+
- **DateUtil** - Cálculos e expressões de data
|
|
267
|
+
|
|
268
|
+
> **Referência completa:** Para detalhes de todos os managers, entidades e bibliotecas disponíveis em Java, consulte:
|
|
269
|
+
> - `guides/java-managers.md` — Todos os managers e seus métodos
|
|
270
|
+
> - `guides/java-entities.md` — Entidades, campos e coleções MongoDB
|
|
271
|
+
> - `guides/java-libraries.md` — JsonUtil, Guid, DateUtil, Unirest, EmailBuilder, Jongo
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Funifier Knowledge Base — Index
|
|
2
|
+
|
|
3
|
+
Este ficheiro serve como **router** para localizar o módulo ou guia correto na base de conhecimento Funifier. Cada entrada indica o ficheiro, uma descrição curta e quando usar.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Recursos Fundacionais da Plataforma
|
|
8
|
+
|
|
9
|
+
A Funifier funciona como um **backend de aplicações**. Independentemente do tipo de projeto (gamificação, app, portal, integração), os módulos abaixo são os recursos base disponíveis para construir qualquer aplicação:
|
|
10
|
+
|
|
11
|
+
| Recurso | Ficheiro | Para que serve |
|
|
12
|
+
|---------|----------|----------------|
|
|
13
|
+
| **Auth** | `modules/auth.md` | Login de jogadores, geração de tokens JWT, autenticação via API |
|
|
14
|
+
| **Player** | `modules/player.md` | Cadastro e gestão de utilizadores da aplicação |
|
|
15
|
+
| **Database** | `modules/database.md` | CRUD em qualquer coleção, queries MongoDB, aggregates |
|
|
16
|
+
| **Custom Object** | `modules/custom-object.md` | Criar tabelas/coleções próprias (sufixo `__c`) para dados de negócio |
|
|
17
|
+
| **Upload** | `modules/upload.md` | Upload de imagens e ficheiros (avatar, documentos, etc.) |
|
|
18
|
+
| **Trigger** | `modules/trigger.md` | Escrever funções Java que executam no servidor quando eventos acontecem |
|
|
19
|
+
| **Scheduler** | `modules/scheduler.md` | Agendar tarefas automáticas (cron jobs, rotinas periódicas) |
|
|
20
|
+
| **Public Endpoint** | `modules/public.md` | Criar APIs REST customizadas acessíveis sem autenticação |
|
|
21
|
+
| **Webhook** | `modules/webhook.md` | Enviar dados para sistemas externos quando eventos acontecem |
|
|
22
|
+
| **Patterns** | `modules/patterns.md` | Design patterns de implementação (signup, etc.) baseados em experiência real |
|
|
23
|
+
|
|
24
|
+
> **Nota para o agente:** Estes recursos estão sempre disponíveis. Ao planear qualquer funcionalidade, considere-os como ferramentas que pode combinar livremente — não são exclusivos de gamificação.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Módulos Essenciais (Core)
|
|
29
|
+
|
|
30
|
+
| Módulo | Ficheiro | Descrição | Quando usar |
|
|
31
|
+
|--------|----------|-----------|-------------|
|
|
32
|
+
| Player | `modules/player.md` | Cadastro e gestão de jogadores | Criar, listar, atualizar ou remover jogadores; gerir campos extra e imagens |
|
|
33
|
+
| Action | `modules/action.md` | Definição de tipos de ações | Criar ações que os jogadores podem executar (ex: vender, assistir vídeo) |
|
|
34
|
+
| Action Log | `modules/action-log.md` | Registro de ações executadas | Registrar (track) que um jogador executou uma ação; consultar histórico |
|
|
35
|
+
| Point | `modules/point.md` | Categorias de pontos | Criar moedas/pontos (XP, coins, estrelas); configurar tipos de pontuação |
|
|
36
|
+
| Achievement | `modules/achievement.md` | Conquistas e recompensas | Consultar pontos ganhos, desafios completados, itens comprados; entender a estrutura de recompensas |
|
|
37
|
+
| Challenge | `modules/challenge.md` | Desafios e missões | Criar desafios com regras de ação e recompensas automáticas |
|
|
38
|
+
| Level | `modules/level.md` | Níveis de progressão | Configurar sistema de níveis baseado em pontos acumulados |
|
|
39
|
+
| Leaderboard | `modules/leaderboard.md` | Rankings e classificações | Criar rankings por pontos, ações ou atributos; rankings por período |
|
|
40
|
+
| Team | `modules/team.md` | Equipes e grupos | Organizar jogadores em equipes; rankings por equipe |
|
|
41
|
+
| Virtual Good | `modules/virtual-good.md` | Loja virtual e catálogo | Criar itens para compra com pontos; gerir catálogo e compras |
|
|
42
|
+
|
|
43
|
+
## Módulos de Engajamento
|
|
44
|
+
|
|
45
|
+
| Módulo | Ficheiro | Descrição | Quando usar |
|
|
46
|
+
|--------|----------|-----------|-------------|
|
|
47
|
+
| Lottery | `modules/lottery.md` | Sorteios e rifas | Criar sorteios com tickets; executar sorteios automáticos ou manuais |
|
|
48
|
+
| Competition | `modules/competition.md` | Competições entre jogadores | Criar competições temporárias com rankings e prémios para os melhores |
|
|
49
|
+
| Mystery Box | `modules/mystery.md` | Caixas surpresa | Configurar prémios aleatórios com probabilidades definidas |
|
|
50
|
+
| Swap | `modules/swap.md` | Troca entre jogadores | Permitir que jogadores troquem itens ou pontos entre si |
|
|
51
|
+
| Question | `modules/question.md` | Perguntas e respostas | Criar perguntas com alternativas; registrar respostas dos jogadores |
|
|
52
|
+
| Quiz | `modules/quiz.md` | Questionários completos | Montar questionários agrupando múltiplas perguntas; avaliar desempenho |
|
|
53
|
+
| Crossword | `modules/crossword.md` | Palavras cruzadas | Criar jogos de palavras cruzadas como mecânica de engajamento |
|
|
54
|
+
| Story | `modules/story.md` | Narrativas e storytelling | Criar histórias interativas com cenas e escolhas do jogador |
|
|
55
|
+
| Avatar | `modules/avatar.md` | Avatares personalizáveis | Permitir que jogadores personalizem avatares com itens desbloqueáveis |
|
|
56
|
+
| Last Mile | `modules/lastmile.md` | Incentivo à conclusão | Criar mecânicas que incentivam jogadores a completar tarefas pendentes |
|
|
57
|
+
|
|
58
|
+
## Módulos Técnicos e Infraestrutura
|
|
59
|
+
|
|
60
|
+
| Módulo | Ficheiro | Descrição | Quando usar |
|
|
61
|
+
|--------|----------|-----------|-------------|
|
|
62
|
+
| Trigger | `modules/trigger.md` | Código Java em eventos | Executar lógica customizada quando eventos acontecem (before/after create, win, etc.) |
|
|
63
|
+
| Scheduler | `modules/scheduler.md` | Tarefas agendadas | Executar código Java em intervalos regulares (cron jobs) |
|
|
64
|
+
| Webhook | `modules/webhook.md` | Notificações HTTP externas | Enviar dados para sistemas externos quando eventos acontecem na gamificação |
|
|
65
|
+
| Notification | `modules/notification.md` | Notificações push e in-app | Enviar notificações para jogadores via push, email ou in-app |
|
|
66
|
+
| WebSocket | `modules/websocket.md` | Comunicação em tempo real | Receber atualizações em tempo real no frontend via WebSocket |
|
|
67
|
+
| Public Endpoint | `modules/public.md` | APIs públicas customizadas | Criar endpoints REST customizados sem autenticação (para integrações) |
|
|
68
|
+
| Widget | `modules/widget.md` | Componentes visuais embeddáveis | Incorporar leaderboards, perfis e outros componentes em páginas externas |
|
|
69
|
+
| Studio Page | `modules/studio-page.md` | Páginas customizadas no Studio | Criar páginas HTML/JS dentro do painel administrativo |
|
|
70
|
+
| KPI Formulas | `modules/kpi-formulas.md` | Fórmulas e indicadores | Criar campos calculados e KPIs derivados de dados da gamificação |
|
|
71
|
+
|
|
72
|
+
## Módulos de Dados e Armazenamento
|
|
73
|
+
|
|
74
|
+
| Módulo | Ficheiro | Descrição | Quando usar |
|
|
75
|
+
|--------|----------|-----------|-------------|
|
|
76
|
+
| Database | `modules/database.md` | Acesso direto ao MongoDB | Operações CRUD em coleções; executar aggregates via API |
|
|
77
|
+
| Custom Object | `modules/custom-object.md` | Coleções customizadas (`__c`) | Criar coleções de dados próprias (ex: `car__c`, `email__c`) |
|
|
78
|
+
| CSV Data | `modules/csv-data.md` | Importação/exportação CSV | Importar jogadores ou dados em massa via CSV; exportar relatórios |
|
|
79
|
+
| Upload | `modules/upload.md` | Upload de ficheiros | Fazer upload de imagens e ficheiros para o repositório Funifier |
|
|
80
|
+
| Static Repo | `modules/static-repo.md` | Repositório de ficheiros estáticos | Hospedar ficheiros estáticos (HTML, CSS, JS, imagens) na plataforma |
|
|
81
|
+
|
|
82
|
+
## Módulos de Administração
|
|
83
|
+
|
|
84
|
+
| Módulo | Ficheiro | Descrição | Quando usar |
|
|
85
|
+
|--------|----------|-----------|-------------|
|
|
86
|
+
| Auth | `modules/auth.md` | Autenticação e tokens | Gerar tokens de acesso; configurar API keys; autenticação OAuth |
|
|
87
|
+
| Folder | `modules/folder.md` | Organização em pastas | Organizar módulos (ações, desafios, etc.) em pastas no Studio |
|
|
88
|
+
| Backup | `modules/backup.md` | Backup e restauração | Criar backups da gamificação; restaurar configurações |
|
|
89
|
+
| Compact | `modules/compact.md` | Compactação de dados | Compactar dados históricos para otimizar performance |
|
|
90
|
+
| Staging | `modules/staging.md` | Ambiente de homologação | Testar configurações em ambiente separado antes de produção |
|
|
91
|
+
| Marketplace | `modules/marketplace.md` | Templates de gamificação | Importar templates prontos do marketplace Funifier |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Guias Transversais
|
|
96
|
+
|
|
97
|
+
| Guia | Ficheiro | Descrição | Quando usar |
|
|
98
|
+
|------|----------|-----------|-------------|
|
|
99
|
+
| Aggregates | `guides/aggregates.md` | Consultas avançadas MongoDB | Criar relatórios, dashboards, rankings customizados; usar expressões de data Funifier |
|
|
100
|
+
| Triggers | `guides/triggers-guide.md` | Guia completo de triggers | Referência de eventos, entidades, managers e exemplos de código Java |
|
|
101
|
+
| Database Access | `guides/database-access.md` | Acesso ao banco de dados | Referência de acesso via API REST e via código Java (Jongo) |
|
|
102
|
+
| Java Managers | `guides/java-managers.md` | Referência de managers Java | Métodos disponíveis em cada manager (PlayerManager, ActionManager, etc.) para uso em triggers, schedulers e public endpoints |
|
|
103
|
+
| Java Entities | `guides/java-entities.md` | Referência de entidades Java | Campos e tipos dos objetos (Player, Achievement, ActionLog, etc.) e mapeamento para coleções MongoDB |
|
|
104
|
+
| Java Libraries | `guides/java-libraries.md` | Bibliotecas e utilitários Java | JsonUtil, Guid, DateUtil, Unirest, EmailBuilder, Jongo — métodos e exemplos de uso |
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Como usar este index
|
|
109
|
+
|
|
110
|
+
1. **Identifique a necessidade** do utilizador (ex: "quero criar um ranking")
|
|
111
|
+
2. **Localize o módulo** na tabela acima (ex: Leaderboard)
|
|
112
|
+
3. **Carregue o ficheiro** correspondente (ex: `modules/leaderboard.md`)
|
|
113
|
+
4. **Siga o checklist** de configuração e use os exemplos de API
|
|
114
|
+
|
|
115
|
+
Para consultas que envolvem **múltiplos módulos**, carregue cada ficheiro individualmente conforme necessário.
|
|
116
|
+
|
|
117
|
+
Para **relatórios e queries avançadas**, consulte `guides/aggregates.md`.
|
|
118
|
+
|
|
119
|
+
Para **lógica customizada com código**, consulte `guides/triggers-guide.md` e `guides/database-access.md`.
|
|
120
|
+
|
|
121
|
+
Para **referência completa de recursos Java** (managers, entidades, bibliotecas), consulte `guides/java-managers.md`, `guides/java-entities.md` e `guides/java-libraries.md`.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Achievement (Conquista)
|
|
2
|
+
|
|
3
|
+
**API Endpoint:** `/v3/achievement`
|
|
4
|
+
|
|
5
|
+
## O que é
|
|
6
|
+
|
|
7
|
+
Registro das conquistas dos jogadores ao atingirem marcos relevantes. Todas as conquistas — como completar desafios, subir de nível, ganhar pontos ou adquirir itens — são registradas neste módulo. Ele automatiza o reconhecimento dos marcos alcançados, mas permite ajustes manuais.
|
|
8
|
+
|
|
9
|
+
## Quando usar
|
|
10
|
+
|
|
11
|
+
- Para consultar conquistas dos jogadores
|
|
12
|
+
- Para criar relatórios de desempenho
|
|
13
|
+
- Para usar em aggregates e dashboards
|
|
14
|
+
- Para triggers que reagem a conquistas
|
|
15
|
+
|
|
16
|
+
## Estrutura do Objeto
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"_id": "64a5d2",
|
|
21
|
+
"player": "john",
|
|
22
|
+
"total": 25.0,
|
|
23
|
+
"type": 0,
|
|
24
|
+
"item": "xp",
|
|
25
|
+
"time": {"$date": "2023-07-05T20:57:33.303Z"}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Tipos de Achievement (campo type):**
|
|
30
|
+
- `0` = Point (ponto ganho)
|
|
31
|
+
- `1` = Challenge (desafio completado)
|
|
32
|
+
- `2` = Virtual Good (item comprado)
|
|
33
|
+
- `3` = Level (nível atingido)
|
|
34
|
+
|
|
35
|
+
## API Endpoints
|
|
36
|
+
|
|
37
|
+
### Listar Conquistas
|
|
38
|
+
**Método:** GET
|
|
39
|
+
**Endpoint:** `/v3/achievement`
|
|
40
|
+
|
|
41
|
+
## Validações e Testes
|
|
42
|
+
|
|
43
|
+
- [ ] Ao completar desafio, achievement tipo 1 é criado
|
|
44
|
+
- [ ] Ao ganhar pontos, achievement tipo 0 é criado
|
|
45
|
+
- [ ] Ao comprar item, achievement tipo 2 é criado
|
|
46
|
+
- [ ] Ao subir de nível, achievement tipo 3 é criado
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Action Log (Registro de Ação)
|
|
2
|
+
|
|
3
|
+
**API Endpoint:** `/v3/action/log`
|
|
4
|
+
|
|
5
|
+
## O que é
|
|
6
|
+
|
|
7
|
+
Registro detalhado de todas as ações executadas pelos jogadores. Armazena cada ação realizada, com detalhes como quem executou, qual ação foi feita e quando ocorreu. Esse registro alimenta todos os outros módulos da plataforma.
|
|
8
|
+
|
|
9
|
+
## Quando usar
|
|
10
|
+
|
|
11
|
+
- Para registrar que um jogador executou uma ação
|
|
12
|
+
- Para alimentar desafios, rankings e recompensas
|
|
13
|
+
- Para importar ações em lote de sistemas externos
|
|
14
|
+
- Para rastrear comportamento dos jogadores
|
|
15
|
+
|
|
16
|
+
## Dependências
|
|
17
|
+
|
|
18
|
+
- **Action**: a ação referenciada deve existir
|
|
19
|
+
- **Player**: o jogador referenciado deve existir
|
|
20
|
+
|
|
21
|
+
## API Endpoints
|
|
22
|
+
|
|
23
|
+
### Listar ActionLogs
|
|
24
|
+
**Método:** GET
|
|
25
|
+
**Endpoint:** `/v3/action/log`
|
|
26
|
+
|
|
27
|
+
**Exemplo de Resposta:**
|
|
28
|
+
```json
|
|
29
|
+
[
|
|
30
|
+
{
|
|
31
|
+
"_id": "6509e4e28325771ffaa4506e",
|
|
32
|
+
"actionId": "sell",
|
|
33
|
+
"userId": "jerry",
|
|
34
|
+
"time": 1695147234712,
|
|
35
|
+
"attributes": {
|
|
36
|
+
"product": "bike",
|
|
37
|
+
"price": 1200
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Registrar ActionLog
|
|
44
|
+
**Método:** POST
|
|
45
|
+
**Endpoint:** `/v3/action/log`
|
|
46
|
+
|
|
47
|
+
**Exemplo de Body:**
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"actionId": "sell",
|
|
51
|
+
"userId": "jerry",
|
|
52
|
+
"attributes": {
|
|
53
|
+
"product": "bike",
|
|
54
|
+
"price": 1200
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Registrar Múltiplos ActionLogs
|
|
60
|
+
**Método:** POST
|
|
61
|
+
**Endpoint:** `/v3/action/log/bulk`
|
|
62
|
+
|
|
63
|
+
**Exemplo de Body:**
|
|
64
|
+
```json
|
|
65
|
+
[
|
|
66
|
+
{
|
|
67
|
+
"actionId": "sell",
|
|
68
|
+
"userId": "jerry",
|
|
69
|
+
"attributes": { "product": "bike", "price": 1200 }
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"actionId": "sell",
|
|
73
|
+
"userId": "tom",
|
|
74
|
+
"attributes": { "product": "book", "price": 25 }
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Excluir ActionLog
|
|
80
|
+
**Método:** DELETE
|
|
81
|
+
**Endpoint:** `/v3/action/log/:id`
|
|
82
|
+
|
|
83
|
+
## Validações e Testes
|
|
84
|
+
|
|
85
|
+
- [ ] ActionLog aparece na lista com dados corretos
|
|
86
|
+
- [ ] Ao registrar action log, desafios relacionados progridem
|
|
87
|
+
- [ ] Bulk insert registra múltiplas ações corretamente
|
|
88
|
+
- [ ] Atributos são armazenados conforme definido na ação
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Action (Ação)
|
|
2
|
+
|
|
3
|
+
**Acesso Studio:** `/studio/action`
|
|
4
|
+
**API Endpoint:** `/v3/action`
|
|
5
|
+
|
|
6
|
+
## O que é
|
|
7
|
+
|
|
8
|
+
Cadastro das diferentes ações que os jogadores podem realizar na gamificação. Permite criar e configurar todas as ações possíveis dentro da experiência gamificada, como "vender", "comprar", "comentar", "compartilhar", entre outras. As ações são a base da estratégia de engajamento, pois definem o que é possível fazer na gamificação e servem para disparar regras e recompensas. É possível adicionar atributos extras a cada ação, por exemplo, "produto" e "valor" na ação de venda.
|
|
9
|
+
|
|
10
|
+
## Quando usar
|
|
11
|
+
|
|
12
|
+
- Em todo projeto de gamificação (obrigatório)
|
|
13
|
+
- Para definir os comportamentos que serão rastreados
|
|
14
|
+
- Para criar a base de eventos que disparam desafios e recompensas
|
|
15
|
+
|
|
16
|
+
## Checklist de Configuração no Studio
|
|
17
|
+
|
|
18
|
+
- [ ] Definir o _id da ação (letras minúsculas, sem espaços ou acentos)
|
|
19
|
+
- [ ] Definir o nome amigável da ação (inicial maiúscula)
|
|
20
|
+
- [ ] Definir atributos extras se necessário (name + type: String, Number ou Boolean)
|
|
21
|
+
- [ ] Ativar a ação (active: true)
|
|
22
|
+
- [ ] Boas práticas: criar ações genéricas e usar atributos para detalhar contexto
|
|
23
|
+
|
|
24
|
+
## API Endpoints
|
|
25
|
+
|
|
26
|
+
### Listar Ações
|
|
27
|
+
**Método:** GET
|
|
28
|
+
**Endpoint:** `/v3/action`
|
|
29
|
+
**Descrição:** Retorna a lista de ações configuradas na gamificação.
|
|
30
|
+
|
|
31
|
+
**Exemplo de Resposta:**
|
|
32
|
+
```json
|
|
33
|
+
[
|
|
34
|
+
{
|
|
35
|
+
"action": "Sell",
|
|
36
|
+
"attributes": [
|
|
37
|
+
{ "name": "product", "type": "String" },
|
|
38
|
+
{ "name": "price", "type": "Number" }
|
|
39
|
+
],
|
|
40
|
+
"active": true,
|
|
41
|
+
"_id": "sell"
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Criar Ação
|
|
47
|
+
**Método:** POST
|
|
48
|
+
**Endpoint:** `/v3/action`
|
|
49
|
+
**Descrição:** Cria uma nova ação com nome, atributos e status de ativação.
|
|
50
|
+
|
|
51
|
+
**Exemplo de Body:**
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"_id": "sell",
|
|
55
|
+
"active": true,
|
|
56
|
+
"action": "Sell",
|
|
57
|
+
"attributes": [
|
|
58
|
+
{ "name": "product", "type": "String" },
|
|
59
|
+
{ "name": "price", "type": "Number" }
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Excluir Ação
|
|
65
|
+
**Método:** DELETE
|
|
66
|
+
**Endpoint:** `/v3/action/:id`
|
|
67
|
+
**Descrição:** Remove uma ação da gamificação.
|
|
68
|
+
|
|
69
|
+
## Boas Práticas
|
|
70
|
+
|
|
71
|
+
- Crie ações genéricas como "comprar", "vender", "responder", "visitar"
|
|
72
|
+
- Use os atributos para detalhar o contexto da ação (ex: produto, local, valor)
|
|
73
|
+
- Evite criar uma ação diferente para cada variação. Exemplo errado: "comprar sapato", "comprar camisa". Exemplo certo: ação "comprar" com atributo "produto"
|
|
74
|
+
|
|
75
|
+
## Validações e Testes
|
|
76
|
+
|
|
77
|
+
- [ ] Ação aparece na lista GET /v3/action
|
|
78
|
+
- [ ] Ação tem _id único e sem caracteres especiais
|
|
79
|
+
- [ ] Atributos estão com tipos corretos (String, Number, Boolean)
|
|
80
|
+
- [ ] Ação está ativa (active: true)
|