@omnizap-system/omnizap 2.6.1 → 2.6.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/.env.example +78 -9
- package/.github/workflows/ci.yml +3 -3
- package/.github/workflows/security-runner-hardening.yml +1 -1
- package/.github/workflows/security-zap-full-scan.yml +1 -0
- package/app/config/index.js +6 -0
- package/app/configParts/adminIdentity.js +36 -7
- package/app/configParts/baileysConfig.js +343 -56
- package/app/configParts/groupUtils.js +226 -0
- package/app/configParts/loggerConfig.js +185 -0
- package/app/configParts/messagePersistenceService.js +307 -5
- package/app/configParts/sessionConfig.js +242 -0
- package/app/connection/baileysCompatibility.test.js +10 -1
- package/app/connection/baileysDbAuthState.js +205 -9
- package/app/connection/baileysLibsignalPatch.js +210 -0
- package/app/connection/groupOwnerWriteStateResolver.js +141 -0
- package/app/connection/socketController.js +694 -123
- package/app/connection/socketController.multiSession.test.js +128 -0
- package/app/controllers/messageController.js +1 -1
- package/app/controllers/messagePipeline/commandMiddleware.js +12 -10
- package/app/controllers/messagePipeline/conversationMiddleware.js +2 -1
- package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +104 -0
- package/app/controllers/messagePipeline/preProcessingMiddlewares.js +96 -4
- package/app/controllers/messageProcessingPipeline.js +90 -9
- package/app/controllers/messageProcessingPipeline.test.js +202 -0
- package/app/modules/adminModule/AGENT.md +1 -1
- package/app/modules/adminModule/commandConfig.json +3318 -1347
- package/app/modules/adminModule/groupCommandHandlers.js +856 -14
- package/app/modules/adminModule/groupCommandHandlers.test.js +375 -9
- package/app/modules/adminModule/groupWarningRepository.js +152 -0
- package/app/modules/aiModule/AGENT.md +47 -30
- package/app/modules/aiModule/aiConfigRuntime.js +1 -0
- package/app/modules/aiModule/catCommand.js +132 -25
- package/app/modules/aiModule/commandConfig.json +114 -28
- package/app/modules/analyticsModule/messageAnalysisEventRepository.js +54 -6
- package/app/modules/gameModule/AGENT.md +1 -1
- package/app/modules/gameModule/commandConfig.json +29 -0
- package/app/modules/menuModule/AGENT.md +1 -1
- package/app/modules/menuModule/commandConfig.json +45 -10
- package/app/modules/menuModule/menuCatalogService.js +190 -0
- package/app/modules/menuModule/menuCommandUsageRepository.js +109 -0
- package/app/modules/menuModule/menuDynamicService.js +511 -0
- package/app/modules/menuModule/menuDynamicService.test.js +141 -0
- package/app/modules/menuModule/menus.js +36 -5
- package/app/modules/playModule/AGENT.md +10 -5
- package/app/modules/playModule/commandConfig.json +74 -16
- package/app/modules/playModule/playCommandConstants.js +13 -7
- package/app/modules/playModule/playCommandCore.js +4 -6
- package/app/modules/playModule/{playCommandYtDlpClient.js → playCommandMediaClient.js} +684 -332
- package/app/modules/playModule/playConfigRuntime.js +5 -6
- package/app/modules/playModule/playModuleCriticalFlows.test.js +44 -59
- package/app/modules/quoteModule/AGENT.md +1 -1
- package/app/modules/quoteModule/commandConfig.json +29 -0
- package/app/modules/rpgPokemonModule/AGENT.md +1 -1
- package/app/modules/rpgPokemonModule/commandConfig.json +29 -0
- package/app/modules/statsModule/AGENT.md +1 -1
- package/app/modules/statsModule/commandConfig.json +58 -0
- package/app/modules/stickerModule/AGENT.md +1 -1
- package/app/modules/stickerModule/commandConfig.json +145 -0
- package/app/modules/stickerPackModule/AGENT.md +1 -1
- package/app/modules/stickerPackModule/autoPackCollectorService.js +5 -1
- package/app/modules/stickerPackModule/commandConfig.json +29 -0
- package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +1 -1
- package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +78 -57
- package/app/modules/stickerPackModule/stickerPackService.js +13 -6
- package/app/modules/systemMetricsModule/AGENT.md +1 -1
- package/app/modules/systemMetricsModule/commandConfig.json +29 -0
- package/app/modules/tiktokModule/AGENT.md +1 -1
- package/app/modules/tiktokModule/commandConfig.json +29 -0
- package/app/modules/userModule/AGENT.md +1 -1
- package/app/modules/userModule/commandConfig.json +29 -0
- package/app/modules/waifuPicsModule/AGENT.md +57 -27
- package/app/modules/waifuPicsModule/commandConfig.json +87 -0
- package/app/observability/metrics.js +136 -0
- package/app/services/ai/commandConfigEnrichmentService.js +229 -47
- package/app/services/ai/geminiService.js +131 -7
- package/app/services/ai/geminiService.test.js +59 -2
- package/app/services/ai/moduleAiHelpCoreService.js +33 -4
- package/app/services/group/groupMetadataService.js +24 -1
- package/app/services/infra/dbWriteQueue.js +51 -21
- package/app/services/messaging/newsBroadcastService.js +843 -27
- package/app/services/multiSession/assignmentBalancerService.js +452 -0
- package/app/services/multiSession/groupOwnershipRepository.js +346 -0
- package/app/services/multiSession/groupOwnershipService.js +809 -0
- package/app/services/multiSession/groupOwnershipService.test.js +317 -0
- package/app/services/multiSession/sessionRegistryService.js +239 -0
- package/app/store/aiPromptStore.js +36 -19
- package/app/store/groupConfigStore.js +41 -5
- package/app/store/premiumUserStore.js +21 -7
- package/app/utils/antiLink/antiLinkModule.js +391 -25
- package/app/workers/aiHelperContinuousLearningWorker.js +512 -0
- package/database/index.js +6 -0
- package/database/migrations/20260307_d0_hardening_down.sql +1 -1
- package/database/migrations/20260314_d7_canonical_sender_down.sql +1 -1
- package/database/migrations/20260406_d30_security_analytics_down.sql +1 -1
- package/database/migrations/20260411_d35_group_community_metadata_down.sql +59 -0
- package/database/migrations/20260411_d35_group_community_metadata_up.sql +62 -0
- package/database/migrations/20260412_d36_system_config_tables_down.sql +32 -0
- package/database/migrations/20260412_d36_system_config_tables_up.sql +66 -0
- package/database/migrations/20260413_d37_group_user_warnings_down.sql +11 -0
- package/database/migrations/20260413_d37_group_user_warnings_up.sql +24 -0
- package/database/migrations/20260414_d38_multi_session_foundation_down.sql +72 -0
- package/database/migrations/20260414_d38_multi_session_foundation_up.sql +125 -0
- package/database/migrations/20260414_d39_multi_session_cutover_down.sql +103 -0
- package/database/migrations/20260414_d39_multi_session_cutover_up.sql +83 -0
- package/database/schema.sql +102 -1
- package/docker-compose.yml +4 -1
- package/docs/compliance/acceptable-use-policy-2026-03-07.md +1 -1
- package/docs/compliance/privacy-policy-2026-03-07.md +2 -2
- package/docs/security/dsar-lgpd-runbook-2026-03-07.md +1 -1
- package/docs/security/network-hardening-runbook-2026-03-07.md +53 -0
- package/docs/security/omnizap-static-security-headers.conf +25 -0
- package/ecosystem.prod.config.cjs +31 -11
- package/index.js +52 -18
- package/observability/alert-rules.yml +20 -0
- package/observability/grafana/dashboards/omnizap-system-admin.json +229 -0
- package/observability/mysql-setup.sql +4 -4
- package/observability/system-admin-observability.md +26 -0
- package/package.json +14 -6
- package/public/comandos/commands-catalog.json +2253 -78
- package/public/css/payments-react.css +478 -0
- package/public/js/apps/commandsReactApp.js +267 -87
- package/public/js/apps/createPackApp.js +3 -3
- package/public/js/apps/homeReactApp.js +2 -2
- package/public/js/apps/paymentsCancelReactApp.js +45 -0
- package/public/js/apps/paymentsReactApp.js +399 -0
- package/public/js/apps/paymentsSuccessReactApp.js +148 -0
- package/public/js/apps/stickersApp.js +255 -103
- package/public/js/apps/termsReactApp.js +57 -8
- package/public/js/apps/userPasswordResetReactApp.js +406 -0
- package/public/js/apps/userReactApp.js +96 -47
- package/public/js/apps/userSystemAdmReactApp.js +1506 -0
- package/public/pages/pagamentos-cancelado.html +21 -0
- package/public/pages/pagamentos-sucesso.html +21 -0
- package/public/pages/pagamentos.html +30 -0
- package/public/pages/politica-de-privacidade.html +1 -1
- package/public/pages/stickers.html +5 -5
- package/public/pages/termos-de-uso-texto-integral.html +1 -1
- package/public/pages/termos-de-uso.html +1 -1
- package/public/pages/user-password-reset.html +3 -4
- package/public/pages/user-systemadm.html +8 -462
- package/public/pages/user.html +1 -1
- package/scripts/clear-whatsapp-session.sh +123 -0
- package/scripts/core-ai-mode.mjs +163 -0
- package/scripts/deploy.sh +13 -0
- package/scripts/enrich-command-config-ux-openai.mjs +492 -0
- package/scripts/generate-commands-catalog.mjs +155 -0
- package/scripts/new-whatsapp-session.sh +564 -0
- package/scripts/security-web-surface-check.mjs +218 -0
- package/server/controllers/admin/adminPanelHandlers.js +253 -3
- package/server/controllers/admin/systemAdminController.js +254 -0
- package/server/controllers/payments/paymentsController.js +731 -0
- package/server/controllers/sticker/stickerCatalogController.js +9 -23
- package/server/controllers/system/contactController.js +9 -17
- package/server/controllers/system/stickerCatalogSystemContext.js +27 -6
- package/server/controllers/system/systemController.js +228 -1
- package/server/controllers/userController.js +6 -0
- package/server/email/emailAutomationRuntime.js +36 -1
- package/server/email/emailAutomationService.js +42 -1
- package/server/email/emailTemplateService.js +140 -33
- package/server/http/httpRequestUtils.js +18 -14
- package/server/http/httpServer.js +8 -4
- package/server/middleware/securityHeaders.js +35 -3
- package/server/routes/admin/systemAdminRouter.js +6 -0
- package/server/routes/indexRouter.js +50 -6
- package/server/routes/observability/grafanaProxyRouter.js +254 -0
- package/server/routes/payments/paymentsRouter.js +47 -0
- package/server/routes/static/staticPageRouter.js +30 -1
- package/server/utils/publicContact.js +31 -0
- package/utils/whatsapp/contactEnv.js +39 -0
- package/vite.config.mjs +5 -1
- package/app/modules/playModule/local/installYtDlp.js +0 -25
- package/app/modules/playModule/local/ytDlpInstaller.js +0 -28
package/.env.example
CHANGED
|
@@ -10,8 +10,6 @@
|
|
|
10
10
|
# ==============================
|
|
11
11
|
# PRIORIDADE 1 - CRITICO (startup)
|
|
12
12
|
# ==============================
|
|
13
|
-
BOT_NUMBER=
|
|
14
|
-
BOT_PHONE_NUMBER=
|
|
15
13
|
COMMAND_PREFIX="#"
|
|
16
14
|
COMMAND_REACT_EMOJI=🤖
|
|
17
15
|
DB_HOST=localhost
|
|
@@ -35,8 +33,6 @@ NODE_ENV=development
|
|
|
35
33
|
OPENAI_API_KEY=
|
|
36
34
|
GEMINI_API_KEY=
|
|
37
35
|
GEMINI_API_BASE_URL=https://generativelanguage.googleapis.com/v1beta
|
|
38
|
-
OWNER_NUMBER=5511999999999
|
|
39
|
-
PHONE_NUMBER=
|
|
40
36
|
PM2_APP_NAME=omnizap
|
|
41
37
|
SITE_ORIGIN=https://omnizap.shop
|
|
42
38
|
STICKER_API_BASE_PATH=/api/sticker-packs
|
|
@@ -46,13 +42,22 @@ SYSTEM_ADMIN_API_BASE_PATH=/api/admin
|
|
|
46
42
|
STICKER_STORAGE_DIR=./data/stickers
|
|
47
43
|
STICKER_WEB_ORIGIN=https://omnizap.shop
|
|
48
44
|
STICKER_WEB_PATH=/stickers
|
|
49
|
-
USER_ADMIN=seu_jid_de_admin@s.whatsapp.net
|
|
50
45
|
WHATSAPP_BOT_NUMBER=5511999999999
|
|
46
|
+
WHATSAPP_SUPPORT_NUMBER=5511999999999
|
|
47
|
+
WHATSAPP_ADMIN_NUMBER=5511999999999
|
|
48
|
+
WHATSAPP_ADMIN_JID=seu_jid_de_admin@s.whatsapp.net
|
|
51
49
|
WHATSAPP_LOGIN_BASE_URL=https://omnizap.shop
|
|
52
50
|
WHATSAPP_LOGIN_LINK_SECRET=troque_por_um_segredo_forte
|
|
53
51
|
WHATSAPP_LOGIN_PATH=/login/
|
|
54
52
|
WHATSAPP_LOGIN_TRIGGER=iniciar
|
|
55
|
-
|
|
53
|
+
|
|
54
|
+
# Legado (compatibilidade): mantenha vazio quando usar as variaveis canonicas acima
|
|
55
|
+
BOT_NUMBER=
|
|
56
|
+
BOT_PHONE_NUMBER=
|
|
57
|
+
OWNER_NUMBER=
|
|
58
|
+
PHONE_NUMBER=
|
|
59
|
+
USER_ADMIN=
|
|
60
|
+
WHATSAPP_PUBLIC_CONTACT_NUMBER=
|
|
56
61
|
|
|
57
62
|
# ==============================
|
|
58
63
|
# PRIORIDADE 2 - OPERACAO BASE
|
|
@@ -100,6 +105,7 @@ BAILEYS_GROUP_METADATA_CACHE_CHECKPERIOD_SECONDS=60
|
|
|
100
105
|
BAILEYS_SEND_RETRY_ATTEMPTS=2
|
|
101
106
|
BAILEYS_SEND_RETRY_BASE_DELAY_MS=600
|
|
102
107
|
BAILEYS_SEND_MEDIA_UPLOAD_TIMEOUT_MS=0
|
|
108
|
+
BAILEYS_SEND_PREFER_PN_FOR_LID=true
|
|
103
109
|
BAILEYS_VERSION=
|
|
104
110
|
BAILEYS_FETCH_LATEST_VERSION=false
|
|
105
111
|
BAILEYS_LOGGER_MODE=child
|
|
@@ -120,11 +126,20 @@ BAILEYS_REPLY_PRESENCE_BEFORE=composing
|
|
|
120
126
|
BAILEYS_REPLY_PRESENCE_AFTER=paused
|
|
121
127
|
BAILEYS_REPLY_PRESENCE_DELAY_MS=280
|
|
122
128
|
BAILEYS_AUTH_SESSION_ID=default
|
|
129
|
+
BAILEYS_SESSION_IDS=default
|
|
130
|
+
BAILEYS_PRIMARY_SESSION_ID=default
|
|
131
|
+
BAILEYS_SESSION_WEIGHTS=default=1
|
|
132
|
+
BAILEYS_AUTH_KEYS_CACHE_ENABLED=true
|
|
123
133
|
BAILEYS_AUTH_BOOTSTRAP_FROM_FILES=true
|
|
124
134
|
BAILEYS_SINGLE_WRITER_LOCK_ENABLED=true
|
|
125
135
|
BAILEYS_SINGLE_WRITER_LOCK_NAME=
|
|
126
136
|
BAILEYS_SINGLE_WRITER_LOCK_TIMEOUT_SECONDS=2
|
|
127
137
|
BAILEYS_SINGLE_WRITER_LOCK_RETRY_DELAY_MS=15000
|
|
138
|
+
BAILEYS_LIBSIGNAL_RUNTIME_PATCH_ENABLED=true
|
|
139
|
+
GROUP_OWNER_ENFORCEMENT_MODE=off
|
|
140
|
+
GROUP_OWNER_LEASE_MS=120000
|
|
141
|
+
GROUP_OWNER_HEARTBEAT_MS=30000
|
|
142
|
+
GROUP_BALANCER_ENABLED=false
|
|
128
143
|
BAILEYS_EVENT_BATCH_SIZE=100
|
|
129
144
|
BAILEYS_EVENT_QUEUE_MAX=4000
|
|
130
145
|
BAILEYS_EVENT_JOURNAL_RETENTION_DAYS=14
|
|
@@ -160,6 +175,7 @@ HOME_MARKETPLACE_STATS_CACHE_SECONDS=45
|
|
|
160
175
|
HOSTNAME=
|
|
161
176
|
IMAGE_MENU=https://example.com/assets/omnizap-banner.png
|
|
162
177
|
HELMET_CONTENT_SECURITY_POLICY_ENABLED=true
|
|
178
|
+
HELMET_CSP_FRAME_SRC_EXTRA=
|
|
163
179
|
LID_BACKFILL_BATCH=50000
|
|
164
180
|
LID_BACKFILL_ON_START=true
|
|
165
181
|
COMMAND_CONFIG_VALIDATE_ON_BOOT=true
|
|
@@ -171,6 +187,7 @@ MESSAGE_REPLY_PRESENCE_BEFORE=composing
|
|
|
171
187
|
MESSAGE_REPLY_PRESENCE_AFTER=paused
|
|
172
188
|
MESSAGE_REPLY_PRESENCE_DELAY_MS=280
|
|
173
189
|
MESSAGE_REPLY_PRESENCE_SUBSCRIBE=true
|
|
190
|
+
CONVERSATIONAL_AUTO_REPLY_ENABLED=false
|
|
174
191
|
METRICS_ENABLED=true
|
|
175
192
|
METRICS_ENDPOINT=
|
|
176
193
|
METRICS_HOST=127.0.0.1
|
|
@@ -308,6 +325,7 @@ WEB_USER_PASSWORD_RECOVERY_HASH_SECRET=
|
|
|
308
325
|
WEB_URL=https://omnizap.shop
|
|
309
326
|
WEB_VISITOR_COOKIE_TTL_SECONDS=31536000
|
|
310
327
|
WHATSAPP_COMMAND_REQUIRES_GOOGLE_LOGIN=true
|
|
328
|
+
WHATSAPP_ALLOW_SELF_COMMANDS_ON_APPEND=true
|
|
311
329
|
WHATSAPP_GOOGLE_LINK_CHECK_CACHE_TTL_MS=60000
|
|
312
330
|
WHATSAPP_LOGIN_LINK_TTL_SECONDS=900
|
|
313
331
|
WHATSAPP_LOGIN_REQUIRE_SIGNATURE=true
|
|
@@ -320,6 +338,26 @@ FFMPEG_PATH=ffmpeg
|
|
|
320
338
|
FFPROBE_PATH=ffprobe
|
|
321
339
|
HTTP_SLO_TARGET_MS=750
|
|
322
340
|
NEWS_API_URL=http://127.0.0.1:3001
|
|
341
|
+
NEWS_API_ARTICLES_PATH=/articles
|
|
342
|
+
NEWS_API_ARTICLE_BY_ID_PATH=/articles/:id
|
|
343
|
+
NEWS_API_ARTICLE_BY_SLUG_PATH=/articles/slug/:slug
|
|
344
|
+
NEWS_API_TRENDS_PATH=/trends
|
|
345
|
+
NEWS_API_FRANCHISES_PATH=/franchises
|
|
346
|
+
NEWS_API_FRANCHISE_BY_SLUG_PATH=/franchises/:slug
|
|
347
|
+
NEWS_API_SOURCES_PATH=/sources
|
|
348
|
+
NEWS_API_SOURCE_BY_ID_PATH=/sources/:sourceId
|
|
349
|
+
NEWS_API_SEO_ENTITIES_PATH=/seo/entities
|
|
350
|
+
NEWS_API_SEO_BY_TYPE_SLUG_PATH=/seo/:type/:slug
|
|
351
|
+
NEWS_API_LIMIT=120
|
|
352
|
+
NEWS_API_TIMEOUT_MS=15000
|
|
353
|
+
NEWS_API_DETAILS_TIMEOUT_MS=15000
|
|
354
|
+
NEWS_API_CONTEXT_TTL_MS=180000
|
|
355
|
+
NEWS_API_DETAILS_CACHE_TTL_MS=360000
|
|
356
|
+
NEWS_API_CONTEXT_TOP=40
|
|
357
|
+
NEWS_API_LEGACY_FALLBACK=true
|
|
358
|
+
NEWS_SMART_SELECTION_ENABLED=true
|
|
359
|
+
NEWS_SMART_SELECTION_WINDOW=80
|
|
360
|
+
NEWS_CAPTION_CONTEXT_ENABLED=true
|
|
323
361
|
NEWS_SENT_IDS_LIMIT=500
|
|
324
362
|
OMNIZAP_SOCIAL_METRICS=0
|
|
325
363
|
OPENAI_IMAGE_MODEL=gpt-5-nano
|
|
@@ -774,23 +812,34 @@ GITHUB_REPOSITORY=Omnizap-System/omnizap
|
|
|
774
812
|
GITHUB_TOKEN=
|
|
775
813
|
GRAFANA_ADMIN_PASSWORD=admin
|
|
776
814
|
GRAFANA_ADMIN_USER=admin
|
|
815
|
+
GRAFANA_ALLOW_EMBEDDING=true
|
|
777
816
|
GRAFANA_DASHBOARDS_PATH=./observability/grafana/dashboards
|
|
778
817
|
GRAFANA_IMAGE_TAG=10.4.3
|
|
779
818
|
GRAFANA_BIND_HOST=127.0.0.1
|
|
780
819
|
GRAFANA_PORT=3003
|
|
820
|
+
GRAFANA_PUBLIC_URL=https://omnizap.shop/api/grafana
|
|
781
821
|
GRAFANA_PROVISIONING_PATH=./observability/grafana/provisioning
|
|
782
|
-
GRAFANA_ROOT_URL
|
|
822
|
+
GRAFANA_ROOT_URL=https://omnizap.shop/api/grafana
|
|
823
|
+
GRAFANA_SERVE_FROM_SUB_PATH=true
|
|
824
|
+
GRAFANA_PROXY_BASE_PATH=/api/grafana
|
|
825
|
+
GRAFANA_PROXY_LEGACY_BASE_PATH=/grafana
|
|
826
|
+
GRAFANA_PROXY_TARGET_URL=http://127.0.0.1:3003
|
|
827
|
+
SYSTEM_ADMIN_GRAFANA_URL=https://omnizap.shop/api/grafana
|
|
828
|
+
SYSTEM_ADMIN_GRAFANA_DASHBOARDS=omnizap-system-admin|System Admin,omnizap-overview|Overview,omnizap-mysql|MySQL
|
|
829
|
+
SYSTEM_ADMIN_GRAFANA_TIME_FROM=now-6h
|
|
830
|
+
SYSTEM_ADMIN_GRAFANA_TIME_TO=now
|
|
831
|
+
SYSTEM_ADMIN_GRAFANA_REFRESH=10s
|
|
783
832
|
GRAFANA_TIMEZONE=America/Boa_Vista
|
|
784
833
|
LOKI_CONFIG_PATH=./observability/loki-config.yml
|
|
785
834
|
LOKI_IMAGE_TAG=2.9.4
|
|
786
835
|
LOKI_BIND_HOST=127.0.0.1
|
|
787
836
|
LOKI_PORT=3100
|
|
788
837
|
MYSQL_EXPORTER_CNF_PATH=./observability/mysql-exporter.cnf
|
|
789
|
-
MYSQL_EXPORTER_DSN=exporter:exporter@(
|
|
838
|
+
MYSQL_EXPORTER_DSN=exporter:exporter@unix(/run/mysqld/mysqld.sock)/
|
|
790
839
|
MYSQL_EXPORTER_IMAGE_TAG=v0.15.1
|
|
791
840
|
MYSQL_EXPORTER_BIND_HOST=127.0.0.1
|
|
792
841
|
MYSQL_EXPORTER_PORT=9104
|
|
793
|
-
MYSQL_LOGS_PATH=/var/
|
|
842
|
+
MYSQL_LOGS_PATH=/var/log/mysql
|
|
794
843
|
NODE_AUTH_TOKEN=
|
|
795
844
|
NODE_EXPORTER_IMAGE_TAG=v1.7.0
|
|
796
845
|
NODE_EXPORTER_BIND_HOST=127.0.0.1
|
|
@@ -860,6 +909,26 @@ WIKI_SYNC_SOURCE_DIR=./docs/wiki
|
|
|
860
909
|
WIKI_SYNC_TMP_DIR=/tmp/omnizap-wiki-sync
|
|
861
910
|
STACK_NAME=omnizap
|
|
862
911
|
|
|
912
|
+
# ==============================
|
|
913
|
+
# PAYMENTS (STRIPE CHECKOUT + WEBHOOK)
|
|
914
|
+
# ==============================
|
|
915
|
+
STRIPE_PAYMENTS_ENABLED=true
|
|
916
|
+
PAYMENTS_API_BASE_PATH=/api/payments
|
|
917
|
+
PAYMENTS_WEB_PATH=/pagamentos
|
|
918
|
+
STRIPE_SECRET_KEY=
|
|
919
|
+
STRIPE_WEBHOOK_SECRET=
|
|
920
|
+
STRIPE_PRICE_ID=
|
|
921
|
+
STRIPE_CHECKOUT_MODE=subscription
|
|
922
|
+
STRIPE_PLAN_NAME=Plano Premium
|
|
923
|
+
STRIPE_PLAN_PRICE_LABEL=Assinatura recorrente
|
|
924
|
+
STRIPE_CHECKOUT_SUCCESS_URL=https://omnizap.shop/pagamentos/sucesso?session_id={CHECKOUT_SESSION_ID}
|
|
925
|
+
STRIPE_CHECKOUT_CANCEL_URL=https://omnizap.shop/pagamentos/cancelado
|
|
926
|
+
STRIPE_API_BASE_URL=https://api.stripe.com/v1
|
|
927
|
+
STRIPE_API_TIMEOUT_MS=10000
|
|
928
|
+
STRIPE_ALLOW_PROMOTION_CODES=true
|
|
929
|
+
STRIPE_WEBHOOK_TOLERANCE_SECONDS=300
|
|
930
|
+
STRIPE_AUTO_REVOKE_ON_CANCELLATION=false
|
|
931
|
+
|
|
863
932
|
# ==============================
|
|
864
933
|
# EMAIL AUTOMATION (SMTP/OUTBOX)
|
|
865
934
|
# ==============================
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -57,6 +57,9 @@ jobs:
|
|
|
57
57
|
- name: Install dependencies
|
|
58
58
|
run: npm ci
|
|
59
59
|
|
|
60
|
+
- name: DB bootstrap smoke test
|
|
61
|
+
run: npm run db:init
|
|
62
|
+
|
|
60
63
|
- name: Check formatting
|
|
61
64
|
run: npm run format:check
|
|
62
65
|
|
|
@@ -68,6 +71,3 @@ jobs:
|
|
|
68
71
|
|
|
69
72
|
- name: Build
|
|
70
73
|
run: npm run build
|
|
71
|
-
|
|
72
|
-
- name: DB bootstrap smoke test
|
|
73
|
-
run: npm run db:init
|
package/app/config/index.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrel de configuração da aplicação.
|
|
3
|
+
* Reexporta utilitários de Baileys, grupos, identidade admin, logger e sessão.
|
|
4
|
+
*/
|
|
1
5
|
export * from '../configParts/baileysConfig.js';
|
|
2
6
|
export * from '../configParts/groupUtils.js';
|
|
3
7
|
export * from '../configParts/adminIdentity.js';
|
|
4
8
|
export * from '../configParts/loggerConfig.js';
|
|
9
|
+
export * from '../configParts/sessionConfig.js';
|
|
10
|
+
export * from '../../utils/whatsapp/contactEnv.js';
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { encodeJid, getJidUser, isSameJidUser, normalizeJid } from './baileysConfig.js';
|
|
2
2
|
import { extractUserIdInfo, resolveUserId, resolveUserIdCached } from './baileysConfig.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
import { normalizePhoneDigits, resolveAdminIdentityRawFromEnv, resolveAdminPhoneFromEnv } from '../../utils/whatsapp/contactEnv.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Retorna o valor bruto configurado para identidade de admin.
|
|
7
|
+
* @returns {string}
|
|
8
|
+
*/
|
|
9
|
+
export const getAdminRawValue = () => resolveAdminIdentityRawFromEnv();
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Resolve o JID do administrador com base no valor de ambiente.
|
|
13
|
+
* Aceita JID completo ou telefone numérico.
|
|
14
|
+
* @returns {string|null}
|
|
15
|
+
*/
|
|
10
16
|
export const getAdminJid = () => {
|
|
11
17
|
const raw = getAdminRawValue();
|
|
12
18
|
if (!raw) return null;
|
|
@@ -27,7 +33,15 @@ export const getAdminJid = () => {
|
|
|
27
33
|
return normalizedResolved || candidate;
|
|
28
34
|
};
|
|
29
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Resolve o telefone do administrador.
|
|
38
|
+
* Prioriza `ADMIN_PHONE` explícito e faz fallback para JID/identidade.
|
|
39
|
+
* @returns {string|null}
|
|
40
|
+
*/
|
|
30
41
|
export const getAdminPhone = () => {
|
|
42
|
+
const explicitAdminPhone = resolveAdminPhoneFromEnv({ fallback: '' });
|
|
43
|
+
if (explicitAdminPhone) return explicitAdminPhone;
|
|
44
|
+
|
|
31
45
|
const adminJid = getAdminJid();
|
|
32
46
|
if (!adminJid) return null;
|
|
33
47
|
|
|
@@ -38,6 +52,10 @@ export const getAdminPhone = () => {
|
|
|
38
52
|
return digits || null;
|
|
39
53
|
};
|
|
40
54
|
|
|
55
|
+
/**
|
|
56
|
+
* Resolve o JID do admin consultando reconciliação LID/JID quando disponível.
|
|
57
|
+
* @returns {Promise<string|null>}
|
|
58
|
+
*/
|
|
41
59
|
export const resolveAdminJid = async () => {
|
|
42
60
|
const cached = getAdminJid();
|
|
43
61
|
if (!cached) return null;
|
|
@@ -50,6 +68,11 @@ export const resolveAdminJid = async () => {
|
|
|
50
68
|
}
|
|
51
69
|
};
|
|
52
70
|
|
|
71
|
+
/**
|
|
72
|
+
* Verifica se um JID de remetente corresponde ao administrador.
|
|
73
|
+
* @param {string|null|undefined} senderJid
|
|
74
|
+
* @returns {boolean}
|
|
75
|
+
*/
|
|
53
76
|
export const isAdminSender = (senderJid) => {
|
|
54
77
|
const adminJid = getAdminJid();
|
|
55
78
|
if (!adminJid || !senderJid) return false;
|
|
@@ -60,6 +83,12 @@ export const isAdminSender = (senderJid) => {
|
|
|
60
83
|
return isSameJidUser(normalizedSender, adminJid) || normalizedSender === adminJid;
|
|
61
84
|
};
|
|
62
85
|
|
|
86
|
+
/**
|
|
87
|
+
* Verifica se a identidade do remetente corresponde ao administrador.
|
|
88
|
+
* Considera candidatos `jid`, `lid`, `participantAlt` e resolução assíncrona.
|
|
89
|
+
* @param {unknown} senderIdentity
|
|
90
|
+
* @returns {Promise<boolean>}
|
|
91
|
+
*/
|
|
63
92
|
export const isAdminSenderAsync = async (senderIdentity) => {
|
|
64
93
|
const senderInfo = extractUserIdInfo(senderIdentity);
|
|
65
94
|
if (!senderInfo.raw && !senderInfo.jid && !senderInfo.lid && !senderInfo.participantAlt) return false;
|