funifier-mcp 0.2.26 → 0.2.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/.cursor/rules/funifier.mdc +38 -41
  2. package/.github/copilot-instructions.md +38 -41
  3. package/AGENTS.md +56 -49
  4. package/README.md +40 -22
  5. package/datasource-funifier-docs/.coverage.json +326 -0
  6. package/datasource-funifier-docs/.validation.json +593 -0
  7. package/datasource-funifier-docs/knowledge/guides/aggregates.md +182 -70
  8. package/datasource-funifier-docs/knowledge/guides/database-access.md +174 -88
  9. package/datasource-funifier-docs/knowledge/guides/java-entities.md +294 -204
  10. package/datasource-funifier-docs/knowledge/guides/java-libraries.md +202 -226
  11. package/datasource-funifier-docs/knowledge/guides/java-managers.md +343 -265
  12. package/datasource-funifier-docs/knowledge/guides/trigger-examples.md +180 -236
  13. package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +273 -191
  14. package/datasource-funifier-docs/knowledge/index.md +4 -1
  15. package/datasource-funifier-docs/knowledge/modules/achievement.md +1126 -28
  16. package/datasource-funifier-docs/knowledge/modules/action-log.md +469 -62
  17. package/datasource-funifier-docs/knowledge/modules/action.md +522 -70
  18. package/datasource-funifier-docs/knowledge/modules/auth.md +718 -69
  19. package/datasource-funifier-docs/knowledge/modules/avatar.md +483 -18
  20. package/datasource-funifier-docs/knowledge/modules/backup.md +603 -25
  21. package/datasource-funifier-docs/knowledge/modules/challenge.md +1048 -220
  22. package/datasource-funifier-docs/knowledge/modules/compact.md +469 -26
  23. package/datasource-funifier-docs/knowledge/modules/competition.md +811 -109
  24. package/datasource-funifier-docs/knowledge/modules/crossword.md +504 -28
  25. package/datasource-funifier-docs/knowledge/modules/csv-data.md +645 -20
  26. package/datasource-funifier-docs/knowledge/modules/custom-object.md +701 -36
  27. package/datasource-funifier-docs/knowledge/modules/database.md +730 -164
  28. package/datasource-funifier-docs/knowledge/modules/folder.md +935 -280
  29. package/datasource-funifier-docs/knowledge/modules/kpi-formulas.md +410 -15
  30. package/datasource-funifier-docs/knowledge/modules/lastmile.md +568 -29
  31. package/datasource-funifier-docs/knowledge/modules/leaderboard.md +595 -126
  32. package/datasource-funifier-docs/knowledge/modules/level.md +536 -54
  33. package/datasource-funifier-docs/knowledge/modules/lottery.md +809 -76
  34. package/datasource-funifier-docs/knowledge/modules/marketplace.md +688 -17
  35. package/datasource-funifier-docs/knowledge/modules/mystery.md +662 -52
  36. package/datasource-funifier-docs/knowledge/modules/notification.md +564 -26
  37. package/datasource-funifier-docs/knowledge/modules/patterns.md +519 -814
  38. package/datasource-funifier-docs/knowledge/modules/player.md +773 -73
  39. package/datasource-funifier-docs/knowledge/modules/point.md +380 -83
  40. package/datasource-funifier-docs/knowledge/modules/public.md +508 -178
  41. package/datasource-funifier-docs/knowledge/modules/question.md +619 -99
  42. package/datasource-funifier-docs/knowledge/modules/quiz.md +565 -120
  43. package/datasource-funifier-docs/knowledge/modules/scheduler.md +1092 -39
  44. package/datasource-funifier-docs/knowledge/modules/security.md +674 -112
  45. package/datasource-funifier-docs/knowledge/modules/staging.md +742 -19
  46. package/datasource-funifier-docs/knowledge/modules/story.md +565 -29
  47. package/datasource-funifier-docs/knowledge/modules/studio-page.md +470 -144
  48. package/datasource-funifier-docs/knowledge/modules/swap.md +552 -84
  49. package/datasource-funifier-docs/knowledge/modules/team.md +563 -45
  50. package/datasource-funifier-docs/knowledge/modules/trigger.md +876 -134
  51. package/datasource-funifier-docs/knowledge/modules/upload.md +468 -95
  52. package/datasource-funifier-docs/knowledge/modules/virtual-good.md +510 -63
  53. package/datasource-funifier-docs/knowledge/modules/webhook.md +375 -28
  54. package/datasource-funifier-docs/knowledge/modules/websocket.md +459 -26
  55. package/datasource-funifier-docs/knowledge/modules/widget.md +613 -27
  56. package/dist/cli/init.d.ts.map +1 -1
  57. package/dist/cli/init.js +42 -1
  58. package/dist/cli/init.js.map +1 -1
  59. package/dist/cli/init.test.js +74 -3
  60. package/dist/cli/init.test.js.map +1 -1
  61. package/dist/cli/persona.d.ts +3 -0
  62. package/dist/cli/persona.d.ts.map +1 -0
  63. package/dist/cli/persona.js +25 -0
  64. package/dist/cli/persona.js.map +1 -0
  65. package/dist/mcp/bundle.js +119 -93
  66. package/dist/mcp/check-update.d.ts +5 -0
  67. package/dist/mcp/check-update.d.ts.map +1 -1
  68. package/dist/mcp/check-update.js +21 -10
  69. package/dist/mcp/check-update.js.map +1 -1
  70. package/dist/mcp/check-update.test.d.ts +2 -0
  71. package/dist/mcp/check-update.test.d.ts.map +1 -0
  72. package/dist/mcp/check-update.test.js +33 -0
  73. package/dist/mcp/check-update.test.js.map +1 -0
  74. package/dist/mcp/index.js +2 -2
  75. package/dist/mcp/index.js.map +1 -1
  76. package/dist/mcp/prompts/templates.d.ts.map +1 -1
  77. package/dist/mcp/prompts/templates.js +35 -0
  78. package/dist/mcp/prompts/templates.js.map +1 -1
  79. package/dist/mcp/resources/documentation.d.ts +1 -1
  80. package/dist/mcp/resources/documentation.d.ts.map +1 -1
  81. package/dist/mcp/resources/documentation.js +39 -3
  82. package/dist/mcp/resources/documentation.js.map +1 -1
  83. package/dist/mcp/tools/connect.d.ts.map +1 -1
  84. package/dist/mcp/tools/connect.js +18 -8
  85. package/dist/mcp/tools/connect.js.map +1 -1
  86. package/dist/mcp/tools/database.d.ts.map +1 -1
  87. package/dist/mcp/tools/database.js +59 -47
  88. package/dist/mcp/tools/database.js.map +1 -1
  89. package/dist/mcp/tools/database.test.js +2 -2
  90. package/dist/mcp/tools/database.test.js.map +1 -1
  91. package/dist/mcp/tools/delete.d.ts.map +1 -1
  92. package/dist/mcp/tools/delete.js +13 -3
  93. package/dist/mcp/tools/delete.js.map +1 -1
  94. package/dist/mcp/tools/execute.d.ts.map +1 -1
  95. package/dist/mcp/tools/execute.js +20 -9
  96. package/dist/mcp/tools/execute.js.map +1 -1
  97. package/dist/mcp/tools/folder.d.ts.map +1 -1
  98. package/dist/mcp/tools/folder.js +22 -12
  99. package/dist/mcp/tools/folder.js.map +1 -1
  100. package/dist/mcp/tools/get.d.ts.map +1 -1
  101. package/dist/mcp/tools/get.js +16 -6
  102. package/dist/mcp/tools/get.js.map +1 -1
  103. package/dist/mcp/tools/index.d.ts +1 -1
  104. package/dist/mcp/tools/index.d.ts.map +1 -1
  105. package/dist/mcp/tools/index.js +28 -1
  106. package/dist/mcp/tools/index.js.map +1 -1
  107. package/dist/mcp/tools/list.d.ts.map +1 -1
  108. package/dist/mcp/tools/list.js +38 -14
  109. package/dist/mcp/tools/list.js.map +1 -1
  110. package/dist/mcp/tools/logs.d.ts.map +1 -1
  111. package/dist/mcp/tools/logs.js +15 -5
  112. package/dist/mcp/tools/logs.js.map +1 -1
  113. package/dist/mcp/tools/save.d.ts.map +1 -1
  114. package/dist/mcp/tools/save.js +14 -4
  115. package/dist/mcp/tools/save.js.map +1 -1
  116. package/dist/mcp/tools/save.test.js +3 -3
  117. package/dist/mcp/tools/save.test.js.map +1 -1
  118. package/dist/mcp/tools/search-docs.d.ts +3 -0
  119. package/dist/mcp/tools/search-docs.d.ts.map +1 -0
  120. package/dist/mcp/tools/search-docs.js +102 -0
  121. package/dist/mcp/tools/search-docs.js.map +1 -0
  122. package/package.json +6 -2
  123. package/skills/acquire-funifier-knowledge/SKILL.md +155 -0
  124. package/skills/acquire-funifier-knowledge/assets/templates/CONCERNS.md +25 -0
  125. package/skills/acquire-funifier-knowledge/assets/templates/CUSTOM_ENDPOINTS.md +24 -0
  126. package/skills/acquire-funifier-knowledge/assets/templates/CUSTOM_PAGES.md +24 -0
  127. package/skills/acquire-funifier-knowledge/assets/templates/GAME_MECHANICS.md +35 -0
  128. package/skills/acquire-funifier-knowledge/assets/templates/INTEGRATIONS.md +35 -0
  129. package/skills/acquire-funifier-knowledge/assets/templates/LEADERBOARDS.md +24 -0
  130. package/skills/acquire-funifier-knowledge/assets/templates/OVERVIEW.md +86 -0
  131. package/skills/acquire-funifier-knowledge/assets/templates/PLAYER_MODEL.md +31 -0
  132. package/skills/acquire-funifier-knowledge/assets/templates/SCHEDULERS.md +25 -0
  133. package/skills/acquire-funifier-knowledge/assets/templates/TECHNIQUES_AND_PATTERNS.md +26 -0
  134. package/skills/acquire-funifier-knowledge/assets/templates/TRIGGERS.md +27 -0
  135. package/skills/acquire-funifier-knowledge/references/funifier-inventory-checklist.md +81 -0
  136. package/skills/acquire-funifier-knowledge/references/game-techniques-taxonomy.md +62 -0
  137. package/skills/acquire-funifier-knowledge/references/mcp-call-patterns.md +118 -0
  138. package/skills/funifier/SKILL.md +88 -0
  139. package/skills/funifier/references/configure-security.md +96 -0
  140. package/skills/{funifier-create-action/SKILL.md → funifier/references/create-action.md} +0 -33
  141. package/skills/funifier/references/create-aggregate.md +144 -0
  142. package/skills/funifier/references/create-challenge.md +116 -0
  143. package/skills/funifier/references/create-competition.md +98 -0
  144. package/skills/funifier/references/create-crossword.md +574 -0
  145. package/skills/funifier/references/create-custom-object.md +91 -0
  146. package/skills/funifier/references/create-custom-page.md +135 -0
  147. package/skills/funifier/references/create-folder.md +104 -0
  148. package/skills/funifier/references/create-lastmile.md +643 -0
  149. package/skills/{funifier-create-leaderboard/SKILL.md → funifier/references/create-leaderboard.md} +0 -33
  150. package/skills/funifier/references/create-level.md +94 -0
  151. package/skills/funifier/references/create-lottery.md +913 -0
  152. package/skills/funifier/references/create-mystery.md +769 -0
  153. package/skills/funifier/references/create-notification.md +75 -0
  154. package/skills/{funifier-create-point/SKILL.md → funifier/references/create-point.md} +0 -33
  155. package/skills/funifier/references/create-quiz.md +98 -0
  156. package/skills/funifier/references/create-scheduler.md +141 -0
  157. package/skills/funifier/references/create-story.md +636 -0
  158. package/skills/funifier/references/create-swap.md +95 -0
  159. package/skills/{funifier-create-trigger/SKILL.md → funifier/references/create-trigger.md} +0 -33
  160. package/skills/funifier/references/create-virtual-good.md +96 -0
  161. package/skills/funifier/references/create-webhook.md +72 -0
  162. package/skills/funifier/references/create-websocket.md +71 -0
  163. package/skills/funifier/references/create-widget.md +76 -0
  164. package/skills/funifier/references/debug.md +87 -0
  165. package/skills/funifier/references/help.md +81 -0
  166. package/skills/funifier/references/implement-frontend.md +106 -0
  167. package/skills/funifier/references/import-csv.md +75 -0
  168. package/skills/funifier/references/manage-player.md +82 -0
  169. package/skills/funifier/references/manage-team.md +76 -0
  170. package/skills/funifier/references/upload-file.md +91 -0
  171. package/skills/funifier-create-aggregate/SKILL.md +0 -127
  172. package/skills/funifier-create-challenge/SKILL.md +0 -88
  173. package/skills/funifier-create-custom-page/SKILL.md +0 -127
  174. package/skills/funifier-create-level/SKILL.md +0 -87
  175. package/skills/funifier-create-quiz/SKILL.md +0 -87
  176. package/skills/funifier-create-scheduler/SKILL.md +0 -127
  177. package/skills/funifier-create-virtual-good/SKILL.md +0 -87
  178. package/skills/funifier-debug/SKILL.md +0 -92
  179. package/skills/funifier-help/SKILL.md +0 -86
  180. package/skills/funifier-implement-frontend/SKILL.md +0 -90
  181. package/skills/funifier-index/SKILL.md +0 -58
