171 lines
8.6 KiB
Go
171 lines
8.6 KiB
Go
// Package clientapi exposes only the reviewed client route inventory. It never
|
|
// forwards arbitrary URLs or synthesizes a logged-in administrator identity.
|
|
package clientapi
|
|
|
|
import (
|
|
"go-admin/app/goauto/access"
|
|
"go-admin/app/goauto/aimatching"
|
|
"go-admin/app/goauto/clientkey"
|
|
"go-admin/app/goauto/device"
|
|
"go-admin/app/goauto/product"
|
|
"go-admin/app/goauto/purchase"
|
|
"go-admin/app/goauto/purchaserule"
|
|
"go-admin/app/goauto/rule"
|
|
"go-admin/app/goauto/shopeeproduct"
|
|
"go-admin/app/goauto/sybimport"
|
|
"go-admin/app/goauto/sybinnercode"
|
|
"go-admin/app/goauto/sybshop"
|
|
"go-admin/app/goauto/task"
|
|
"go-admin/common/middleware"
|
|
"sort"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/go-admin-team/go-admin-core/sdk/pkg"
|
|
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
|
|
)
|
|
|
|
type Endpoint struct {
|
|
Method, Path, Module, Capability string
|
|
Handle gin.HandlerFunc
|
|
}
|
|
|
|
func Inventory() []Endpoint {
|
|
p := product.Handler{}
|
|
s := shopeeproduct.Handler{}
|
|
y := sybimport.Handler{}
|
|
i := sybinnercode.Handler{}
|
|
shop := sybshop.Handler{}
|
|
r := rule.Handler{}
|
|
pr := purchaserule.Handler{}
|
|
t := task.Handler{}
|
|
buy := purchase.Handler{}
|
|
return []Endpoint{
|
|
{"POST", "/ai-matching-settings/resolve", access.ModuleAIMatching, "match", resolveSpecs},
|
|
{"GET", "/devices", access.ModuleDevices, "read", device.Handler{}.List},
|
|
{"GET", "/pdd-products", access.ModulePDDProducts, "read", p.List},
|
|
{"GET", "/pdd-products/:productId", access.ModulePDDProducts, "read", p.Detail},
|
|
{"POST", "/pdd-products", access.ModulePDDProducts, "write", p.Create},
|
|
{"PATCH", "/pdd-products/:productId", access.ModulePDDProducts, "write", p.Update},
|
|
{"GET", "/shopee-products", access.ModuleShopeeProducts, "read", s.List},
|
|
{"GET", "/shopee-products/:productId", access.ModuleShopeeProducts, "read", s.Detail},
|
|
{"POST", "/shopee-products", access.ModuleShopeeProducts, "write", s.Create},
|
|
{"PATCH", "/shopee-products/:productId", access.ModuleShopeeProducts, "write", s.Update},
|
|
{"POST", "/shopee-products/:productId/link-pdd", access.ModuleShopeeProducts, "write", s.LinkPDD},
|
|
{"POST", "/shopee-products/:productId/specs/values", access.ModuleShopeeProducts, "write", s.AddSpecValue},
|
|
{"PUT", "/shopee-products/:productId/specs/mapping", access.ModuleShopeeProducts, "write", s.SetMapping},
|
|
{"DELETE", "/shopee-products/:productId/specs/values", access.ModuleShopeeProducts, "delete", s.RemoveSpecValue},
|
|
{"DELETE", "/shopee-products/:productId/specs/mapping", access.ModuleShopeeProducts, "delete", s.ClearMapping},
|
|
{"POST", "/shopee-products/batch-delete", access.ModuleShopeeProducts, "delete", s.BatchDelete},
|
|
{"POST", "/shopee-products/:productId/specs/mapping/auto-match", access.ModuleShopeeProducts, "match", s.AutoMatchMappings},
|
|
{"POST", "/shopee-products/:productId/specs/mapping/confirm", access.ModuleShopeeProducts, "match", s.ConfirmMapping},
|
|
{"GET", "/syb-products", access.ModuleSYBProducts, "read", y.List},
|
|
{"GET", "/syb-products/:productId", access.ModuleSYBProducts, "read", y.Detail},
|
|
{"PATCH", "/syb-products/:productId/correction", access.ModuleSYBProducts, "write", y.ManualCorrect},
|
|
{"POST", "/syb-products/:productId/reparse", access.ModuleSYBProducts, "reparse", y.Reparse},
|
|
{"POST", "/syb-products/reparse-batch", access.ModuleSYBProducts, "reparse", y.ReparseBatch},
|
|
{"GET", "/syb-products/sync-runs", access.ModuleSYBSyncRuns, "read", y.ListSyncRuns},
|
|
{"GET", "/syb-products/sync-runs/:runId", access.ModuleSYBSyncRuns, "read", y.SyncRunDetail},
|
|
{"POST", "/syb-products/import", access.ModuleSYBSyncRuns, "sync", y.Import},
|
|
{"GET", "/syb-inner-codes", access.ModuleSYBInnerCodes, "read", i.List},
|
|
{"GET", "/syb-inner-codes/:recordId", access.ModuleSYBInnerCodes, "read", i.Detail},
|
|
{"GET", "/syb-inner-codes/match-jobs/:jobId", access.ModuleSYBInnerCodes, "read", i.MatchJob},
|
|
{"GET", "/syb-inner-codes/apply-batches/:batchId", access.ModuleSYBInnerCodes, "read", i.ApplyBatch},
|
|
{"POST", "/syb-inner-codes/rematch", access.ModuleSYBInnerCodes, "match", i.Rematch},
|
|
{"POST", "/syb-inner-codes/import", access.ModuleSYBInnerCodes, "import", i.Import},
|
|
{"POST", "/syb-inner-codes/batch-delete", access.ModuleSYBInnerCodes, "delete", i.Delete},
|
|
{"POST", "/syb-inner-codes/apply-preview", access.ModuleSYBInnerCodes, "writeback", i.ApplyPreview},
|
|
{"POST", "/syb-inner-codes/apply", access.ModuleSYBInnerCodes, "writeback", i.Apply},
|
|
{"POST", "/syb-inner-codes/:recordId/recheck", access.ModuleSYBInnerCodes, "match", i.Recheck},
|
|
{"GET", "/syb-shops", access.ModuleSYBShops, "read", shop.List},
|
|
{"POST", "/syb-shops", access.ModuleSYBShops, "write", shop.Create},
|
|
{"PATCH", "/syb-shops/:shopId/name", access.ModuleSYBShops, "write", shop.Rename},
|
|
{"PATCH", "/syb-shops/:shopId/enabled", access.ModuleSYBShops, "write", shop.SetEnabled},
|
|
{"DELETE", "/syb-shops/:shopId", access.ModuleSYBShops, "delete", shop.Delete},
|
|
{"GET", "/collection-rules", access.ModuleCollectionRules, "read", r.List},
|
|
{"POST", "/collection-rules", access.ModuleCollectionRules, "write", r.Create},
|
|
{"PATCH", "/collection-rules/:ruleId", access.ModuleCollectionRules, "write", r.Update},
|
|
{"DELETE", "/collection-rules/:ruleId", access.ModuleCollectionRules, "delete", r.Delete},
|
|
{"GET", "/purchase-rules", access.ModulePurchaseRules, "read", pr.List},
|
|
{"GET", "/purchase-rules/current", access.ModulePurchaseRules, "read", pr.Current},
|
|
{"POST", "/purchase-rules", access.ModulePurchaseRules, "write", pr.Create},
|
|
{"PATCH", "/purchase-rules/:ruleId", access.ModulePurchaseRules, "write", pr.Update},
|
|
{"DELETE", "/purchase-rules/:ruleId", access.ModulePurchaseRules, "delete", pr.Delete},
|
|
{"PUT", "/purchase-rules/current", access.ModulePurchaseRules, "activate", pr.SetCurrent},
|
|
{"GET", "/collection-tasks", access.ModuleCollectionTasks, "read", t.AdminList},
|
|
{"GET", "/collection-tasks/:taskId", access.ModuleCollectionTasks, "read", t.AdminDetail},
|
|
{"POST", "/collection-tasks", access.ModuleCollectionTasks, "collect", t.AdminCreate},
|
|
{"POST", "/collection-tasks/batch", access.ModuleCollectionTasks, "collect", t.AdminBatchCreate},
|
|
{"POST", "/collection-tasks/:taskId/reset", access.ModuleCollectionTasks, "collect", t.AdminReset},
|
|
{"DELETE", "/collection-tasks/:taskId", access.ModuleCollectionTasks, "delete", t.AdminDelete},
|
|
{"GET", "/purchase-tasks", access.ModulePurchaseTasks, "read", buy.AdminList},
|
|
{"GET", "/purchase-tasks/:taskId", access.ModulePurchaseTasks, "read", buy.AdminDetail},
|
|
{"POST", "/purchase-tasks/batch-preview", access.ModulePurchaseTasks, "purchase", buy.AdminBatchPreview},
|
|
{"POST", "/purchase-tasks", access.ModulePurchaseTasks, "purchase", buy.AdminCreate},
|
|
{"POST", "/purchase-tasks/batch", access.ModulePurchaseTasks, "purchase", buy.AdminBatchCreate},
|
|
{"POST", "/purchase-tasks/batch-retry", access.ModulePurchaseTasks, "purchase", buy.AdminBatchRetry},
|
|
{"POST", "/purchase-tasks/stock", access.ModulePurchaseTasks, "purchase", buy.AdminCreateStock},
|
|
{"GET", "/ai-matching-settings", access.ModuleAIMatching, "read", func(c *gin.Context) {
|
|
db, err := pkg.GetOrm(c)
|
|
if err != nil {
|
|
c.JSON(500, gin.H{"code": 500})
|
|
return
|
|
}
|
|
v, err := aimatching.NewService(db).Settings(c.Request.Context())
|
|
if err != nil {
|
|
c.JSON(500, gin.H{"code": 500})
|
|
return
|
|
}
|
|
c.JSON(200, gin.H{"code": 200, "data": gin.H{"enabled": v.Enabled}})
|
|
}},
|
|
}
|
|
}
|
|
|
|
func Catalog(routes []Endpoint) []clientkey.Module {
|
|
mods := map[string]clientkey.Module{}
|
|
for _, m := range access.GoAutoModules() {
|
|
mods[m.Key] = clientkey.Module{Key: m.Key, Title: m.Title, Actions: []string{}}
|
|
}
|
|
for _, e := range routes {
|
|
m := mods[e.Module]
|
|
if e.Capability == "write" {
|
|
m.Writable = true
|
|
} else if e.Capability != "read" {
|
|
found := false
|
|
for _, a := range m.Actions {
|
|
if a == e.Capability {
|
|
found = true
|
|
}
|
|
}
|
|
if !found {
|
|
m.Actions = append(m.Actions, e.Capability)
|
|
}
|
|
}
|
|
mods[e.Module] = m
|
|
}
|
|
out := []clientkey.Module{}
|
|
for _, g := range access.GoAutoMenuGroups() {
|
|
for _, key := range g.ModuleKeys {
|
|
m := mods[key]
|
|
m.Group = g.Title
|
|
sort.Strings(m.Actions)
|
|
out = append(out, m)
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
func InitRouter(engine *gin.Engine, auth *jwt.GinJWTMiddleware) {
|
|
routes := Inventory()
|
|
catalog := Catalog(routes)
|
|
h := clientkey.Handler{Modules: catalog}
|
|
management := engine.Group("/api/admin/v1/client-keys", auth.MiddlewareFunc(), middleware.RequireRoleKey("admin"), NoStore)
|
|
management.GET("", h.List)
|
|
management.GET("/modules", h.Catalog)
|
|
management.POST("", h.Create)
|
|
management.PATCH("/:keyId/grants", h.Edit)
|
|
management.POST("/:keyId/disable", h.Disable)
|
|
for _, e := range routes {
|
|
engine.Handle(e.Method, "/api/client/v1"+e.Path, Gate(nil, e), e.Handle)
|
|
}
|
|
}
|