cangku/backend/src/api/alibaba1688ProductExternal.js

101 lines
3.3 KiB
JavaScript

'use strict';
const express = require('express');
const {
requireDesktopPageAccess,
requireExternalAutomationApiKey,
} = require('../services/externalAutomationAuth');
const {
listAlibaba1688Products,
getAlibaba1688Product,
createAlibaba1688Product,
replaceAlibaba1688Product,
updateAlibaba1688Product,
deleteAlibaba1688Product,
} = require('../services/alibaba1688ProductService');
const router = express.Router();
const requireAlibabaAccess = requireDesktopPageAccess('planning_upload', 'market_insight');
function requestContext(req) {
return {
apiKeyId: req.externalApiKey?.id || '',
apiKeyName: req.externalApiKey?.name || '',
remoteIp: req.externalApiKey?.remoteIp || '',
};
}
function handleError(res, error, fallbackMessage) {
const statusCode = error.statusCode || error.status || 500;
if (statusCode >= 500) console.error('[Alibaba1688ProductAPI] 请求失败:', error);
return res.status(statusCode).json({
success: false,
code: error.code || undefined,
error: error.message || fallbackMessage,
});
}
router.get('/', requireExternalAutomationApiKey, requireAlibabaAccess, async (req, res) => {
try {
const data = await listAlibaba1688Products(req.query || {});
res.setHeader('Cache-Control', 'no-store');
return res.json({ success: true, data });
} catch (error) {
return handleError(res, error, '查询 1688 商品失败');
}
});
router.get('/:productId', requireExternalAutomationApiKey, requireAlibabaAccess, async (req, res) => {
try {
const data = await getAlibaba1688Product(req.params.productId);
res.setHeader('Cache-Control', 'no-store');
return res.json({ success: true, data });
} catch (error) {
return handleError(res, error, '查询 1688 商品详情失败');
}
});
router.post('/', requireExternalAutomationApiKey, requireAlibabaAccess, async (req, res) => {
try {
const data = await createAlibaba1688Product(req.body || {}, requestContext(req));
return res.status(201).json({ success: true, data });
} catch (error) {
return handleError(res, error, '新增 1688 商品失败');
}
});
// 客户端同步使用 PUT。相同 productId 会完整覆盖快照,不做字段合并。
router.put('/:productId', requireExternalAutomationApiKey, requireAlibabaAccess, async (req, res) => {
try {
const data = await replaceAlibaba1688Product(
req.params.productId,
req.body || {},
requestContext(req)
);
res.setHeader('Cache-Control', 'no-store');
return res.json({ success: true, data });
} catch (error) {
return handleError(res, error, '覆盖 1688 商品失败');
}
});
router.patch('/:productId', requireExternalAutomationApiKey, requireAlibabaAccess, async (req, res) => {
try {
const data = await updateAlibaba1688Product(req.params.productId, req.body || {});
return res.json({ success: true, data });
} catch (error) {
return handleError(res, error, '修改 1688 商品状态失败');
}
});
router.delete('/:productId', requireExternalAutomationApiKey, requireAlibabaAccess, async (req, res) => {
try {
const data = await deleteAlibaba1688Product(req.params.productId);
return res.json({ success: true, data });
} catch (error) {
return handleError(res, error, '删除 1688 商品失败');
}
});
module.exports = router;