@@ -1,332 +1,388 @@
1
1
  # Java Entities — Referência
2
2
 
3
- As entidades são os objetos Java (POJOs) que representam os dados armazenados no MongoDB. Cada entidade mapeia para uma coleção no banco de dados.
3
+ ## 1. Visão Geral
4
4
 
5
- ---
5
+ ### 1.1 O que é este documento
6
6
 
7
- ## Entidades Principais
7
+ Este documento descreve as entidades Java (POJOs) da plataforma Funifier — campos, tipos, coleção MongoDB de cada uma e constantes associadas — para uso em código server-side (triggers, schedulers e public endpoints).
8
8
 
9
- ### Player
9
+ ### 1.2 Quando consultar
10
10
 
11
- **Coleção MongoDB:** `player`
12
- **Classe:** `com.funifier.engine.player.Player`
11
+ - Consulte ao precisar dos **campos e tipos** de um objeto manipulado em código (ex: o `entity` de um trigger).
12
+ - Consulte ao precisar saber em **qual coleção MongoDB** uma entidade é persistida.
13
+ - Consulte ao precisar das **constantes de `Achievement`** (`TYPE_POINT`, `TYPE_CHALLENGE`, etc.).
14
+ - Consulte ao decidir entre **entidade nativa** e **coleção customizada (`__c`)**.
13
15
 
