101 lines
3.3 KiB
JavaScript
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;
|