funifier-mcp 0.2.0 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/.cursor/rules/funifier.mdc +91 -0
  2. package/.github/copilot-instructions.md +83 -0
  3. package/AGENTS.md +97 -0
  4. package/README.md +247 -78
  5. package/datasource-funifier-docs/knowledge/guides/aggregates.md +152 -152
  6. package/datasource-funifier-docs/knowledge/guides/database-access.md +132 -132
  7. package/datasource-funifier-docs/knowledge/guides/java-entities.md +373 -373
  8. package/datasource-funifier-docs/knowledge/guides/java-libraries.md +330 -330
  9. package/datasource-funifier-docs/knowledge/guides/java-managers.md +509 -509
  10. package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +271 -271
  11. package/datasource-funifier-docs/knowledge/index.md +121 -121
  12. package/datasource-funifier-docs/knowledge/modules/achievement.md +46 -46
  13. package/datasource-funifier-docs/knowledge/modules/action-log.md +88 -88
  14. package/datasource-funifier-docs/knowledge/modules/action.md +80 -80
  15. package/datasource-funifier-docs/knowledge/modules/auth.md +104 -104
  16. package/datasource-funifier-docs/knowledge/modules/avatar.md +28 -28
  17. package/datasource-funifier-docs/knowledge/modules/backup.md +40 -40
  18. package/datasource-funifier-docs/knowledge/modules/challenge.md +91 -91
  19. package/datasource-funifier-docs/knowledge/modules/compact.md +40 -40
  20. package/datasource-funifier-docs/knowledge/modules/competition.md +149 -149
  21. package/datasource-funifier-docs/knowledge/modules/crossword.md +41 -41
  22. package/datasource-funifier-docs/knowledge/modules/csv-data.md +30 -30
  23. package/datasource-funifier-docs/knowledge/modules/custom-object.md +53 -53
  24. package/datasource-funifier-docs/knowledge/modules/database.md +241 -241
  25. package/datasource-funifier-docs/knowledge/modules/folder.md +111 -111
  26. package/datasource-funifier-docs/knowledge/modules/kpi-formulas.md +23 -23
  27. package/datasource-funifier-docs/knowledge/modules/lastmile.md +45 -45
  28. package/datasource-funifier-docs/knowledge/modules/leaderboard.md +98 -98
  29. package/datasource-funifier-docs/knowledge/modules/level.md +83 -83
  30. package/datasource-funifier-docs/knowledge/modules/lottery.md +112 -112
  31. package/datasource-funifier-docs/knowledge/modules/marketplace.md +27 -27
  32. package/datasource-funifier-docs/knowledge/modules/mystery.md +82 -82
  33. package/datasource-funifier-docs/knowledge/modules/notification.md +40 -40
  34. package/datasource-funifier-docs/knowledge/modules/patterns.md +1096 -1096
  35. package/datasource-funifier-docs/knowledge/modules/player.md +101 -101
  36. package/datasource-funifier-docs/knowledge/modules/point.md +67 -67
  37. package/datasource-funifier-docs/knowledge/modules/public.md +253 -253
  38. package/datasource-funifier-docs/knowledge/modules/question.md +136 -136
  39. package/datasource-funifier-docs/knowledge/modules/quiz.md +163 -163
  40. package/datasource-funifier-docs/knowledge/modules/scheduler.md +58 -58
  41. package/datasource-funifier-docs/knowledge/modules/security.md +169 -169
  42. package/datasource-funifier-docs/knowledge/modules/staging.md +28 -28
  43. package/datasource-funifier-docs/knowledge/modules/static-repo.md +41 -41
  44. package/datasource-funifier-docs/knowledge/modules/story.md +42 -42
  45. package/datasource-funifier-docs/knowledge/modules/studio-page.md +180 -180
  46. package/datasource-funifier-docs/knowledge/modules/swap.md +132 -132
  47. package/datasource-funifier-docs/knowledge/modules/team.md +75 -75
  48. package/datasource-funifier-docs/knowledge/modules/trigger.md +189 -189
  49. package/datasource-funifier-docs/knowledge/modules/upload.md +155 -155
  50. package/datasource-funifier-docs/knowledge/modules/virtual-good.md +99 -99
  51. package/datasource-funifier-docs/knowledge/modules/webhook.md +41 -41
  52. package/datasource-funifier-docs/knowledge/modules/websocket.md +41 -41
  53. package/datasource-funifier-docs/knowledge/modules/widget.md +42 -42
  54. package/datasource-funifier-docs/process-gtm-saas.md +143 -143
  55. package/datasource-funifier-docs/process-instagram.md +88 -88
  56. package/datasource-funifier-docs/process.md +1826 -1826
  57. package/datasource-funifier-docs/readme.md +132 -132
  58. package/dist/cli/config-writers.js +11 -11
  59. package/dist/mcp/bundle.js +82 -77
  60. package/package.json +70 -67
  61. package/skills/funifier-create-aggregate/SKILL.md +126 -126
  62. package/skills/funifier-create-custom-page/SKILL.md +126 -126
  63. package/skills/funifier-create-scheduler/SKILL.md +126 -126
  64. package/skills/funifier-create-trigger/SKILL.md +127 -127