14
- ```java
15
- // Campos principais
16
- String _id; // ID do jogador (ex: "john")
17
- String name; // Nome do jogador
18
- String email; // Email
19
- String password; // Senha (hash)
20
- Map<String, Object> extra; // Campos customizados (ex: department, country)
21
- List<String> teams; // IDs das equipes
22
- List<String> friends; // IDs dos amigos
23
- ImageSet image; // Imagens (small, medium, original)
24
- Date created; // Data de cadastro
25
- ```
16
+ ### 1.3 Quando NÃO consultar
26
17
 
27
- ```json
28
- {"_id": "john", "name": "John Travolta", "email": "john@funifier.com", "teams": ["sales"], "extra": {"country": "USA", "department": "IT"}, "image": {"small": {"url": "..."}, "medium": {"url": "..."}, "original": {"url": "..."}}}
29
- ```
18
+ - **NÃO** consulte para os **métodos** que operam sobre estas entidades — use `datasource-funifier-docs/knowledge/guides/java-managers.md`.
19
+ - **NÃO** consulte para a **mecânica de triggers** (assinatura, eventos, acesso a `entity`) use `datasource-funifier-docs/knowledge/guides/triggers-guide.md`.
20
+ - **NÃO** consulte para **acesso ao banco** (Jongo, `/v3/database`) — use `datasource-funifier-docs/knowledge/guides/database-access.md`.
30
21
 
31
- ---
22
+ ### 1.4 Índice de decisão
32
23
 
33
- ### Achievement
24
+ | Problema / Situação | O que fazer | Seção |
25
+ |---|---|---|
26
+ | Preciso dos campos do jogador | Ver entidade Player | §2 |
27
+ | Preciso entender o que é uma conquista (ponto, desafio, compra, nível) | Ver entidade Achievement + constantes | §3 |
28
+ | Preciso ler atributos de uma ação executada | Ver entidade ActionLog | §4 |
29
+ | Preciso da definição de um tipo de ação | Ver entidade Action | §5 |
30
+ | Preciso das regras/recompensas de um desafio | Ver entidade Challenge | §6 |
31
+ | Preciso dos campos de um item de loja | Ver entidade CatalogItem | §7 |
32
+ | Preciso de Point/Level/Team | Ver entidades de configuração | §8 |
33
+ | Preciso de Lottery/Mystery/Competition/Question/Quiz/Swap/Notification | Ver entidades de engajamento | §9 |
34
+ | Preciso de Trigger/Scheduler/PublicEndpoint/Webhook | Ver entidades de infraestrutura | §10 |
35
+ | Não sei em qual coleção a entidade vive | Ver mapeamento completo | §11 |
36
+ | Preciso de uma estrutura de dados própria | Ver Custom Objects (`__c`) | §12 |
34
37
 
