Builds on cf70021, which added the read-only yeeke client/session/sync core
but left it unreachable and unconfigurable. This commit:
- Wires config.ExtConfig.Yeeke (settings.yml + config.yaml + GOAUTO_YEEKE_*
env vars), mirroring the existing SYB credential pattern exactly, with a
dedicated OcrURL and shared OCR client from sybclient.
- Adds yeeke.StartSync as the single entry point for both a manual admin
trigger and the scheduled job, sharing one in-memory gate plus the existing
DB-level unique active_slot lease so they can never run concurrently.
- Fixes sync.go bugs found in review: Service.Sync always returned a nil
error even when the run failed (start/resume semantics were untestable),
item upserts on ctx-less s.db calls, and no error_message/last_success_at
was ever recorded on the run row.
- Adds status_unrecognized to yeeke_return_package: an unknown claim status
is preserved verbatim and flagged rather than silently bucketed.
- Adds the admin read-only surface (GET .../sync-runs, GET
.../sync-runs/:runId, POST .../sync) under /api/admin/v1/yeeke-returns,
visible to admin and purchaser per the #336 review comment, registered as
a GoAuto access module/menu group and purchaser API.
- Registers GoAutoYeekeReturnSync in the existing job/lease framework
(app/jobs), seeded disabled (Status 2) by a new version-local migration,
following 1786701600000_syb_hourly_sync_job.go's pattern exactly.
- Expands tests: session reuse/bounded re-login/timeout-preserves-cache in
yeekeclient; paging robustness (total changing mid-run, duplicate page,
empty page, timeout, simulated restart/resume), idempotent upserts,
unrecognized-status flagging, active_slot lease contention, StartSync gate
contention, and a credential/captcha redaction check in yeeke; settings.yml
binding and env var precedence in config.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
75 lines
2.4 KiB
Go
75 lines
2.4 KiB
Go
package router
|
|
|
|
import (
|
|
goautoclientapi "go-admin/app/goauto/clientapi"
|
|
"os"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
log "github.com/go-admin-team/go-admin-core/logger"
|
|
"github.com/go-admin-team/go-admin-core/sdk"
|
|
goautoaimatching "go-admin/app/goauto/aimatching"
|
|
goautoapprelease "go-admin/app/goauto/apprelease"
|
|
goautodevice "go-admin/app/goauto/device"
|
|
goautoproduct "go-admin/app/goauto/product"
|
|
goautopurchase "go-admin/app/goauto/purchase"
|
|
goautopurchaserule "go-admin/app/goauto/purchaserule"
|
|
goautoreplacement "go-admin/app/goauto/replacement"
|
|
goautorule "go-admin/app/goauto/rule"
|
|
goautoshopeeproduct "go-admin/app/goauto/shopeeproduct"
|
|
goautosybimport "go-admin/app/goauto/sybimport"
|
|
goautosybinnercode "go-admin/app/goauto/sybinnercode"
|
|
goautosybproductfilter "go-admin/app/goauto/sybproductfilter"
|
|
goautosybshop "go-admin/app/goauto/sybshop"
|
|
goautotask "go-admin/app/goauto/task"
|
|
goautoyeeke "go-admin/app/goauto/yeeke"
|
|
common "go-admin/common/middleware"
|
|
)
|
|
|
|
// InitRouter 路由初始化,不要怀疑,这里用到了
|
|
func InitRouter() {
|
|
var r *gin.Engine
|
|
h := sdk.Runtime.GetEngine()
|
|
if h == nil {
|
|
log.Fatal("not found engine...")
|
|
os.Exit(-1)
|
|
}
|
|
switch h.(type) {
|
|
case *gin.Engine:
|
|
r = h.(*gin.Engine)
|
|
default:
|
|
log.Fatal("not support other engine")
|
|
os.Exit(-1)
|
|
}
|
|
|
|
// the jwt middleware
|
|
authMiddleware, err := common.AuthInit()
|
|
if err != nil {
|
|
log.Fatalf("JWT Init Error, %s", err.Error())
|
|
}
|
|
|
|
// 注册系统路由
|
|
InitSysRouter(r, authMiddleware)
|
|
|
|
// 注册业务路由
|
|
// TODO: 这里可存放业务路由,里边并无实际路由只有演示代码
|
|
InitExamplesRouter(r, authMiddleware)
|
|
|
|
// 注册 GoAuto Agent 与设备管理路由。
|
|
goautodevice.InitRouter(r, authMiddleware)
|
|
goautoclientapi.InitRouter(r, authMiddleware)
|
|
goautoapprelease.InitRouter(r, authMiddleware)
|
|
goautoaimatching.InitRouter(r, authMiddleware)
|
|
goautotask.InitRouter(r, authMiddleware)
|
|
goautopurchase.InitRouter(r, authMiddleware)
|
|
goautopurchaserule.InitRouter(r, authMiddleware)
|
|
goautoproduct.InitRouter(r, authMiddleware)
|
|
goautoreplacement.InitRouter(r, authMiddleware)
|
|
goautorule.InitRouter(r, authMiddleware)
|
|
goautoshopeeproduct.InitRouter(r, authMiddleware, goautopurchase.ValidateQuickReplacement)
|
|
goautosybimport.InitRouter(r, authMiddleware)
|
|
goautosybinnercode.InitRouter(r, authMiddleware)
|
|
goautosybshop.InitRouter(r, authMiddleware)
|
|
goautosybproductfilter.InitRouter(r, authMiddleware)
|
|
goautoyeeke.InitRouter(r, authMiddleware)
|
|
}
|