package svc import ( "github.com/casbin/casbin/v2" _ "github.com/lib/pq" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" "github.com/zeromicro/go-zero/rest" "github.com/zeromicro/go-zero/zrpc" "muyu-apiserver/gateway/internal/config" "muyu-apiserver/gateway/internal/middleware" "muyu-apiserver/gateway/internal/repo" pkgcasbin "muyu-apiserver/pkg/casbin" "muyu-apiserver/pkg/tenantctx" "muyu-apiserver/rpc/inventory/inventoryservice" "muyu-apiserver/rpc/production/productionservice" "muyu-apiserver/rpc/purchase/purchaseservice" "muyu-apiserver/rpc/system/systemservice" ) type ServiceContext struct { Config config.Config AuthorityMiddleware rest.Middleware CasbinEnforcer *casbin.Enforcer CrmRepo *repo.CrmRepo SystemRpc systemservice.SystemService InventoryRpc inventoryservice.InventoryService PurchaseRpc purchaseservice.PurchaseService ProductionRpc productionservice.ProductionService } func NewServiceContext(c config.Config) *ServiceContext { mysqlConn := sqlx.NewMysql(c.DataSource) var pgConn sqlx.SqlConn if c.PostgresDataSource != "" { pgConn = sqlx.NewSqlConn("postgres", c.PostgresDataSource) } else { pgConn = mysqlConn } var enforcer *casbin.Enforcer if c.DataSource != "" { func() { defer func() { if r := recover(); r != nil { logx.Errorf("init casbin enforcer panic: %v (skipped, running without enforcer)", r) } }() e, err := pkgcasbin.NewEnforcer(c.DataSource) if err != nil { logx.Errorf("init casbin enforcer failed: %v", err) return } enforcer = e }() } return &ServiceContext{ Config: c, AuthorityMiddleware: middleware.NewAuthorityMiddleware(enforcer).Handle, CasbinEnforcer: enforcer, CrmRepo: repo.NewCrmRepo(pgConn), SystemRpc: systemservice.NewSystemService(zrpc.MustNewClient(c.SystemRpc, zrpc.WithUnaryClientInterceptor(tenantctx.UnaryClientInterceptor()))), InventoryRpc: inventoryservice.NewInventoryService(zrpc.MustNewClient(c.InventoryRpc, zrpc.WithUnaryClientInterceptor(tenantctx.UnaryClientInterceptor()))), PurchaseRpc: purchaseservice.NewPurchaseService(zrpc.MustNewClient(c.PurchaseRpc, zrpc.WithUnaryClientInterceptor(tenantctx.UnaryClientInterceptor()))), ProductionRpc: productionservice.NewProductionService(zrpc.MustNewClient(c.ProductionRpc, zrpc.WithUnaryClientInterceptor(tenantctx.UnaryClientInterceptor()))), } }