35
- **Coleção MongoDB:** `achievement`
36
- **Classe:** `com.funifier.engine.achievement.Achievement`
38
+ ### 1.5 Restrições globais críticas
37
39
 
38
- Representa qualquer conquista do jogador: pontos ganhos, desafios completados, itens comprados, níveis alcançados.
40
+ > ⚠️ **O campo é `_id`, mas em Groovy o acesso é `entity.id`.** Em código Groovy de trigger/endpoint, `entity._id` **não** resolve a propriedade (`patterns.md` §10). Consequência: `null` silencioso ao ler o ID. → Use `entity.id` em Groovy; `_id` aparece apenas no JSON/documento MongoDB. Detalhe em `datasource-funifier-docs/knowledge/guides/triggers-guide.md`.
39
41
 
40
- ```java
41
- // Campos principais
42
- String _id; // ID da conquista
43
- String player; // ID do jogador
44
- double total; // Quantidade (pontos, unidades)
45
- int type; // Tipo (0=Point, 1=Challenge, 2=VirtualGood, 3=Level)
46
- String item; // ID do item (point_category, challenge, catalog_item, level)
47
- Date time; // Data da conquista
48
-
49
- // Constantes de tipo
50
- static final int TYPE_POINT = 0;
51
- static final int TYPE_CHALLENGE = 1;
52
- static final int TYPE_VIRTUAL_GOOD = 2;
53
- static final int TYPE_LEVEL = 3;
54
- ```
42
+ > ⚠️ **`password` do Player é gravado sem hash no `POST/PUT /v3/player`.** Consequência: senha em texto plano. → Hashear via BCrypt em trigger antes de `insert` (`patterns.md` §2 e §11).
55
43
 
56
- ```json
57
- {"_id": "64a5d2", "player": "john", "total": 25.0, "type": 0, "item": "xp", "time": {"$date": "2023-07-05T20:57:33.303Z"}}
58
- ```
44
+ > ⚠️ **Salvar Player parcial apaga campos não enviados.** Consequência: `name`/`email`/`extra` somem. → Read-merge-write com objeto completo (`patterns.md` §10).
45
+
46
+ > ⚠️ **Nomes totalmente qualificados (`com.*`/`org.*`) são bloqueados no sandbox de Public Endpoint.** Instanciar POJO (`new Player()`) funciona nos três runtimes; referenciar `com.funifier.engine.player.Player` por extenso só funciona em Trigger/Scheduler. → Tabela do sandbox em `patterns.md` §1.5.
47
+
48
+ ### 1.6 Documentos relacionados
49
+
50
+ > 📄 `datasource-funifier-docs/knowledge/guides/java-managers.md` — métodos que operam sobre estas entidades
51
+ > 📄 `datasource-funifier-docs/knowledge/guides/triggers-guide.md` — como `entity` é exposta e manipulada em triggers
52
+ > 📄 `datasource-funifier-docs/knowledge/guides/database-access.md` — leitura/escrita das coleções correspondentes
59
53
 
60
54
  ---
61
55
 
62
- ### ActionLog
56
+ ## 2. Player
57
+
58
+ Quando usar: ao ler/escrever dados de jogador em código, ou manipular o `entity` de um trigger de `player`.
59
+ Não usar quando: precisar dos métodos de gestão (CRUD, roles) → `java-managers.md` §PlayerManager.
60
+ Depende de: `ImageSet` (campo `image`).
61
+ Disponível em: Todos.
62
+
63
+ ### Descrição
63
64
 
64
- **Coleção MongoDB:** `action_log`
65
- **Classe:** `com.funifier.engine.action.ActionLog`
65
+ Representa um usuário da aplicação. Coleção MongoDB `player`, classe `com.funifier.engine.player.Player`. É entidade **nativa** — escrita via `POST /v3/player` ou `PlayerManager.insert`, nunca via `/v3/database/player`.
66
66
 
67
- Registo de uma ação executada por um jogador.
67
+ ### Uso
68
68
 
69
69
  ```java
70
- // Campos principais
71
- String _id; // ID do log
72
- String actionId; // ID da ação (ex: "sell")
73
- String userId; // ID do jogador (ex: "john")
74
- Date time; // Data da execução
75
- Map<String, Object> attributes; // Atributos da ação (ex: product, price)
70
+ String _id; // ID do jogador (ex: "john") — em Groovy: player.id
71
+ String name; // Nome
72
+ String email; // Email
73
+ String password; // Senha (hash BCrypt; gravado sem hash se vier do POST/PUT ver §1.5)
74
+ Map<String, Object> extra; // Campos customizados (ex: department, country, plan)
75
+ List<String> teams; // IDs das equipes
76
+ List<String> friends; // IDs dos amigos
77
+ ImageSet image; // Imagens: getSmall()/getMedium()/getOriginal() → getUrl()
78
+ Date created; // Data de cadastro
76
79
  ```
77
80
 
78
81
  ```json
79
- {"_id": "64a5d92", "actionId": "sell", "userId": "john", "time": {"$date": "2023-07-05T20:57:33.303Z"}, "attributes": {"product": "book", "price": 120}}
82
+ {"_id": "john", "name": "John Travolta", "email": "john@funifier.com", "teams": ["sales"], "extra": {"country": "USA", "department": "IT"}, "image": {"small": {"url": "..."}, "medium": {"url": "..."}, "original": {"url": "..."}}}
80
83
  ```
81
84
 
85
+ ### Armadilhas conhecidas
86
+
87
+ - **`entity._id` em Groovy retorna `null`** → use `entity.id` (§1.5). Causa: o getter da propriedade Groovy não mapeia `_id`.
88
+ - **Salvar `{_id, extra}` sem `name`/`email`** → campos apagados. Causa: o save persiste o objeto enviado. Correção: read-merge-write (`patterns.md` §10).
89
+ - **`image` parcial** → rejeitada. Causa: exige `size`/`width`/`height`/`depth` em cada tamanho (mesmo `0`). Correção: estrutura completa (`patterns.md` §10).
90
+
82
91
  ---
