funifier-mcp 0.2.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/funifier.mdc +91 -0
- package/.github/copilot-instructions.md +83 -0
- package/AGENTS.md +97 -0
- package/README.md +247 -78
- package/datasource-funifier-docs/knowledge/guides/aggregates.md +152 -152
- package/datasource-funifier-docs/knowledge/guides/database-access.md +132 -132
- package/datasource-funifier-docs/knowledge/guides/java-entities.md +373 -373
- package/datasource-funifier-docs/knowledge/guides/java-libraries.md +330 -330
- package/datasource-funifier-docs/knowledge/guides/java-managers.md +509 -509
- package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +271 -271
- package/datasource-funifier-docs/knowledge/index.md +121 -121
- package/datasource-funifier-docs/knowledge/modules/achievement.md +46 -46
- package/datasource-funifier-docs/knowledge/modules/action-log.md +88 -88
- package/datasource-funifier-docs/knowledge/modules/action.md +80 -80
- package/datasource-funifier-docs/knowledge/modules/auth.md +104 -104
- package/datasource-funifier-docs/knowledge/modules/avatar.md +28 -28
- package/datasource-funifier-docs/knowledge/modules/backup.md +40 -40
- package/datasource-funifier-docs/knowledge/modules/challenge.md +91 -91
- package/datasource-funifier-docs/knowledge/modules/compact.md +40 -40
- package/datasource-funifier-docs/knowledge/modules/competition.md +149 -149
- package/datasource-funifier-docs/knowledge/modules/crossword.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/csv-data.md +30 -30
- package/datasource-funifier-docs/knowledge/modules/custom-object.md +53 -53
- package/datasource-funifier-docs/knowledge/modules/database.md +241 -241
- package/datasource-funifier-docs/knowledge/modules/folder.md +111 -111
- package/datasource-funifier-docs/knowledge/modules/kpi-formulas.md +23 -23
- package/datasource-funifier-docs/knowledge/modules/lastmile.md +45 -45
- package/datasource-funifier-docs/knowledge/modules/leaderboard.md +98 -98
- package/datasource-funifier-docs/knowledge/modules/level.md +83 -83
- package/datasource-funifier-docs/knowledge/modules/lottery.md +112 -112
- package/datasource-funifier-docs/knowledge/modules/marketplace.md +27 -27
- package/datasource-funifier-docs/knowledge/modules/mystery.md +82 -82
- package/datasource-funifier-docs/knowledge/modules/notification.md +40 -40
- package/datasource-funifier-docs/knowledge/modules/patterns.md +1096 -1096
- package/datasource-funifier-docs/knowledge/modules/player.md +101 -101
- package/datasource-funifier-docs/knowledge/modules/point.md +67 -67
- package/datasource-funifier-docs/knowledge/modules/public.md +253 -253
- package/datasource-funifier-docs/knowledge/modules/question.md +136 -136
- package/datasource-funifier-docs/knowledge/modules/quiz.md +163 -163
- package/datasource-funifier-docs/knowledge/modules/scheduler.md +58 -58
- package/datasource-funifier-docs/knowledge/modules/security.md +169 -169
- package/datasource-funifier-docs/knowledge/modules/staging.md +28 -28
- package/datasource-funifier-docs/knowledge/modules/static-repo.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/story.md +42 -42
- package/datasource-funifier-docs/knowledge/modules/studio-page.md +180 -180
- package/datasource-funifier-docs/knowledge/modules/swap.md +132 -132
- package/datasource-funifier-docs/knowledge/modules/team.md +75 -75
- package/datasource-funifier-docs/knowledge/modules/trigger.md +189 -189
- package/datasource-funifier-docs/knowledge/modules/upload.md +155 -155
- package/datasource-funifier-docs/knowledge/modules/virtual-good.md +99 -99
- package/datasource-funifier-docs/knowledge/modules/webhook.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/websocket.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/widget.md +42 -42
- package/datasource-funifier-docs/process-gtm-saas.md +143 -143
- package/datasource-funifier-docs/process-instagram.md +88 -88
- package/datasource-funifier-docs/process.md +1826 -1826
- package/datasource-funifier-docs/readme.md +132 -132
- package/dist/cli/config-writers.js +11 -11
- package/dist/mcp/bundle.js +55 -52
- package/package.json +70 -67
- package/skills/funifier-create-aggregate/SKILL.md +126 -126
- package/skills/funifier-create-custom-page/SKILL.md +126 -126
- package/skills/funifier-create-scheduler/SKILL.md +126 -126
- package/skills/funifier-create-trigger/SKILL.md +127 -127
|
@@ -1,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`)
|