回调优化为单地址 upsert 配置并支持重置密钥

- 回调订阅改为单记录 upsert:保存即覆盖(URL/事件/状态),自动停用其他订阅,无新增/删除
- 新增重置密钥:保存时传 rotate_secret=true 重新生成密钥并返回一次,解决密钥丢失无法找回
- 删除不再使用的 PATCH /callbacks/:id/status 路由及对应 handler/service 死代码
- 前端回调页改为内联表单(URL/事件/状态),新增重置密钥按钮(确认后展示新密钥一次)
- 补充单地址复用、disabled 不投递、密钥轮换测试
This commit is contained in:
yml2213
2026-08-03 11:23:46 +08:00
parent cf2ee96baa
commit 27a86f5311
9 changed files with 427 additions and 207 deletions
+27 -2
View File
@@ -559,7 +559,7 @@ func TestMarkProcessingTimeoutDistinguishesUpstreamSubmission(t *testing.T) {
t.Fatalf("create submitted order: %v", err)
}
if _, err := svc.UpdateFulfillment(FulfillmentUpdateInput{
MerchantID: merchantID,
MerchantID: merchantID,
APIClientID: 13,
OrderNo: submittedOrder.Order.OrderNo,
Status: model.OrderStatusDelivering,
@@ -582,7 +582,7 @@ func TestMarkProcessingTimeoutDistinguishesUpstreamSubmission(t *testing.T) {
t.Fatalf("create interrupted order: %v", err)
}
if _, err := svc.UpdateFulfillment(FulfillmentUpdateInput{
MerchantID: merchantID,
MerchantID: merchantID,
APIClientID: 13,
OrderNo: interruptedOrder.Order.OrderNo,
Status: model.OrderStatusDelivering,
@@ -805,6 +805,31 @@ func TestCreateTestOrderSupportsFailedFulfillableStatus(t *testing.T) {
}
}
func TestCreateTestOrderSupportsCancelledUnfulfillableStatus(t *testing.T) {
db := newServiceTestDB(t)
merchantID, product := seedFulfillmentMerchant(t, db, "merchant-test-cancelled", 0, -1, 100)
svc := NewFulfillmentService(db, nil)
order, err := svc.CreateTestOrder(CreateTestOrderInput{
MerchantID: merchantID,
SKU: product.SKU,
OrderStatus: model.OrderStatusCancelled,
})
if err != nil {
t.Fatalf("create cancelled test order: %v", err)
}
if order.OrderStatus != model.OrderStatusCancelled || order.CancelledAt == nil {
t.Fatalf("unexpected cancelled test order: %+v", order)
}
openOrder, err := svc.QueryOpenOrder(order.OrderNo)
if err != nil {
t.Fatalf("query open cancelled order: %v", err)
}
if openOrder.CanShip || openOrder.Status != "cancelled" || !strings.Contains(openOrder.CannotShipReason, "已取消") {
t.Fatalf("cancelled test order should be unfulfillable, got %+v", openOrder)
}
}
func TestHandleShipNotifyUpdatesOrderAndEnqueuesMerchantCallback(t *testing.T) {
db := newServiceTestDB(t)
merchantID, product := seedFulfillmentMerchant(t, db, "merchant-source-notify", 1000, 2, 100)