83
92
 
84
- ### Action
93
+ ## 3. Achievement
94
+
95
+ Quando usar: ao criar conquistas programaticamente, ou ler o `entity` de um trigger de `achievement`/`point_category`.
96
+ Não usar quando: precisar somar/consultar conquistas → `java-managers.md` §AchievementManager.
97
+ Depende de: constantes `TYPE_*` (abaixo).
98
+ Disponível em: Todos.
99
+
100
+ ### Descrição
85
101
 
86
- **Coleção MongoDB:** `action`
87
- **Classe:** `com.funifier.engine.action.Action`
102
+ Representa qualquer conquista do jogador: pontos ganhos, desafios completados, itens comprados, níveis alcançados, sorteios e competições. Coleção `achievement`, classe `com.funifier.engine.achievement.Achievement`.
88
103
 
89
- Definição de um tipo de ação.
104
+ ### Uso
90
105
 
91
106
  ```java
92
- // Campos principais
93
- String _id; // ID da ação (ex: "sell")
94
- String action; // Nome da ação (ex: "Sell")
95
- boolean active; // Se está ativa
96
- List<ActionAttribute> attributes; // Definição dos atributos (name, type)
107
+ String _id; // ID da conquista — em Groovy: .id
108
+ String player; // ID do jogador
109
+ double total; // Quantidade (pontos, unidades)
110
+ int type; // Tipo ver tabela de constantes
111
+ String item; // ID do item (point_category, challenge, catalog_item, level)
112
+ Date time; // Data da conquista
113
+ Map<String, Object> extra; // Campos extras (ex: origem da conquista)
97
114
  ```
98
115
 
99
116
  ```json
100
- {"_id": "sell", "action": "Sell", "attributes": [{"name": "product", "type": "String"}, {"name": "price", "type": "Number"}], "active": true}
117
+ {"_id": "64a5d2", "player": "john", "total": 25.0, "type": 0, "item": "xp", "time": {"$date": "2023-07-05T20:57:33.303Z"}}
101
118
  ```
102
119
 
120
+ **Constantes de tipo** (lista reconciliada — `0`–`3` da classe Java; `5`/`9` confirmadas em `trigger-examples.md`):
121
+
122
+ | Constante Java | Valor `int` | Significado |
123
+ |---|---|---|
124
+ | `Achievement.TYPE_POINT` | `0` | Ponto acumulado |
125
+ | `Achievement.TYPE_CHALLENGE` | `1` | Desafio completado |
126
+ | `Achievement.TYPE_VIRTUAL_GOOD` | `2` | Item de catálogo comprado |
127
+ | `Achievement.TYPE_LEVEL` | `3` | Nível alcançado |
128
+ | `Achievement.TYPE_LOTTERY` | `5` | Sorteio |
129
+ | `Achievement.TYPE_COMPETITION` | `9` | Competição |
130
+
131
+ ### Armadilhas conhecidas
132
+
133
+ - **Comparar `entity.type` com literal inteiro** → frágil. Use a constante (`entity.type == Achievement.TYPE_POINT`).
134
+ - **Criar `Achievement` sem `_id`/`time`** → registro inconsistente. Correção: `a.id = Guid.newShortGuid(); a.time = new Date();` (`java-libraries.md` §Guid).
135
+ - **Assumir só os tipos 0–3** → tipos `5` (lottery) e `9` (competition) também ocorrem; trate o `default`.
136
+
103
137
  ---
104
138
 
105
- ### Challenge
139
+ ## 4. ActionLog
140
+
141
+ Quando usar: ao ler o `entity` de um trigger de `action`, ou registrar uma ação programaticamente.
142
+ Não usar quando: precisar disparar a ação (track) → `java-managers.md` §ActionManager.
143
+ Depende de: `Action` (definição correspondente, §5).
144
+ Disponível em: Todos.
106
145
 
107
- **Coleção MongoDB:** `challenge`
108
- **Classe:** `com.funifier.engine.challenge.Challenge`
146
+ ### Descrição
109
147
 
110
- Definição de um desafio.
148
+ Registro de uma ação executada por um jogador. Coleção `action_log`, classe `com.funifier.engine.action.ActionLog`. É o `entity` recebido em triggers de `action`.
149
+
150
+ ### Uso
111
151
 
112
152
  ```java
113
- // Campos principais
114
- String _id; // ID do desafio
115
- String challenge; // Nome do desafio
116
- boolean active; // Se está ativo
117
- List<Rule> rules; // Regras (ação, operador, total)
118
- List<Reward> points; // Recompensas (pontos, operação)
153
+ String _id; // ID do log — em Groovy: .id
154
+ String actionId; // ID da ação (ex: "sell")
155
+ String userId; // ID do jogador
156
+ Date time; // Momento da execução
157
+ Map<String, Object> attributes; // Atributos da ação (ex: product, price)
119
158
  ```
120
159
 
121
160
  ```json
122
- {"_id": "DTo8dS3", "challenge": "Watch Video", "active": true, "rules": [{"actionId": "watch_video", "operator": 5, "total": 0}], "points": [{"total": 10.0, "category": "xp", "operation": 0}]}
161
+ {"_id": "64a5d92", "actionId": "sell", "userId": "john", "time": {"$date": "2023-07-05T20:57:33.303Z"}, "attributes": {"product": "book", "price": 120}}
123
162
  ```
124
163
 
164
+ ### Armadilhas conhecidas
165
+
166
+ - **`log._id = Guid.newShortGuid()` em Groovy** → não atribui. Use `log.id` (§1.5; confirmado em `trigger-examples.md`).
167
+ - **Ler `attributes` de chave inexistente** → `null`. Correção: `String.valueOf(entity.attributes.get("k"))` e checar `"null"`.
168
+
125
169
  ---
126
170
 