@@ -1,152 +1,152 @@
1
- # Aggregates Funifier
2
-
3
- A plataforma Funifier utiliza o MongoDB como banco de dados, permitindo consultas avançadas por meio de **aggregates**. Esta funcionalidade é fundamental para extrair relatórios, gerar indicadores personalizados e construir dashboards.
4
-
5
- ## Como Executar
6
-
7
- **Método:** POST
8
- **Endpoint:** `/v3/database/{collection}/aggregate`
9
- **Body:** Pipeline JSON com comandos aggregate
10
-
11
- ## Principais Coleções
12
-
13
- ### player
14
- Jogadores da gamificação.
15
- ```json
16
- {"_id": "john", "name": "John Travolta", "email": "john@funifier.com", "teams": ["sales"], "extra": {"country": "USA", "department": "IT"}, "created": {"$date": "2023-07-05T20:57:25.776Z"}}
17
- ```
18
-
19
- ### action
20
- Configurações dos tipos de ações.
21
- ```json
22
- {"_id": "sell", "action": "Sell", "attributes": [{"name": "product", "type": "String"}, {"name": "price", "type": "Number"}], "active": true}
23
- ```
24
-
25
- ### action_log
26
- Ações executadas pelos jogadores. Campo `userId` → `player._id`. Campo `actionId` → `action._id`.
27
- ```json
28
- {"_id": "64a5d92", "actionId": "sell", "userId": "john", "time": {"$date": "2023-07-05T20:57:33.303Z"}, "attributes": {"product": "book", "price": 120}}
29
- ```
30
-
31
- ### achievement
32
- Conquistas dos jogadores. Campo `type`: 0=Point, 1=Challenge, 2=Virtual Good, 3=Level. Campo `player` → `player._id`.
33
- ```json
34
- {"_id": "64a5d2", "player": "john", "total": 25.0, "type": 0, "item": "xp", "time": {"$date": "2023-07-05T20:57:33.303Z"}}
35
- ```
36
-
37
- ### challenge
38
- Desafios da gamificação.
39
- ```json
40
- {"challenge": "Watch Video", "active": true, "_id": "DTo8dS3", "rules": [{"actionId": "watch_video", "operator": 5, "total": 0}], "points": [{"total": 10.0, "category": "xp", "operation": 0}]}
41
- ```
42
-
43
- ### point_category
44
- Tipos de pontos.
45
- ```json
46
- {"_id": "xp", "category": "Experience Points", "shortName": "XP", "extra": {}}
47
- ```
48
-
49
- ### catalog_item
50
- Itens da loja virtual.
51
- ```json
52
- {"_id": "prd1", "catalogId": "gifts", "name": "T-shirt", "amount": 100, "active": true, "requires": [{"total": 15, "type": 0, "item": "coin", "operation": 1}]}
53
- ```
54
-
55
- ## Expressões de Data (Funifier Syntax)
56
-
57
- Formato: `[sinal][quantidade][unidade][ajuste opcional]`
58
-
59
- | Expressão | Significado |
60
- |-----------|------------|
61
- | `-0d` | Agora |
62
- | `-0d-` | Início do dia atual (00:00:00) |
63
- | `-0d+` | Fim do dia atual (23:59:59) |
64
- | `-1d` | Exatamente um dia atrás |
65
- | `-1d-` | Início do dia anterior (00:00:00) |
66
- | `-1d+` | Fim do dia anterior (23:59:59) |
67
- | `-0w-` | Início da semana atual |
68
- | `-0w+` | Fim da semana atual |
69
- | `-1w` | Exatamente uma semana atrás |
70
- | `-0M-` | Início do mês atual |
71
- | `-0M+` | Fim do mês atual |
72
- | `-1M` | Exatamente um mês atrás |
73
- | `-1M-` | Início do mês anterior |
74
- | `-0y-` | Início do ano atual |
75
- | `-0y+` | Fim do ano atual |
76
-
77
- **Unidades:** `m`=minuto, `h`=hora, `d`=dia, `w`=semana, `M`=mês, `y`=ano
78
-
79
- **Uso em filtros:**
80
- ```json
81
- {"$date": "-0M-"}
82
- ```
83
-
84
- ## Operadores Suportados
85
-
86
- `$match`, `$group`, `$sort`, `$limit`, `$lookup`, `$project`, `$unwind`, `$addFields`, `$count`
87
-
88
- ## Exemplos Práticos
89
-
90
- ### Exemplo 1: Top 10 jogadores com mais pontos XP no mês atual
91
-
92
- ```json
93
- // POST /v3/database/achievement/aggregate
94
- [
95
- {"$match": {"type": 0, "item": "xp", "time": {"$gte": {"$date": "-0M-"}, "$lte": {"$date": "-0M+"}}}},
96
- {"$group": {"_id": "$player", "total": {"$sum": "$total"}}},
97
- {"$sort": {"total": -1}},
98
- {"$lookup": {"from": "player", "localField": "_id", "foreignField": "_id", "as": "p"}},
99
- {"$unwind": "$p"},
100
- {"$project": {"_id": 1, "player": "$p.name", "total": 1}},
101
- {"$limit": 10}
102
- ]
103
- ```
104
-
105
- ### Exemplo 2: Quantos jogadores distintos completaram um desafio
106
-
107
- ```json
108
- // POST /v3/database/achievement/aggregate
109
- [
110
- {"$match": {"type": 1, "item": "DTo8dS3"}},
111
- {"$group": {"_id": "$player", "challenge": {"$first": "$item"}}},
112
- {"$group": {"_id": "$challenge", "total_players": {"$sum": 1}}},
113
- {"$lookup": {"from": "challenge", "localField": "_id", "foreignField": "_id", "as": "c"}},
114
- {"$project": {"_id": 1, "total_players": 1, "challenge_name": {"$first": "$c.challenge"}}}
115
- ]
116
- ```
117
-
118
- ### Exemplo 3: Média de pontos XP por jogador em um mês específico
119
-
120
- ```json
121
- // POST /v3/database/achievement/aggregate
122
- [
123
- {"$match": {"type": 0, "item": "xp", "time": {"$gte": {"$date": "2023-08-01T00:00:00.000Z"}, "$lte": {"$date": "2023-08-31T23:59:59.999Z"}}}},
124
- {"$group": {"_id": "$player", "averageXP": {"$avg": "$total"}}}
125
- ]
126
- ```
127
-
128
- ### Exemplo 4: Top 3 itens mais vendidos na loja virtual este ano
129
-
130
- ```json
131
- // POST /v3/database/achievement/aggregate
132
- [
133
- {"$match": {"type": 2, "time": {"$gte": {"$date": "-0y-"}, "$lte": {"$date": "-0y+"}}}},
134
- {"$group": {"_id": "$item", "totalSold": {"$sum": "$total"}}},
135
- {"$lookup": {"from": "catalog_item", "localField": "_id", "foreignField": "_id", "as": "ci"}},
136
- {"$project": {"_id": 1, "catalogItemName": {"$first": "$ci.name"}, "totalSold": 1}},
137
- {"$sort": {"totalSold": -1}},
138
- {"$limit": 3}
139
- ]
140
- ```
141
-
142
- ### Exemplo 5: Jogadores que executaram ações ontem
143
-
144
- ```json
145
- // POST /v3/database/action_log/aggregate
146
- [
147
- {"$match": {"time": {"$gte": {"$date": "-1d-"}, "$lte": {"$date": "-1d+"}}}},
148
- {"$group": {"_id": "$userId"}},
149
- {"$lookup": {"from": "player", "localField": "_id", "foreignField": "_id", "as": "p"}},
150
- {"$project": {"_id": 1, "playerName": {"$first": "$p.name"}}}
151
- ]
152
- ```
1
+ # Aggregates Funifier
2
+
3
+ A plataforma Funifier utiliza o MongoDB como banco de dados, permitindo consultas avançadas por meio de **aggregates**. Esta funcionalidade é fundamental para extrair relatórios, gerar indicadores personalizados e construir dashboards.
4
+
5
+ ## Como Executar
6
+
7
+ **Método:** POST
8
+ **Endpoint:** `/v3/database/{collection}/aggregate`
9
+ **Body:** Pipeline JSON com comandos aggregate
10
+
11
+ ## Principais Coleções
12
+
13
+ ### player
14
+ Jogadores da gamificação.
15
+ ```json
16
+ {"_id": "john", "name": "John Travolta", "email": "john@funifier.com", "teams": ["sales"], "extra": {"country": "USA", "department": "IT"}, "created": {"$date": "2023-07-05T20:57:25.776Z"}}
17
+ ```
18
+
19
+ ### action
20
+ Configurações dos tipos de ações.
21
+ ```json
22
+ {"_id": "sell", "action": "Sell", "attributes": [{"name": "product", "type": "String"}, {"name": "price", "type": "Number"}], "active": true}
23
+ ```
24
+
25
+ ### action_log
26
+ Ações executadas pelos jogadores. Campo `userId` → `player._id`. Campo `actionId` → `action._id`.
27
+ ```json
28
+ {"_id": "64a5d92", "actionId": "sell", "userId": "john", "time": {"$date": "2023-07-05T20:57:33.303Z"}, "attributes": {"product": "book", "price": 120}}
29
+ ```
30
+
31
+ ### achievement
32
+ Conquistas dos jogadores. Campo `type`: 0=Point, 1=Challenge, 2=Virtual Good, 3=Level. Campo `player` → `player._id`.
33
+ ```json
34
+ {"_id": "64a5d2", "player": "john", "total": 25.0, "type": 0, "item": "xp", "time": {"$date": "2023-07-05T20:57:33.303Z"}}
35
+ ```
36
+
37
+ ### challenge
38
+ Desafios da gamificação.
39
+ ```json
40
+ {"challenge": "Watch Video", "active": true, "_id": "DTo8dS3", "rules": [{"actionId": "watch_video", "operator": 5, "total": 0}], "points": [{"total": 10.0, "category": "xp", "operation": 0}]}
41
+ ```
42
+
43
+ ### point_category
44
+ Tipos de pontos.
45
+ ```json
46
+ {"_id": "xp", "category": "Experience Points", "shortName": "XP", "extra": {}}
47
+ ```
48
+
49
+ ### catalog_item
50
+ Itens da loja virtual.
51
+ ```json
52
+ {"_id": "prd1", "catalogId": "gifts", "name": "T-shirt", "amount": 100, "active": true, "requires": [{"total": 15, "type": 0, "item": "coin", "operation": 1}]}
53
+ ```
54
+
55
+ ## Expressões de Data (Funifier Syntax)
56
+
57
+ Formato: `[sinal][quantidade][unidade][ajuste opcional]`
58
+
59
+ | Expressão | Significado |
60
+ |-----------|------------|
61
+ | `-0d` | Agora |
62
+ | `-0d-` | Início do dia atual (00:00:00) |
63
+ | `-0d+` | Fim do dia atual (23:59:59) |
64
+ | `-1d` | Exatamente um dia atrás |
65
+ | `-1d-` | Início do dia anterior (00:00:00) |
66
+ | `-1d+` | Fim do dia anterior (23:59:59) |
67
+ | `-0w-` | Início da semana atual |
68
+ | `-0w+` | Fim da semana atual |
69
+ | `-1w` | Exatamente uma semana atrás |
70
+ | `-0M-` | Início do mês atual |
71
+ | `-0M+` | Fim do mês atual |
72
+ | `-1M` | Exatamente um mês atrás |
73
+ | `-1M-` | Início do mês anterior |
74
+ | `-0y-` | Início do ano atual |
75
+ | `-0y+` | Fim do ano atual |
76
+
77
+ **Unidades:** `m`=minuto, `h`=hora, `d`=dia, `w`=semana, `M`=mês, `y`=ano
78
+
79
+ **Uso em filtros:**
80
+ ```json
81
+ {"$date": "-0M-"}
82
+ ```
83
+
84
+ ## Operadores Suportados
85
+
86
+ `$match`, `$group`, `$sort`, `$limit`, `$lookup`, `$project`, `$unwind`, `$addFields`, `$count`
87
+
88
+ ## Exemplos Práticos
89
+
90
+ ### Exemplo 1: Top 10 jogadores com mais pontos XP no mês atual
91
+
92
+ ```json
93
+ // POST /v3/database/achievement/aggregate
94
+ [
95
+ {"$match": {"type": 0, "item": "xp", "time": {"$gte": {"$date": "-0M-"}, "$lte": {"$date": "-0M+"}}}},
96
+ {"$group": {"_id": "$player", "total": {"$sum": "$total"}}},
97
+ {"$sort": {"total": -1}},
98
+ {"$lookup": {"from": "player", "localField": "_id", "foreignField": "_id", "as": "p"}},
99
+ {"$unwind": "$p"},
100
+ {"$project": {"_id": 1, "player": "$p.name", "total": 1}},
101
+ {"$limit": 10}
102
+ ]
103
+ ```
104
+
105
+ ### Exemplo 2: Quantos jogadores distintos completaram um desafio
106
+
107
+ ```json
108
+ // POST /v3/database/achievement/aggregate
109
+ [
110
+ {"$match": {"type": 1, "item": "DTo8dS3"}},
111
+ {"$group": {"_id": "$player", "challenge": {"$first": "$item"}}},
112
+ {"$group": {"_id": "$challenge", "total_players": {"$sum": 1}}},
113
+ {"$lookup": {"from": "challenge", "localField": "_id", "foreignField": "_id", "as": "c"}},
114
+ {"$project": {"_id": 1, "total_players": 1, "challenge_name": {"$first": "$c.challenge"}}}
115
+ ]
116
+ ```
117
+
118
+ ### Exemplo 3: Média de pontos XP por jogador em um mês específico
119
+
120
+ ```json
121
+ // POST /v3/database/achievement/aggregate
122
+ [
123
+ {"$match": {"type": 0, "item": "xp", "time": {"$gte": {"$date": "2023-08-01T00:00:00.000Z"}, "$lte": {"$date": "2023-08-31T23:59:59.999Z"}}}},
124
+ {"$group": {"_id": "$player", "averageXP": {"$avg": "$total"}}}
125
+ ]
126
+ ```
127
+
128
+ ### Exemplo 4: Top 3 itens mais vendidos na loja virtual este ano
129
+
130
+ ```json
131
+ // POST /v3/database/achievement/aggregate
132
+ [
133
+ {"$match": {"type": 2, "time": {"$gte": {"$date": "-0y-"}, "$lte": {"$date": "-0y+"}}}},
134
+ {"$group": {"_id": "$item", "totalSold": {"$sum": "$total"}}},
135
+ {"$lookup": {"from": "catalog_item", "localField": "_id", "foreignField": "_id", "as": "ci"}},
136
+ {"$project": {"_id": 1, "catalogItemName": {"$first": "$ci.name"}, "totalSold": 1}},
137
+ {"$sort": {"totalSold": -1}},
138
+ {"$limit": 3}
139
+ ]
140
+ ```
141
+
142
+ ### Exemplo 5: Jogadores que executaram ações ontem
143
+
144
+ ```json
145
+ // POST /v3/database/action_log/aggregate
146
+ [
147
+ {"$match": {"time": {"$gte": {"$date": "-1d-"}, "$lte": {"$date": "-1d+"}}}},
148
+ {"$group": {"_id": "$userId"}},
149
+ {"$lookup": {"from": "player", "localField": "_id", "foreignField": "_id", "as": "p"}},
150
+ {"$project": {"_id": 1, "playerName": {"$first": "$p.name"}}}
151
+ ]
152
+ ```
@@ -1,132 +1,132 @@
1
- # Acesso ao Banco de Dados Funifier
2
-
3
- A plataforma Funifier oferece duas formas principais de acessar e manipular os dados da gamificação:
4
-
5
- 1. **Via API REST** — endpoint `/v3/database`
6
- 2. **Via código Java** — objeto `manager` em triggers, schedulers e public endpoints
7
-
8
- Ambas utilizam **MongoDB** como banco de dados.
9
-
10
- ---
11
-
12
- ## 1. Acesso via API — Endpoint `/v3/database`
13
-
14
- ### 1.1 Listar Coleções Disponíveis
15
-
16
- **Método:** GET
17
- **Endpoint:** `/v3/database/collections`
18
-
19
- **Resposta:**
20
- ```json
21
- ["player", "action_log", "achievement", "challenge", "car__c", "email__c"]
22
- ```
23
-
24
- ### 1.2 Operações CRUD
25
-
26
- | Operação | Método | Endpoint | Descrição |
27
- |----------|--------|----------|-----------|
28
- | Create | POST | `/v3/database/:collection` | Cria um novo registro |
29
- | Read | GET | `/v3/database/:collection` | Lista registros da coleção |
30
- | Update | PUT | `/v3/database/:collection` | Atualiza registro existente (via `_id`) |
31
- | Delete | DELETE | `/v3/database/:collection?q=...` | Remove registros com filtro |
32
- | Bulk Insert | POST | `/v3/database/:collection/bulk` | Cria/atualiza múltiplos registros |
33
-
34
- **Exemplo — Criar item na coleção `car__c`:**
35
- ```
36
- POST /v3/database/car__c
37
- ```
38
- ```json
39
- {
40
- "_id": "car001",
41
- "name": "Civic",
42
- "brand": "Honda",
43
- "price": 50000
44
- }
45
- ```
46
-
47
- ### 1.3 Executar Aggregates
48
-
49
- **Método:** POST
50
- **Endpoint:** `/v3/database/:collection/aggregate`
51
-
52
- **Body (pipeline JSON):**
53
- ```json
54
- [
55
- { "$match": { "player": "john", "type": 0, "item": "xp" } },
56
- { "$group": { "_id": null, "totalXP": { "$sum": "$total" } } }
57
- ]
58
- ```
59
-
60
- **Resultado:**
61
- ```json
62
- [{ "totalXP": 250 }]
63
- ```
64
-
65
- **Operadores suportados:** `$match`, `$group`, `$sort`, `$limit`, `$lookup`, `$project`, `$unwind`, `$addFields`, `$count`
66
-
67
- ### 1.4 Índices
68
-
69
- | Operação | Método | Endpoint |
70
- |----------|--------|----------|
71
- | Listar | GET | `/v3/database/:collection/index` |
72
- | Criar | POST | `/v3/database/:collection/index` |
73
- | Excluir | DELETE | `/v3/database/:collection/index/:index_name` |
74
-
75
- **Exemplo — Criar índice:**
76
- ```json
77
- { "fuel": 1 }
78
- ```
79
-
80
- ---
81
-
82
- ## 2. Acesso via Código Java (Triggers, Schedulers, Public Endpoints)
83
-
84
- Módulos que executam código Java têm acesso ao objeto `manager`, que provê conexão direta com o MongoDB através do driver Jongo.
85
-
86
- ### 2.1 Estrutura de Acesso
87
-
88
- ```java
89
- manager.getJongoConnection().getCollection("nome_da_colecao").operacao(...);
90
- ```
91
-
92
- ### 2.2 Operações
93
-
94
- #### Salvar (Insert/Update)
95
- ```java
96
- manager.getJongoConnection()
97
- .getCollection("email__c")
98
- .save(payload);
99
- ```
100
-
101
- #### Buscar (Find)
102
- ```java
103
- Object result = manager.getJongoConnection()
104
- .getCollection("player")
105
- .findOne("{_id: 'john'}")
106
- .as(Map.class);
107
- ```
108
-
109
- #### Deletar
110
- ```java
111
- manager.getJongoConnection()
112
- .getCollection("car__c")
113
- .remove("{_id: 'car001'}");
114
- ```
115
-
116
- #### Aggregate
117
- ```java
118
- Iterable<Map> resultado = manager.getJongoConnection()
119
- .getCollection("action_log")
120
- .aggregate("[{ $match: { item: 'xp' } }, { $group: { _id: '$player', total: { $sum: '$total' } } }]")
121
- .as(Map.class);
122
- ```
123
-
124
- ---
125
-
126
- ## 3. Considerações de Segurança e Boas Práticas
127
-
128
- - As operações via API devem ser protegidas por **token de autenticação**
129
- - Endpoints públicos não requerem token — usar com cautela
130
- - Manipulação direta do banco afeta dados em **tempo real**
131
- - Sempre testar em **ambiente de homologação** antes de aplicar em produção
132
- - Coleções customizadas usam sufixo `__c` (ex: `car__c`, `email__c`)
1
+ # Acesso ao Banco de Dados Funifier
2
+
3
+ A plataforma Funifier oferece duas formas principais de acessar e manipular os dados da gamificação:
4
+
5
+ 1. **Via API REST** — endpoint `/v3/database`
6
+ 2. **Via código Java** — objeto `manager` em triggers, schedulers e public endpoints
7
+
8
+ Ambas utilizam **MongoDB** como banco de dados.
9
+
10
+ ---
11
+
12
+ ## 1. Acesso via API — Endpoint `/v3/database`
13
+
14
+ ### 1.1 Listar Coleções Disponíveis
15
+
16
+ **Método:** GET
17
+ **Endpoint:** `/v3/database/collections`
18
+
19
+ **Resposta:**
20
+ ```json
21
+ ["player", "action_log", "achievement", "challenge", "car__c", "email__c"]
22
+ ```
23
+
24
+ ### 1.2 Operações CRUD
25
+
26
+ | Operação | Método | Endpoint | Descrição |
27
+ |----------|--------|----------|-----------|
28
+ | Create | POST | `/v3/database/:collection` | Cria um novo registro |
29
+ | Read | GET | `/v3/database/:collection` | Lista registros da coleção |
30
+ | Update | PUT | `/v3/database/:collection` | Atualiza registro existente (via `_id`) |
31
+ | Delete | DELETE | `/v3/database/:collection?q=...` | Remove registros com filtro |
32
+ | Bulk Insert | POST | `/v3/database/:collection/bulk` | Cria/atualiza múltiplos registros |
33
+
34
+ **Exemplo — Criar item na coleção `car__c`:**
35
+ ```
36
+ POST /v3/database/car__c
37
+ ```
38
+ ```json
39
+ {
40
+ "_id": "car001",
41
+ "name": "Civic",
42
+ "brand": "Honda",
43
+ "price": 50000
44
+ }
45
+ ```
46
+
47
+ ### 1.3 Executar Aggregates
48
+
49
+ **Método:** POST
50
+ **Endpoint:** `/v3/database/:collection/aggregate`
51
+
52
+ **Body (pipeline JSON):**
53
+ ```json
54
+ [
55
+ { "$match": { "player": "john", "type": 0, "item": "xp" } },
56
+ { "$group": { "_id": null, "totalXP": { "$sum": "$total" } } }
57
+ ]
58
+ ```
59
+
60
+ **Resultado:**
61
+ ```json
62
+ [{ "totalXP": 250 }]
63
+ ```
64
+
65
+ **Operadores suportados:** `$match`, `$group`, `$sort`, `$limit`, `$lookup`, `$project`, `$unwind`, `$addFields`, `$count`
66
+
67
+ ### 1.4 Índices
68
+
69
+ | Operação | Método | Endpoint |
70
+ |----------|--------|----------|
71
+ | Listar | GET | `/v3/database/:collection/index` |
72
+ | Criar | POST | `/v3/database/:collection/index` |
73
+ | Excluir | DELETE | `/v3/database/:collection/index/:index_name` |
74
+
75
+ **Exemplo — Criar índice:**
76
+ ```json
77
+ { "fuel": 1 }
78
+ ```
79
+
80
+ ---
81
+
82
+ ## 2. Acesso via Código Java (Triggers, Schedulers, Public Endpoints)
83
+
84
+ Módulos que executam código Java têm acesso ao objeto `manager`, que provê conexão direta com o MongoDB através do driver Jongo.
85
+
86
+ ### 2.1 Estrutura de Acesso
87
+
88
+ ```java
89
+ manager.getJongoConnection().getCollection("nome_da_colecao").operacao(...);
90
+ ```
91
+
92
+ ### 2.2 Operações
93
+
94
+ #### Salvar (Insert/Update)
95
+ ```java
96
+ manager.getJongoConnection()
97
+ .getCollection("email__c")
98
+ .save(payload);
99
+ ```
100
+
101
+ #### Buscar (Find)
102
+ ```java
103
+ Object result = manager.getJongoConnection()
104
+ .getCollection("player")
105
+ .findOne("{_id: 'john'}")
106
+ .as(Map.class);
107
+ ```
108
+
109
+ #### Deletar
110
+ ```java
111
+ manager.getJongoConnection()
112
+ .getCollection("car__c")
113
+ .remove("{_id: 'car001'}");
114
+ ```
115
+
116
+ #### Aggregate
117
+ ```java
118
+ Iterable<Map> resultado = manager.getJongoConnection()
119
+ .getCollection("action_log")
120
+ .aggregate("[{ $match: { item: 'xp' } }, { $group: { _id: '$player', total: { $sum: '$total' } } }]")
121
+ .as(Map.class);
122
+ ```
123
+
124
+ ---
125
+
126
+ ## 3. Considerações de Segurança e Boas Práticas
127
+
128
+ - As operações via API devem ser protegidas por **token de autenticação**
129
+ - Endpoints públicos não requerem token — usar com cautela
130
+ - Manipulação direta do banco afeta dados em **tempo real**
131
+ - Sempre testar em **ambiente de homologação** antes de aplicar em produção
132
+ - Coleções customizadas usam sufixo `__c` (ex: `car__c`, `email__c`)