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.
- package/.cursor/rules/funifier.mdc +38 -41
- package/.github/copilot-instructions.md +38 -41
- package/AGENTS.md +56 -49
- package/README.md +40 -22
- package/datasource-funifier-docs/.coverage.json +326 -0
- package/datasource-funifier-docs/.validation.json +593 -0
- package/datasource-funifier-docs/knowledge/guides/aggregates.md +182 -70
- package/datasource-funifier-docs/knowledge/guides/database-access.md +174 -88
- package/datasource-funifier-docs/knowledge/guides/java-entities.md +294 -204
- package/datasource-funifier-docs/knowledge/guides/java-libraries.md +202 -226
- package/datasource-funifier-docs/knowledge/guides/java-managers.md +343 -265
- package/datasource-funifier-docs/knowledge/guides/trigger-examples.md +180 -236
- package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +273 -191
- package/datasource-funifier-docs/knowledge/index.md +4 -1
- package/datasource-funifier-docs/knowledge/modules/achievement.md +1126 -28
- package/datasource-funifier-docs/knowledge/modules/action-log.md +469 -62
- package/datasource-funifier-docs/knowledge/modules/action.md +522 -70
- package/datasource-funifier-docs/knowledge/modules/auth.md +718 -69
- package/datasource-funifier-docs/knowledge/modules/avatar.md +483 -18
- package/datasource-funifier-docs/knowledge/modules/backup.md +603 -25
- package/datasource-funifier-docs/knowledge/modules/challenge.md +1048 -220
- package/datasource-funifier-docs/knowledge/modules/compact.md +469 -26
- package/datasource-funifier-docs/knowledge/modules/competition.md +811 -109
- package/datasource-funifier-docs/knowledge/modules/crossword.md +504 -28
- package/datasource-funifier-docs/knowledge/modules/csv-data.md +645 -20
- package/datasource-funifier-docs/knowledge/modules/custom-object.md +701 -36
- package/datasource-funifier-docs/knowledge/modules/database.md +730 -164
- package/datasource-funifier-docs/knowledge/modules/folder.md +935 -280
- package/datasource-funifier-docs/knowledge/modules/kpi-formulas.md +410 -15
- package/datasource-funifier-docs/knowledge/modules/lastmile.md +568 -29
- package/datasource-funifier-docs/knowledge/modules/leaderboard.md +595 -126
- package/datasource-funifier-docs/knowledge/modules/level.md +536 -54
- package/datasource-funifier-docs/knowledge/modules/lottery.md +809 -76
- package/datasource-funifier-docs/knowledge/modules/marketplace.md +688 -17
- package/datasource-funifier-docs/knowledge/modules/mystery.md +662 -52
- package/datasource-funifier-docs/knowledge/modules/notification.md +564 -26
- package/datasource-funifier-docs/knowledge/modules/patterns.md +519 -814
- package/datasource-funifier-docs/knowledge/modules/player.md +773 -73
- package/datasource-funifier-docs/knowledge/modules/point.md +380 -83
- package/datasource-funifier-docs/knowledge/modules/public.md +508 -178
- package/datasource-funifier-docs/knowledge/modules/question.md +619 -99
- package/datasource-funifier-docs/knowledge/modules/quiz.md +565 -120
- package/datasource-funifier-docs/knowledge/modules/scheduler.md +1092 -39
- package/datasource-funifier-docs/knowledge/modules/security.md +674 -112
- package/datasource-funifier-docs/knowledge/modules/staging.md +742 -19
- package/datasource-funifier-docs/knowledge/modules/story.md +565 -29
- package/datasource-funifier-docs/knowledge/modules/studio-page.md +470 -144
- package/datasource-funifier-docs/knowledge/modules/swap.md +552 -84
- package/datasource-funifier-docs/knowledge/modules/team.md +563 -45
- package/datasource-funifier-docs/knowledge/modules/trigger.md +876 -134
- package/datasource-funifier-docs/knowledge/modules/upload.md +468 -95
- package/datasource-funifier-docs/knowledge/modules/virtual-good.md +510 -63
- package/datasource-funifier-docs/knowledge/modules/webhook.md +375 -28
- package/datasource-funifier-docs/knowledge/modules/websocket.md +459 -26
- package/datasource-funifier-docs/knowledge/modules/widget.md +613 -27
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +42 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/init.test.js +74 -3
- package/dist/cli/init.test.js.map +1 -1
- package/dist/cli/persona.d.ts +3 -0
- package/dist/cli/persona.d.ts.map +1 -0
- package/dist/cli/persona.js +25 -0
- package/dist/cli/persona.js.map +1 -0
- package/dist/mcp/bundle.js +119 -93
- package/dist/mcp/check-update.d.ts +5 -0
- package/dist/mcp/check-update.d.ts.map +1 -1
- package/dist/mcp/check-update.js +21 -10
- package/dist/mcp/check-update.js.map +1 -1
- package/dist/mcp/check-update.test.d.ts +2 -0
- package/dist/mcp/check-update.test.d.ts.map +1 -0
- package/dist/mcp/check-update.test.js +33 -0
- package/dist/mcp/check-update.test.js.map +1 -0
- package/dist/mcp/index.js +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/prompts/templates.d.ts.map +1 -1
- package/dist/mcp/prompts/templates.js +35 -0
- package/dist/mcp/prompts/templates.js.map +1 -1
- package/dist/mcp/resources/documentation.d.ts +1 -1
- package/dist/mcp/resources/documentation.d.ts.map +1 -1
- package/dist/mcp/resources/documentation.js +39 -3
- package/dist/mcp/resources/documentation.js.map +1 -1
- package/dist/mcp/tools/connect.d.ts.map +1 -1
- package/dist/mcp/tools/connect.js +18 -8
- package/dist/mcp/tools/connect.js.map +1 -1
- package/dist/mcp/tools/database.d.ts.map +1 -1
- package/dist/mcp/tools/database.js +59 -47
- package/dist/mcp/tools/database.js.map +1 -1
- package/dist/mcp/tools/database.test.js +2 -2
- package/dist/mcp/tools/database.test.js.map +1 -1
- package/dist/mcp/tools/delete.d.ts.map +1 -1
- package/dist/mcp/tools/delete.js +13 -3
- package/dist/mcp/tools/delete.js.map +1 -1
- package/dist/mcp/tools/execute.d.ts.map +1 -1
- package/dist/mcp/tools/execute.js +20 -9
- package/dist/mcp/tools/execute.js.map +1 -1
- package/dist/mcp/tools/folder.d.ts.map +1 -1
- package/dist/mcp/tools/folder.js +22 -12
- package/dist/mcp/tools/folder.js.map +1 -1
- package/dist/mcp/tools/get.d.ts.map +1 -1
- package/dist/mcp/tools/get.js +16 -6
- package/dist/mcp/tools/get.js.map +1 -1
- package/dist/mcp/tools/index.d.ts +1 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +28 -1
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/list.d.ts.map +1 -1
- package/dist/mcp/tools/list.js +38 -14
- package/dist/mcp/tools/list.js.map +1 -1
- package/dist/mcp/tools/logs.d.ts.map +1 -1
- package/dist/mcp/tools/logs.js +15 -5
- package/dist/mcp/tools/logs.js.map +1 -1
- package/dist/mcp/tools/save.d.ts.map +1 -1
- package/dist/mcp/tools/save.js +14 -4
- package/dist/mcp/tools/save.js.map +1 -1
- package/dist/mcp/tools/save.test.js +3 -3
- package/dist/mcp/tools/save.test.js.map +1 -1
- package/dist/mcp/tools/search-docs.d.ts +3 -0
- package/dist/mcp/tools/search-docs.d.ts.map +1 -0
- package/dist/mcp/tools/search-docs.js +102 -0
- package/dist/mcp/tools/search-docs.js.map +1 -0
- package/package.json +6 -2
- package/skills/acquire-funifier-knowledge/SKILL.md +155 -0
- package/skills/acquire-funifier-knowledge/assets/templates/CONCERNS.md +25 -0
- package/skills/acquire-funifier-knowledge/assets/templates/CUSTOM_ENDPOINTS.md +24 -0
- package/skills/acquire-funifier-knowledge/assets/templates/CUSTOM_PAGES.md +24 -0
- package/skills/acquire-funifier-knowledge/assets/templates/GAME_MECHANICS.md +35 -0
- package/skills/acquire-funifier-knowledge/assets/templates/INTEGRATIONS.md +35 -0
- package/skills/acquire-funifier-knowledge/assets/templates/LEADERBOARDS.md +24 -0
- package/skills/acquire-funifier-knowledge/assets/templates/OVERVIEW.md +86 -0
- package/skills/acquire-funifier-knowledge/assets/templates/PLAYER_MODEL.md +31 -0
- package/skills/acquire-funifier-knowledge/assets/templates/SCHEDULERS.md +25 -0
- package/skills/acquire-funifier-knowledge/assets/templates/TECHNIQUES_AND_PATTERNS.md +26 -0
- package/skills/acquire-funifier-knowledge/assets/templates/TRIGGERS.md +27 -0
- package/skills/acquire-funifier-knowledge/references/funifier-inventory-checklist.md +81 -0
- package/skills/acquire-funifier-knowledge/references/game-techniques-taxonomy.md +62 -0
- package/skills/acquire-funifier-knowledge/references/mcp-call-patterns.md +118 -0
- package/skills/funifier/SKILL.md +88 -0
- package/skills/funifier/references/configure-security.md +96 -0
- package/skills/{funifier-create-action/SKILL.md → funifier/references/create-action.md} +0 -33
- package/skills/funifier/references/create-aggregate.md +144 -0
- package/skills/funifier/references/create-challenge.md +116 -0
- package/skills/funifier/references/create-competition.md +98 -0
- package/skills/funifier/references/create-crossword.md +574 -0
- package/skills/funifier/references/create-custom-object.md +91 -0
- package/skills/funifier/references/create-custom-page.md +135 -0
- package/skills/funifier/references/create-folder.md +104 -0
- package/skills/funifier/references/create-lastmile.md +643 -0
- package/skills/{funifier-create-leaderboard/SKILL.md → funifier/references/create-leaderboard.md} +0 -33
- package/skills/funifier/references/create-level.md +94 -0
- package/skills/funifier/references/create-lottery.md +913 -0
- package/skills/funifier/references/create-mystery.md +769 -0
- package/skills/funifier/references/create-notification.md +75 -0
- package/skills/{funifier-create-point/SKILL.md → funifier/references/create-point.md} +0 -33
- package/skills/funifier/references/create-quiz.md +98 -0
- package/skills/funifier/references/create-scheduler.md +141 -0
- package/skills/funifier/references/create-story.md +636 -0
- package/skills/funifier/references/create-swap.md +95 -0
- package/skills/{funifier-create-trigger/SKILL.md → funifier/references/create-trigger.md} +0 -33
- package/skills/funifier/references/create-virtual-good.md +96 -0
- package/skills/funifier/references/create-webhook.md +72 -0
- package/skills/funifier/references/create-websocket.md +71 -0
- package/skills/funifier/references/create-widget.md +76 -0
- package/skills/funifier/references/debug.md +87 -0
- package/skills/funifier/references/help.md +81 -0
- package/skills/funifier/references/implement-frontend.md +106 -0
- package/skills/funifier/references/import-csv.md +75 -0
- package/skills/funifier/references/manage-player.md +82 -0
- package/skills/funifier/references/manage-team.md +76 -0
- package/skills/funifier/references/upload-file.md +91 -0
- package/skills/funifier-create-aggregate/SKILL.md +0 -127
- package/skills/funifier-create-challenge/SKILL.md +0 -88
- package/skills/funifier-create-custom-page/SKILL.md +0 -127
- package/skills/funifier-create-level/SKILL.md +0 -87
- package/skills/funifier-create-quiz/SKILL.md +0 -87
- package/skills/funifier-create-scheduler/SKILL.md +0 -127
- package/skills/funifier-create-virtual-good/SKILL.md +0 -87
- package/skills/funifier-debug/SKILL.md +0 -92
- package/skills/funifier-help/SKILL.md +0 -86
- package/skills/funifier-implement-frontend/SKILL.md +0 -90
- package/skills/funifier-index/SKILL.md +0 -58
|
@@ -1,332 +1,388 @@
|
|
|
1
1
|
# Java Entities — Referência
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## 1. Visão Geral
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
### 1.1 O que é este documento
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
###
|
|
9
|
+
### 1.2 Quando consultar
|
|
10
10
|
|
|
11
|
-
**
|
|
12
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
36
|
-
**Classe:** `com.funifier.engine.achievement.Achievement`
|
|
38
|
+
### 1.5 Restrições globais críticas
|
|
37
39
|
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
67
|
+
### Uso
|
|
68
68
|
|
|
69
69
|
```java
|
|
70
|
-
//
|
|
71
|
-
String
|
|
72
|
-
String
|
|
73
|
-
String
|
|
74
|
-
|
|
75
|
-
|
|
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": "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
104
|
+
### Uso
|
|
90
105
|
|
|
91
106
|
```java
|
|
92
|
-
//
|
|
93
|
-
String
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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": "
|
|
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
|
-
|
|
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
|
-
|
|
108
|
-
**Classe:** `com.funifier.engine.challenge.Challenge`
|
|
146
|
+
### Descrição
|
|
109
147
|
|
|
110
|
-
|
|
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
|
-
//
|
|
114
|
-
String
|
|
115
|
-
String
|
|
116
|
-
|
|
117
|
-
|
|
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": "
|
|
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
|
-
|
|
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
|
-
|
|
130
|
-
**Classe:** `com.funifier.engine.catalog.CatalogItem`
|
|
178
|
+
### Descrição
|
|
131
179
|
|
|
132
|
-
|
|
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
|
-
//
|
|
136
|
-
String
|
|
137
|
-
|
|
138
|
-
|
|
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": "
|
|
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
|
-
|
|
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
|
-
|
|
153
|
-
**Classe:** `com.funifier.engine.team.Team`
|
|
199
|
+
---
|
|
154
200
|
|
|
155
|
-
|
|
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
|
-
|
|
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
|
-
|
|
165
|
-
**Classe:** `com.funifier.engine.level.Level`
|
|
212
|
+
### Uso
|
|
166
213
|
|
|
167
214
|
```java
|
|
168
|
-
String _id;
|
|
169
|
-
String
|
|
170
|
-
|
|
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
|
-
|
|
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
|
-
|
|
178
|
-
**Classe:** `com.funifier.engine.point.PointCategory`
|
|
226
|
+
### Armadilhas conhecidas
|
|
179
227
|
|
|
180
|
-
|
|
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
|
-
|
|
232
|
+
## 7. CatalogItem
|
|
190
233
|
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
203
|
-
|
|
204
|
-
**Coleção MongoDB:** `lottery_ticket`
|
|
205
|
-
**Classe:** `com.funifier.engine.lottery.LotteryTicket`
|
|
243
|
+
### Uso
|
|
206
244
|
|
|
207
245
|
```java
|
|
208
|
-
String _id;
|
|
209
|
-
String
|
|
210
|
-
String
|
|
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
|
-
|
|
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
|
-
|
|
218
|
-
**Classe:** `com.funifier.engine.mystery.MysteryBox`
|
|
258
|
+
### Armadilhas conhecidas
|
|
219
259
|
|
|
220
|
-
|
|
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
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
273
|
+
Entidades de configuração das mecânicas. Estruturas simples, manipuladas majoritariamente via managers.
|
|
241
274
|
|
|
242
|
-
|
|
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;
|
|
247
|
-
String
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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;
|
|
259
|
-
String
|
|
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
|
-
|
|
304
|
+
## 9. Entidades de Engajamento
|
|
266
305
|
|
|
267
|
-
|
|
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
|
-
###
|
|
315
|
+
### Uso
|
|
272
316
|
|
|
273
|
-
|
|
274
|
-
|
|
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
|
-
|
|
278
|
-
String
|
|
279
|
-
String
|
|
280
|
-
String
|
|
281
|
-
|
|
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
|
-
|
|
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
|
-
|
|
344
|
+
## 10. Entidades de Infraestrutura
|
|
294
345
|
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
355
|
+
### Uso
|
|
309
356
|
|
|
310
|
-
**
|
|
311
|
-
|
|
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
|
-
###
|
|
372
|
+
### Armadilhas conhecidas
|
|
316
373
|
|
|
317
|
-
**
|
|
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
|
-
|
|
378
|
+
## 11. Mapeamento Completo Entidade → Coleção
|
|
323
379
|
|
|
324
|
-
|
|
325
|
-
|
|
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
|
-
|
|
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`.
|