127
- ### CatalogItem
171
+ ## 5. Action
172
+
173
+ Quando usar: ao consultar a definição de um tipo de ação (atributos esperados, se está ativa).
174
+ Não usar quando: precisar do registro de execução → ActionLog (§4).
175
+ Depende de: `ActionAttribute` (lista `attributes`).
176
+ Disponível em: Todos.
128
177
 
129
- **Coleção MongoDB:** `catalog_item`
130
- **Classe:** `com.funifier.engine.catalog.CatalogItem`
178
+ ### Descrição
131
179
 
132
- Item da loja virtual.
180
+ Definição de um tipo de ação que jogadores podem executar. Coleção `action`, classe `com.funifier.engine.action.Action`.
181
+
182
+ ### Uso
133
183
 
134
184
  ```java
135
- // Campos principais
136
- String _id; // ID do item
137
- String catalogId; // ID do catálogo
138
- String name; // Nome do item
139
- int amount; // Quantidade disponível
140
- boolean active; // Se está ativo
141
- Requirement[] requires; // Requisitos para compra (pontos necessários)
185
+ String _id; // ID da ação (ex: "sell")
186
+ String action; // Nome (ex: "Sell")
187
+ boolean active; // Se está ativa
188
+ List<ActionAttribute> attributes; // Definição dos atributos (name, type)
142
189
  ```
143
190
 
144
191
  ```json
145
- {"_id": "prd1", "catalogId": "gifts", "name": "T-shirt", "amount": 100, "active": true, "requires": [{"total": 15, "type": 0, "item": "coin", "operation": 1}]}
192
+ {"_id": "sell", "action": "Sell", "attributes": [{"name": "product", "type": "String"}, {"name": "price", "type": "Number"}], "active": true}
146
193
  ```
147
194
 
148
- ---
195
+ ### Armadilhas conhecidas
149
196
 
150
- ### Team
197
+ - **Confundir `Action` (definição) com `ActionLog` (execução)** → coleções e propósitos distintos. `action.attributes` é a *especificação*; `actionLog.attributes` são os *valores*.
151
198
 
152
- **Coleção MongoDB:** `team`
153
- **Classe:** `com.funifier.engine.team.Team`
199
+ ---
154
200
 
155
- ```java
156
- String _id; // ID da equipe
157
- String name; // Nome da equipe
158
- ```
201
+ ## 6. Challenge
159
202
 
160
- ---
203
+ Quando usar: ao ler regras/recompensas de um desafio.
204
+ Não usar quando: precisar criar/atualizar desafios → `java-managers.md` §ChallengeManager.
205
+ Depende de: `Rule`, `Reward`.
206
+ Disponível em: Todos.
207
+
208
+ ### Descrição
161
209
 
162
- ### Level
210
+ Definição de um desafio: regras de ação que o completam e recompensas concedidas. Coleção `challenge`, classe `com.funifier.engine.challenge.Challenge`.
163
211
 
164
- **Coleção MongoDB:** `level`
165
- **Classe:** `com.funifier.engine.level.Level`
212
+ ### Uso
166
213
 
167
214
  ```java
168
- String _id; // ID do nível
169
- String level; // Nome do nível
170
- int position; // Posição (ordem)
215
+ String _id; // ID do desafio
216
+ String challenge; // Nome
217
+ boolean active; // Se está ativo
218
+ List<Rule> rules; // Regras (actionId, operator, total)
219
+ List<Reward> points; // Recompensas (total, category, operation)
171
220
  ```
172
221
 
173
- ---
174
-
175
- ### PointCategory
222
+ ```json
223
+ {"_id": "DTo8dS3", "challenge": "Watch Video", "active": true, "rules": [{"actionId": "watch_video", "operator": 5, "total": 0}], "points": [{"total": 10.0, "category": "xp", "operation": 0}]}
224
+ ```
176
225
 
177
- **Coleção MongoDB:** `point_category`
178
- **Classe:** `com.funifier.engine.point.PointCategory`
226
+ ### Armadilhas conhecidas
179
227
 
180
- ```java
181
- String _id; // ID da categoria (ex: "xp")
182
- String category; // Nome (ex: "Experience Points")
183
- String shortName; // Abreviação (ex: "XP")
184
- Map extra; // Campos extras
185
- ```
228
+ - **Editar `rules`/`points` direto via `/v3/database`** → `challenge` é nativa; use `ChallengeManager` ou `/v3/challenge`.
186
229
 
187
230
  ---
188
231
 
189
- ### Lottery
232
+ ## 7. CatalogItem
190
233
 
191
- **Coleção MongoDB:** `lottery`
192
- **Classe:** `com.funifier.engine.lottery.Lottery`
234
+ Quando usar: ao ler campos de um item de loja (preço, estoque, requisitos).
235
+ Não usar quando: precisar processar compra → `java-managers.md` §CatalogManager.
236
+ Depende de: `Requirement` (campo `requires`).
237
+ Disponível em: Todos.
193
238
 
194
- ```java
195
- String _id; // ID do sorteio
196
- String title; // Título
197
- boolean active; // Se está ativo
198
- ```
239
+ ### Descrição
199
240
 
200
- ---
241
+ Item da loja virtual. Coleção `catalog_item`, classe `com.funifier.engine.catalog.CatalogItem`.
201
242
 
202
- ### LotteryTicket
203
-
204
- **Coleção MongoDB:** `lottery_ticket`
205
- **Classe:** `com.funifier.engine.lottery.LotteryTicket`
243
+ ### Uso
206
244
 
207
245
  ```java
208
- String _id; // ID do ticket
209
- String lottery; // ID do sorteio
210
- String player; // ID do jogador
246
+ String _id; // ID do item
247
+ String catalogId; // ID do catálogo
248
+ String name; // Nome
249
+ int amount; // Quantidade disponível
250
+ boolean active; // Se está ativo
251
+ Requirement[] requires; // Requisitos para compra (total, type, item, operation)
211
252
  ```
212
253
 
