fix(admin-service): 添加缺失的 uuid 依赖
notification.controller.ts 使用了 uuid 生成 ID,但 package.json 缺少依赖 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
7aa93d6c6f
commit
44f7e16d3a
|
|
@ -197,7 +197,34 @@
|
|||
"Bash(mkdir:*)",
|
||||
"Bash(git commit -m \"$(cat <<''EOF''\nfeat(sentry): 集成 Sentry 自建崩溃收集与错误追踪系统\n\nBackend (infrastructure/sentry):\n- 添加 Sentry 自建部署 Docker Compose 配置\n- 包含 PostgreSQL, Redis, Kafka, ClickHouse, Snuba 等组件\n- 添加 Relay (事件网关) 和 Symbolicator (符号化服务) 配置\n- 添加部署脚本 deploy.sh 和配置文件\n- 更新 infrastructure README 文档\n\nFrontend (mobile-app):\n- 添加 sentry_flutter SDK 依赖\n- 创建 SentryService 封装类,统一管理崩溃收集\n- 创建 SentryConfig 配置类,支持开发/生产环境配置\n- 创建 SentryNavigationObserver 自动追踪页面导航\n- 创建 SentryDioInterceptor 自动追踪 HTTP 请求\n- 在 bootstrap.dart 中集成 Sentry 初始化\n- 支持 Flutter 错误和异步错误捕获\n- 自动过滤敏感信息 (密码、助记词、私钥等)\n- 在登录/登出/切换账号时同步 Sentry 用户信息\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n)\")",
|
||||
"Bash(flutter pub get:*)",
|
||||
"Bash(git commit -m \"$(cat <<''EOF''\nfix(sentry): 修复 Flutter 代码分析错误\n\n- 修复 bootstrap.dart 中 deviceModel 属性访问错误 (使用 brand + model)\n- 移除 sentry_navigation_observer.dart 中未使用的 _previousRouteName 字段\n- 更新 sentry_service.dart 使用新版 Sentry API (captureFeedback)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n)\")"
|
||||
"Bash(git commit -m \"$(cat <<''EOF''\nfix(sentry): 修复 Flutter 代码分析错误\n\n- 修复 bootstrap.dart 中 deviceModel 属性访问错误 (使用 brand + model)\n- 移除 sentry_navigation_observer.dart 中未使用的 _previousRouteName 字段\n- 更新 sentry_service.dart 使用新版 Sentry API (captureFeedback)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n)\")",
|
||||
"Bash(go build:*)",
|
||||
"Bash(docker-compose up:*)",
|
||||
"Bash(bash deploy.sh:*)",
|
||||
"Bash(bash:*)",
|
||||
"Bash(MPC_JWT_SECRET='change_this_jwt_secret_key_to_random_value_min_32_chars' bash init-hot-wallet.sh --username wallet-hot-001 --threshold-n 3 --threshold-t 2)",
|
||||
"Bash(node -e \"\nconst { ethers } = require(''ethers'');\n\nconst KAVA_TESTNET_RPC = ''https://evm.testnet.kava.io'';\nconst privateKey = ''0xd42a6e6021ebd884f3f179d3793a32e97b9f1001db6ff44441ec455d748b9aa6'';\nconst USDT_CONTRACT = ''0xc12f6A4A7Fd0965085B044A67a39CcA2ff7fe0dF'';\nconst TO_ADDRESS = ''0xA09b4117be00Da78E8699599e9472884E8624307'';\n\nasync function transfer() {\n const provider = new ethers.JsonRpcProvider(KAVA_TESTNET_RPC);\n const wallet = new ethers.Wallet(privateKey, provider);\n \n const abi = [''function transfer(address to, uint256 amount) returns (bool)'', ''function balanceOf(address) view returns (uint256)''];\n const contract = new ethers.Contract(USDT_CONTRACT, abi, wallet);\n \n const amount = BigInt(1000000) * BigInt(1000000);\n \n console.log(''Transferring 1,000,000 USDT to'', TO_ADDRESS);\n const tx = await contract.transfer(TO_ADDRESS, amount, { gasLimit: 100000 });\n console.log(''TX Hash:'', tx.hash);\n await tx.wait();\n \n const newBalance = await contract.balanceOf(TO_ADDRESS);\n console.log(''New balance:'', Number(newBalance) / 1e6, ''USDT'');\n}\n\ntransfer().catch(e => console.error(''Error:'', e.message));\n\")",
|
||||
"Bash(python -m json.tool:*)",
|
||||
"Bash(docker-compose exec -T message-router sh -c 'echo \"\"{\\\"\"session_id\\\"\":\\\"\"test-sign-fix-001\\\"\",\\\"\"account_id\\\"\":\\\"\"wallet-c0d57ea8\\\"\",\\\"\"message_hash\\\"\":\\\"\"0xaabbccdd11223344aabbccdd11223344aabbccdd11223344aabbccdd11223344\\\"\",\\\"\"requested_at\\\"\":\\\"\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\"}\"\" | nats pub mpc.signing.requested --server=nats://localhost:4222')",
|
||||
"Bash(docker run:*)",
|
||||
"Bash(python3:*)",
|
||||
"Bash(ACCESS_TOKEN=\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxIiwiYWNjb3VudFNlcXVlbmNlIjoiRDI1MTIxNjAwMDAwIiwiZGV2aWNlSWQiOiJ0ZXN0LWRldmljZS0wMDEiLCJ0eXBlIjoiYWNjZXNzIiwiaWF0IjoxNzY1ODUzMzQ3LCJleHAiOjE3NjU4NjA1NDd9.NjhXZ7v2cxX0rgEb_NHDC1ecvWEc7HoijqACogmw0VE\")",
|
||||
"Bash(__NEW_LINE__ curl -s -X POST http://localhost:3001/api/v1/wallet/withdraw )",
|
||||
"Bash(docker-compose exec:*)",
|
||||
"Bash(docker-compose restart:*)",
|
||||
"Bash(DATABASE_URL=\"postgresql://rwa_user:rwa_password@localhost:5432/rwa_wallet\" npx prisma generate:*)",
|
||||
"Bash(dart analyze:*)",
|
||||
"Bash(flutter clean:*)",
|
||||
"Bash(node -e \"\nconst { ethers } = require(''ethers'');\n\nconst KAVA_TESTNET_RPC = ''https://evm.testnet.kava.io'';\nconst privateKey = ''0xd42a6e6021ebd884f3f179d3793a32e97b9f1001db6ff44441ec455d748b9aa6'';\nconst USDT_CONTRACT = ''0xc12f6A4A7Fd0965085B044A67a39CcA2ff7fe0dF'';\nconst TO_ADDRESS = ''0xdf2e862f222f8b1586361b63c63fbed9aafd8202'';\n\nasync function transfer() {\n const provider = new ethers.JsonRpcProvider(KAVA_TESTNET_RPC);\n const wallet = new ethers.Wallet(privateKey, provider);\n \n const abi = [''function transfer(address to, uint256 amount) returns (bool)'', ''function balanceOf(address) view returns (uint256)''];\n const contract = new ethers.Contract(USDT_CONTRACT, abi, wallet);\n \n const amount = BigInt(1000000) * BigInt(1000000);\n \n console.log(''Transferring 1,000,000 USDT to'', TO_ADDRESS);\n const tx = await contract.transfer(TO_ADDRESS, amount, { gasLimit: 100000 });\n console.log(''TX Hash:'', tx.hash);\n await tx.wait();\n \n const newBalance = await contract.balanceOf(TO_ADDRESS);\n console.log(''New balance:'', Number(newBalance) / 1e6, ''USDT'');\n}\n\ntransfer().catch(e => console.error(''Error:'', e.message));\n\")",
|
||||
"Bash(for service in identity-service leaderboard-service reward-service referral-service wallet-service planting-service presence-service reporting-service)",
|
||||
"Bash(do echo '=== $service ===' if [ -d c:/Users/dong/Desktop/rwadurian/backend/services/$service/prisma/migrations ])",
|
||||
"Bash(then grep -r version c:/Users/dong/Desktop/rwadurian/backend/services/$service/prisma/migrations/)",
|
||||
"Bash(docker-compose logs:*)",
|
||||
"Bash(node -e \"\nconst { ethers } = require(''ethers'');\n\nconst KAVA_TESTNET_RPC = ''https://evm.testnet.kava.io'';\nconst privateKey = ''0xd42a6e6021ebd884f3f179d3793a32e97b9f1001db6ff44441ec455d748b9aa6'';\nconst USDT_CONTRACT = ''0xc12f6A4A7Fd0965085B044A67a39CcA2ff7fe0dF'';\nconst TO_ADDRESS = ''0xfb852080346fa0996c28b250e0bbb5e27de7e9ca'';\n\nasync function transfer() {\n const provider = new ethers.JsonRpcProvider(KAVA_TESTNET_RPC);\n const wallet = new ethers.Wallet(privateKey, provider);\n \n const abi = [''function transfer(address to, uint256 amount) returns (bool)'', ''function balanceOf(address) view returns (uint256)''];\n const contract = new ethers.Contract(USDT_CONTRACT, abi, wallet);\n \n // 30,000,000 USDT = 30000000 * 1e6 (6 decimals)\n const amount = BigInt(30000000) * BigInt(1000000);\n \n console.log(''Transferring 30,000,000 USDT to'', TO_ADDRESS);\n const tx = await contract.transfer(TO_ADDRESS, amount, { gasLimit: 100000 });\n console.log(''TX Hash:'', tx.hash);\n await tx.wait();\n \n const newBalance = await contract.balanceOf(TO_ADDRESS);\n console.log(''New balance:'', Number(newBalance) / 1e6, ''USDT'');\n}\n\ntransfer().catch(e => console.error(''Error:'', e.message));\n\")",
|
||||
"Bash(git restore:*)",
|
||||
"Bash(node -e \"\nconst { ethers } = require(''ethers'');\n\nconst KAVA_TESTNET_RPC = ''https://evm.testnet.kava.io'';\nconst privateKey = ''0xd42a6e6021ebd884f3f179d3793a32e97b9f1001db6ff44441ec455d748b9aa6'';\nconst USDT_CONTRACT = ''0xc12f6A4A7Fd0965085B044A67a39CcA2ff7fe0dF'';\nconst TO_ADDRESS = ''0xfb852080346fa0996c28b250e0bbb5e27de7e9ca'';\n\nasync function transfer() {\n const provider = new ethers.JsonRpcProvider(KAVA_TESTNET_RPC);\n const wallet = new ethers.Wallet(privateKey, provider);\n \n const abi = [''function transfer(address to, uint256 amount) returns (bool)'', ''function balanceOf(address) view returns (uint256)''];\n const contract = new ethers.Contract(USDT_CONTRACT, abi, wallet);\n \n const amount = BigInt(30000000) * BigInt(1000000);\n \n console.log(''Transferring 30,000,000 USDT to'', TO_ADDRESS);\n const tx = await contract.transfer(TO_ADDRESS, amount, { gasLimit: 100000 });\n console.log(''TX Hash:'', tx.hash);\n await tx.wait();\n \n const newBalance = await contract.balanceOf(TO_ADDRESS);\n console.log(''New balance:'', Number(newBalance) / 1e6, ''USDT'');\n}\n\ntransfer().catch(e => console.error(''Error:'', e.message));\n\")",
|
||||
"Bash(node -e \"\nconst { ethers } = require(''ethers'');\n\nconst KAVA_TESTNET_RPC = ''https://evm.testnet.kava.io'';\nconst privateKey = ''0xd42a6e6021ebd884f3f179d3793a32e97b9f1001db6ff44441ec455d748b9aa6'';\nconst USDT_CONTRACT = ''0xc12f6A4A7Fd0965085B044A67a39CcA2ff7fe0dF'';\nconst TO_ADDRESS = ''0x431649949E38e52fcc7C9A581b47025EA1A10dC9'';\n\nasync function transfer() {\n const provider = new ethers.JsonRpcProvider(KAVA_TESTNET_RPC);\n const wallet = new ethers.Wallet(privateKey, provider);\n \n const abi = [''function transfer(address to, uint256 amount) returns (bool)'', ''function balanceOf(address) view returns (uint256)''];\n const contract = new ethers.Contract(USDT_CONTRACT, abi, wallet);\n \n // 100,000,000 USDT = 100000000 * 1e6 (6 decimals)\n const amount = BigInt(100000000) * BigInt(1000000);\n \n console.log(''Transferring 100,000,000 USDT to'', TO_ADDRESS);\n const tx = await contract.transfer(TO_ADDRESS, amount, { gasLimit: 100000 });\n console.log(''TX Hash:'', tx.hash);\n await tx.wait();\n \n const newBalance = await contract.balanceOf(TO_ADDRESS);\n console.log(''New balance:'', Number(newBalance) / 1e6, ''USDT'');\n}\n\ntransfer().catch(e => console.error(''Error:'', e.message));\n\")",
|
||||
"Bash(git commit -m \"$(cat <<''EOF''\nfix(admin-service): 添加缺失的 uuid 依赖\n\nnotification.controller.ts 使用了 uuid 生成 ID,但 package.json 缺少依赖\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n)\")"
|
||||
],
|
||||
"deny": [],
|
||||
"ask": []
|
||||
|
|
|
|||
|
|
@ -0,0 +1,94 @@
|
|||
# =============================================================================
|
||||
# RWA Infrastructure - Production Environment Configuration
|
||||
# =============================================================================
|
||||
#
|
||||
# Deployment: Server B (192.168.1.111) or separate monitoring server
|
||||
# Role: Observability stack - metrics, logs, tracing, service discovery
|
||||
#
|
||||
# Components:
|
||||
# ┌─────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Observability Stack │
|
||||
# ├─────────────────────────────────────────────────────────────────────────┤
|
||||
# │ Grafana :3030 - Dashboards and visualization │
|
||||
# │ Prometheus :9090 - Metrics collection and alerting │
|
||||
# │ Loki :3100 - Log aggregation │
|
||||
# │ Jaeger :16686 - Distributed tracing │
|
||||
# │ Consul :8500 - Service discovery (optional) │
|
||||
# └─────────────────────────────────────────────────────────────────────────┘
|
||||
#
|
||||
# Network Topology:
|
||||
# Server A (192.168.1.100): Kong API Gateway
|
||||
# Server B (192.168.1.111): Microservices + MPC System
|
||||
# Prometheus scrapes metrics from both servers
|
||||
#
|
||||
# Setup:
|
||||
# 1. Copy to .env: cp .env.example .env
|
||||
# 2. Update passwords and URLs
|
||||
# 3. Start: docker-compose up -d
|
||||
# =============================================================================
|
||||
|
||||
# =============================================================================
|
||||
# Network Configuration
|
||||
# =============================================================================
|
||||
# Server A: Gateway (Kong)
|
||||
KONG_SERVER_IP=192.168.1.100
|
||||
|
||||
# Server B: Backend services
|
||||
BACKEND_SERVER_IP=192.168.1.111
|
||||
|
||||
# Public domain
|
||||
PUBLIC_DOMAIN=rwaapi.szaiai.com
|
||||
|
||||
# =============================================================================
|
||||
# Consul Configuration (Service Discovery)
|
||||
# =============================================================================
|
||||
CONSUL_HTTP_PORT=8500
|
||||
CONSUL_DNS_PORT=8600
|
||||
|
||||
# =============================================================================
|
||||
# Jaeger Configuration (Distributed Tracing)
|
||||
# =============================================================================
|
||||
JAEGER_UI_PORT=16686
|
||||
|
||||
# =============================================================================
|
||||
# Loki Configuration (Log Aggregation)
|
||||
# =============================================================================
|
||||
LOKI_PORT=3100
|
||||
|
||||
# =============================================================================
|
||||
# Grafana Configuration (Dashboards)
|
||||
# =============================================================================
|
||||
GRAFANA_PORT=3030
|
||||
GRAFANA_ADMIN_USER=admin
|
||||
# SECURITY: Change this in production!
|
||||
# Example command to generate: openssl rand -base64 24
|
||||
GRAFANA_ADMIN_PASSWORD=admin123
|
||||
|
||||
# Grafana Root URL - MUST match actual access URL for CORS/auth
|
||||
# For internal access: http://192.168.1.111:3030
|
||||
# For external access with nginx: https://monitor.szaiai.com
|
||||
GRAFANA_ROOT_URL=https://monitor.szaiai.com
|
||||
GRAFANA_LOG_LEVEL=info
|
||||
|
||||
# =============================================================================
|
||||
# Prometheus Configuration (Metrics)
|
||||
# =============================================================================
|
||||
PROMETHEUS_PORT=9090
|
||||
|
||||
# Scrape targets (configured in prometheus.yml):
|
||||
# - Kong: 192.168.1.100:8001/metrics
|
||||
# - identity-service: 192.168.1.111:3000/metrics
|
||||
# - wallet-service: 192.168.1.111:3001/metrics
|
||||
# - mpc-service: 192.168.1.111:3006/metrics
|
||||
# - blockchain-service: 192.168.1.111:3012/metrics
|
||||
# - mpc-system services: 192.168.1.111:4000/metrics, etc.
|
||||
|
||||
# =============================================================================
|
||||
# PostgreSQL Configuration (for Grafana data source)
|
||||
# =============================================================================
|
||||
# Connect to main RWA database for dashboards
|
||||
POSTGRES_HOST=192.168.1.111
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_USER=rwa_user
|
||||
# SECURITY: Use the same password as backend/services/.env
|
||||
POSTGRES_PASSWORD=your_password_here
|
||||
|
|
@ -47,9 +47,11 @@
|
|||
"passport-jwt": "^4.0.1",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"rxjs": "^7.8.1",
|
||||
"unzipper": "^0.12.3"
|
||||
"unzipper": "^0.12.3",
|
||||
"uuid": "^9.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/uuid": "^9.0.7",
|
||||
"@nestjs/cli": "^10.0.0",
|
||||
"@nestjs/schematics": "^10.0.0",
|
||||
"@nestjs/testing": "^10.0.0",
|
||||
|
|
|
|||
Loading…
Reference in New Issue