chore: remove all mock/debug code for production release
Miniprogram: - ENV switched to 'prod' (disables __DEV__ flag) - Deleted mock.js and test-ble-frame.js - Removed mockBind/mockPurchase from api.js - Removed all debug UI panels and onMock* handlers from 6 pages - Removed mock purchase fallback in subscribe-plans - Removed SIMPLE PERIPHERAL dev board from BLE scan Server: - Removed /device/mock-bind route - Removed /subscription/mock-purchase route - Removed dev_openid fallback in wechat.js - Removed mockBind() from binding.dao.js - Removed mock fallback in purchase endpoint - NODE_ENV default changed to 'production' Admin: - ENV switched to 'prod' All mock code preserved in 'test' branch for future development use.
这个提交包含在:
+1
-1
@@ -1,7 +1,7 @@
|
||||
require('dotenv').config()
|
||||
|
||||
const config = {
|
||||
nodeEnv: process.env.NODE_ENV || 'development',
|
||||
nodeEnv: process.env.NODE_ENV || 'production',
|
||||
port: parseInt(process.env.PORT, 10) || 3000,
|
||||
region: process.env.TENCENT_REGION || 'ap-guangzhou',
|
||||
db: {
|
||||
|
||||
@@ -101,38 +101,6 @@ async function confirmBind(userId, deviceId, bindToken) {
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Mock bind (dev/test only): directly bind with status=1, auto-trial
|
||||
* @param {number} userId
|
||||
* @param {string} deviceId
|
||||
* @returns {Promise<{success?: boolean, duplicated?: boolean, device_id?: string, invalid?: boolean}>}
|
||||
*/
|
||||
async function mockBind(userId, deviceId) {
|
||||
return transaction(async conn => {
|
||||
const [active] = await conn.execute(
|
||||
'SELECT device_id FROM bindings WHERE user_id = ? AND bind_status = 1 LIMIT 1',
|
||||
[userId]
|
||||
)
|
||||
if (active.length > 0) return { duplicated: true, device_id: active[0].device_id }
|
||||
const [devices] = await conn.execute(
|
||||
'SELECT * FROM devices WHERE device_id = ? AND status <> 4 LIMIT 1',
|
||||
[deviceId]
|
||||
)
|
||||
if (devices.length === 0) return { invalid: true }
|
||||
await conn.execute(
|
||||
'UPDATE bindings SET bind_status = 2 WHERE user_id = ? AND bind_status = 3',
|
||||
[userId]
|
||||
)
|
||||
await conn.execute(
|
||||
"INSERT INTO bindings (user_id, device_id, bind_token, bind_expires, bind_status, bind_time) VALUES (?, ?, 'mock', NOW(), 1, NOW())",
|
||||
[userId, deviceId]
|
||||
)
|
||||
const subscriptionDao = require('./subscription.dao')
|
||||
await subscriptionDao.grantTrialIfEligible(userId, conn)
|
||||
return { success: true }
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Unbind device(s) for a user
|
||||
* @param {number} userId
|
||||
@@ -197,7 +165,6 @@ module.exports = {
|
||||
createPending,
|
||||
closeExpiredPending,
|
||||
confirmBind,
|
||||
mockBind,
|
||||
unbindByUser,
|
||||
getHistoryByDevice,
|
||||
findUserDeviceBinding,
|
||||
|
||||
@@ -51,11 +51,7 @@ async function getAccessToken() {
|
||||
}
|
||||
|
||||
async function code2Session(code) {
|
||||
if (config.nodeEnv === 'development' && (!code || code === 'local' || String(code).indexOf('dev_') === 0)) {
|
||||
return { openid: 'dev_openid_' + String(code || 'local').slice(-8) }
|
||||
}
|
||||
if (!config.wechat.appid || !config.wechat.secret) {
|
||||
if (config.nodeEnv === 'development') return { openid: 'dev_openid_' + String(code || 'local').slice(-8) }
|
||||
throw new Error('WECHAT_APPID or WECHAT_SECRET is not configured')
|
||||
}
|
||||
const url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + encodeURIComponent(config.wechat.appid) + '&secret=' + encodeURIComponent(config.wechat.secret) + '&js_code=' + encodeURIComponent(code) + '&grant_type=authorization_code'
|
||||
|
||||
@@ -56,23 +56,6 @@ router.post('/device/bind/confirm', requireUser, wrap(async (req, res) => {
|
||||
}))
|
||||
}))
|
||||
|
||||
router.post('/device/mock-bind', requireUser, wrap(async (req, res) => {
|
||||
const config = require('../config')
|
||||
if (config.nodeEnv === 'production') return res.json(fail(2001, 'not available in production'))
|
||||
const deviceId = String(req.body.device_id || '').trim()
|
||||
if (!deviceId) return res.json(fail(2001, 'device_id required'))
|
||||
|
||||
const active = await bindingDao.findActiveByUser(req.user.user_id)
|
||||
if (active) return res.json(fail(2001, '已绑定设备', { device_id: active.device_id }))
|
||||
|
||||
const device = await bindingDao.findDeviceExists(deviceId)
|
||||
if (!device) return res.json(fail(1005, 'DEVICE_NOT_FOUND'))
|
||||
|
||||
await bindingDao.mockBind(req.user.user_id, deviceId)
|
||||
await logDao.write({ user_id: req.user.user_id, action: 'device_bind_confirm', detail: '模拟绑定设备: ' + deviceId, ip: req.ip })
|
||||
res.json(ok({ message: 'success', device_id: deviceId }))
|
||||
}))
|
||||
|
||||
router.post('/device/unbind', requireUser, wrap(async (req, res) => {
|
||||
const deviceId = req.body.device_id || null
|
||||
await bindingDao.unbindByUser(req.user.user_id, deviceId)
|
||||
|
||||
@@ -46,11 +46,8 @@ router.post('/subscription/purchase', requireUser, wrap(async (req, res) => {
|
||||
if (!PLANS[plan] || plan === 'trial') return res.json(fail(2001, 'invalid plan'))
|
||||
|
||||
const wxpay = require('../lib/wxpay')
|
||||
const config = require('../config')
|
||||
if (!wxpay.isConfigured()) {
|
||||
if (config.nodeEnv === 'production') return res.json(fail(2001, 'payment not configured'))
|
||||
const orderId = 'ORD' + Date.now()
|
||||
return res.json(ok({ order_id: orderId, payment_params: null, mock: true, plan, amount: PLANS[plan].amount }))
|
||||
return res.json(fail(2001, 'payment not configured'))
|
||||
}
|
||||
|
||||
const paymentOrderDao = require('../dao/payment-order.dao')
|
||||
@@ -82,19 +79,6 @@ router.post('/subscription/purchase', requireUser, wrap(async (req, res) => {
|
||||
res.json(ok({ order_id: orderId, payment_params: paymentParams, plan, amount: priceYuan }))
|
||||
}))
|
||||
|
||||
router.post('/subscription/mock-purchase', requireUser, wrap(async (req, res) => {
|
||||
const config = require('../config')
|
||||
if (config.nodeEnv === 'production') return res.json(fail(2001, 'not available in production'))
|
||||
const plan = req.body.plan || req.body.plan_type
|
||||
if (!PLANS[plan] || plan === 'trial') return res.json(fail(2001, 'invalid plan'))
|
||||
const p = PLANS[plan]
|
||||
const orderId = 'MOCK' + Date.now()
|
||||
await subscriptionDao.purchase(req.user.user_id, plan, p.amount, orderId, p.days)
|
||||
await logDao.write({ user_id: req.user.user_id, action: 'subscription_mock_purchase', detail: '模拟购买: ' + plan, ip: req.ip })
|
||||
const sub = await subscriptionDao.findActive(req.user.user_id)
|
||||
res.json(ok({ status: 'active', plan, remaining_days: sub ? sub.remaining_days : p.days }))
|
||||
}))
|
||||
|
||||
router.post('/subscription/trial', requireUser, wrap(async (req, res) => {
|
||||
const usedTrial = await subscriptionDao.findTrial(req.user.user_id)
|
||||
if (usedTrial) return res.json(fail(2001, '已使用过试用'))
|
||||
|
||||
在新工单中引用
屏蔽一个用户