213
- ---
214
-
215
- ### MysteryBox
254
+ ```json
255
+ {"_id": "prd1", "catalogId": "gifts", "name": "T-shirt", "amount": 100, "active": true, "requires": [{"total": 15, "type": 0, "item": "coin", "operation": 1}]}
256
+ ```
216
257
 
217
- **Coleção MongoDB:** `mystery_box`
218
- **Classe:** `com.funifier.engine.mystery.MysteryBox`
258
+ ### Armadilhas conhecidas
219
259
 
220
- ```java
221
- String _id; // ID da caixa
222
- String title; // Título
223
- boolean active; // Se está ativa
224
- ```
260
+ - **Comprar ignorando `requires`** → use `CatalogManager.isValid(...)`/`findMissingRequirements(...)` antes (`java-managers.md`).
225
261
 
226
262
  ---
227
263
 
228
- ### Competition
229
-
230
- **Coleção MongoDB:** `competition`
231
- **Classe:** `com.funifier.engine.competition.Competition`
264
+ ## 8. Entidades de Configuração (Point, Level, Team)
232
265
 
233
- ```java
234
- String _id; // ID da competição
235
- boolean active; // Se está ativa
236
- ```
266
+ Quando usar: ao ler campos de categorias de ponto, níveis ou equipes.
267
+ Não usar quando: precisar dos métodos correspondentes → `java-managers.md` (§PointManager, §LevelManager, §TeamManager).
268
+ Depende de:
269
+ Disponível em: Todos.
237
270
 
238
- ---
271
+ ### Descrição
239
272
 
240
- ### Question
273
+ Entidades de configuração das mecânicas. Estruturas simples, manipuladas majoritariamente via managers.
241
274
 
242
- **Coleção MongoDB:** `question`
243
- **Classe:** `com.funifier.engine.question.Question`
275
+ ### Uso
244
276
 
277
+ **PointCategory** — coleção `point_category`, classe `com.funifier.engine.point.PointCategory`
245
278
  ```java
246
- String _id; // ID da pergunta
247
- String question; // Texto da pergunta
279
+ String _id; // ID da categoria (ex: "xp")
280
+ String category; // Nome (ex: "Experience Points")
281
+ String shortName; // Abreviação (ex: "XP")
282
+ Map extra; // Campos extras
248
283
  ```
249
284
 
250
- ---
251
-
252
- ### QuestionLog
253
-
254
- **Coleção MongoDB:** `question_log`
255
- **Classe:** `com.funifier.engine.question.QuestionLog`
285
+ **Level** — coleção `level`, classe `com.funifier.engine.level.Level`
286
+ ```java
287
+ String _id; // ID do nível
288
+ String level; // Nome do nível
289
+ int position; // Posição (ordem)
290
+ ```
256
291
 
292
+ **Team** — coleção `team`, classe `com.funifier.engine.team.Team`
257
293
  ```java
258
- String _id; // ID do log
259
- String player; // ID do jogador
260
- String question; // ID da pergunta
294
+ String _id; // ID da equipe
295
+ String name; // Nome
261
296
  ```
262
297
 
298
+ ### Armadilhas conhecidas
299
+
300
+ - **Associar jogador a equipe escrevendo `player.teams` direto** → use `TeamManager.linkUser(...)`, que mantém os índices de associação (`java-managers.md`).
301
+
263
302
  ---
264
303
 
265
- ### Quiz / QuizLog
304
+ ## 9. Entidades de Engajamento
266
305
 
267
- **Coleções:** `quiz` / `quiz_log`
306
+ Quando usar: ao ler os campos básicos de mecânicas de engajamento.
307
+ Não usar quando: precisar executá-las (sortear, abrir caixa, premiar) → managers correspondentes em `java-managers.md`.
308
+ Depende de: managers de cada mecânica.
309
+ Disponível em: Todos.
268
310
 
269
- ---
311
+ ### Descrição
312
+
313
+ Entidades das mecânicas de engajamento. Os documentos abaixo expõem apenas campos básicos; a lógica de execução vive nos managers.
270
314
 
271
- ### Notification
315
+ ### Uso
272
316
 
273
- **Coleção MongoDB:** `notification`
274
- **Classe:** `com.funifier.engine.notify.Notification`
317
+ | Entidade | Coleção | Classe | Campos básicos |
318
+ |---|---|---|---|
319
+ | Lottery | `lottery` | `com.funifier.engine.lottery.Lottery` | `_id`, `title`, `active` |
320
+ | LotteryTicket | `lottery_ticket` | `com.funifier.engine.lottery.LotteryTicket` | `_id`, `lottery`, `player` |
321
+ | MysteryBox | `mystery_box` | `com.funifier.engine.mystery.MysteryBox` | `_id`, `title`, `active` |
322
+ | Competition | `competition` | `com.funifier.engine.competition.Competition` | `_id`, `active` |
323
+ | Question | `question` | `com.funifier.engine.question.Question` | `_id`, `question` |
324
+ | QuestionLog | `question_log` | `com.funifier.engine.question.QuestionLog` | `_id`, `player`, `question` |
325
+ | Quiz / QuizLog | `quiz` / `quiz_log` | — | — |
326
+ | Swap | `swap` | `com.funifier.engine.swap.Swap` | — |
327
+ | Notification | `notification` | `com.funifier.engine.notify.Notification` | `_id`, `player`, `title`, `message`, `time` |
275
328
 
276
329
  ```java
277
- String _id; // ID da notificação
278
- String player; // ID do jogador destino
279
- String title; // Título
280
- String message; // Mensagem
281
- Date time; // Data
330
+ // Notification exemplo dos campos principais
331
+ String _id; // ID da notificação
332
+ String player; // ID do jogador destino
333
+ String title; // Título
334
+ String message; // Mensagem
335
+ Date time; // Data
282
336
  ```
283
337
 
284
- ---
338
+ ### Armadilhas conhecidas
285
339
 
286
- ### Swap
287
-
288
- **Coleção MongoDB:** `swap`
289
- **Classe:** `com.funifier.engine.swap.Swap`
340
+ > ⚠️ Documentação pendente: os campos completos de `Quiz`/`QuizLog` e `Swap` não estão detalhados nas fontes atuais. Consultar a API (`GET /v3/database/collections` + `?strict=true`) para inspecionar o documento real antes de manipular.
290
341
 
291
342
  ---
292
343
 
293
- ### Trigger
344
+ ## 10. Entidades de Infraestrutura
294
345
 
295
- **Coleção MongoDB:** `trigger`
296
- **Classe:** `com.funifier.engine.integration.trigger.Trigger`
346
+ Quando usar: ao ler/inspecionar configurações de trigger, scheduler, public endpoint ou webhook.
347
+ Não usar quando: precisar da mecânica de execução desses recursos → `modules/trigger.md`, `modules/scheduler.md`, `modules/public.md`, `modules/webhook.md`.
348
+ Depende de: —
349
+ Disponível em: Todos.
297
350
 
298
- ```java
299
- String _id; // ID da trigger
300
- String name; // Nome
301
- String entity; // Entidade (ex: "player", "achievement")
302
- String event; // Evento (ex: "before_create", "after_win")
303
- String script; // Código Java
304
- ```
351
+ ### Descrição
305
352
 
306
- ---
353
+ Entidades que representam os próprios recursos de extensão da plataforma (são persistidas e configuradas via Studio/API).
307
354
 
308
- ### SchedulerConfig
355
+ ### Uso
309
356
 
310
- **Coleção MongoDB:** `scheduler`
311
- **Classe:** `com.funifier.engine.integration.scheduler.SchedulerConfig`
357
+ **Trigger** coleção `trigger`, classe `com.funifier.engine.integration.trigger.Trigger`
358
+ ```java
359
+ String _id; // ID da trigger
360
+ String name; // Nome
361
+ String entity; // Entidade (ex: "player", "achievement")
362
+ String event; // Evento (ex: "before_create", "after_win")
363
+ String script; // Código Java/Groovy
364
+ ```
312
365
 
313
- ---
366
+ | Entidade | Coleção | Classe |
367
+ |---|---|---|
368
+ | SchedulerConfig | `scheduler` | `com.funifier.engine.integration.scheduler.SchedulerConfig` |
369
+ | PublicEndpoint | `public_endpoint` | `com.funifier.engine.pub.PublicEndpoint` |
370
+ | Webhook | `webhook` | `com.funifier.engine.webhook.Webhook` |
314
371
 
315
- ### PublicEndpoint
372
+ ### Armadilhas conhecidas
316
373
 
317
- **Coleção MongoDB:** `public_endpoint`
318
- **Classe:** `com.funifier.engine.pub.PublicEndpoint`
374
+ - **Atualizar uma Trigger/PublicEndpoint via `POST` parcial** → o `script` pode ser apagado (full replace). Ver a restrição de upsert completo em `patterns.md` §1.5.
319
375
 
320
376
  ---
321
377
 
322
- ### Webhook
378
+ ## 11. Mapeamento Completo Entidade → Coleção
323
379
 
324
- **Coleção MongoDB:** `webhook`
325
- **Classe:** `com.funifier.engine.webhook.Webhook`
380
+ Quando usar: para localizar a coleção MongoDB e a classe Java de qualquer entidade nativa.
381
+ Não usar quando: a coleção é customizada (`__c`) → §12.
382
+ Depende de: —
383
+ Disponível em: Todos.
326
384
 
327
- ---
328
-
329
- ## Mapeamento Completo Entidade → Coleção
385
+ ### Uso
330
386
 
331
387
  | Entidade | Coleção MongoDB | Classe Java |
332
388
  |----------|----------------|-------------|
@@ -370,4 +426,38 @@ String script; // Código Java
370
426
  | BACKUP | `backup` | Backup |
371
427
  | COMPACT | `compact` | Compact |
372
428
 
373
- > **Nota:** Coleções customizadas (Custom Objects) usam o sufixo `__c` (ex: `car__c`, `email__c`) e são acessadas como `HashMap`.
429
+ ### Armadilhas conhecidas
430
+
431
+ - **Coleções de log (`action_log`, `challenge_progress`, `player_status`) não aparecem no dropdown de entidades do Studio** — ver as exclusões em `trigger-examples.md`. Acesse-as por código/`/v3/database`.
432
+
433
+ ---
434
+
435
+ ## 12. Custom Objects (`__c`)
436
+
437
+ Quando usar: ao criar/manipular estruturas de dados próprias do negócio.
438
+ Não usar quando: a entidade já existe como nativa (§11) → use o endpoint nativo correspondente.
439
+ Depende de: `database-access.md` (CRUD genérico).
440
+ Disponível em: Todos.
441
+
442
+ ### Descrição
443
+
444
+ Coleções customizadas usam o sufixo `__c` (ex: `car__c`, `email__c`, `signup__c`). São acessadas como `HashMap` em código (não há classe Java tipada) e via `/v3/database/{collection}` na API. O sufixo é apenas convenção sobre o `DatabaseRest` genérico.
445
+
446
+ ### Uso
447
+
448
+ ```java
449
+ // Em trigger/scheduler/endpoint — entity de um __c é um HashMap
450
+ HashMap<String, Object> car = manager.getJongoConnection()
451
+ .getCollection("car__c")
452
+ .findOne("{_id:#}", "car001").as(HashMap.class);
453
+ ```
454
+
455
+ ```
456
+ POST /v3/database/car__c
457
+ { "_id": "car001", "name": "Civic", "brand": "Honda", "price": 50000 }
458
+ ```
459
+
460
+ ### Armadilhas conhecidas
461
+
462
+ - **Esperar getters tipados** (`car.getName()`) → é `HashMap`; use `car.get("name")`.
463
+ - **Ler/escrever campos `Date` sem `strict=true`** → tipo degradado (`patterns.md` §9). Detalhe em `database-access.md`.