feat: rebuild auth identity foundation flow
This commit is contained in:
@@ -196,12 +196,25 @@ func (s *PaymentConfigService) GetPaymentConfig(ctx context.Context) (*PaymentCo
|
||||
SettingHelpImageURL, SettingHelpText,
|
||||
SettingCancelRateLimitOn, SettingCancelRateLimitMax,
|
||||
SettingCancelWindowSize, SettingCancelWindowUnit, SettingCancelWindowMode,
|
||||
SettingPaymentVisibleMethodAlipayEnabled, SettingPaymentVisibleMethodAlipaySource,
|
||||
SettingPaymentVisibleMethodWxpayEnabled, SettingPaymentVisibleMethodWxpaySource,
|
||||
}
|
||||
vals, err := s.settingRepo.GetMultiple(ctx, keys)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("get payment config settings: %w", err)
|
||||
}
|
||||
cfg := s.parsePaymentConfig(vals)
|
||||
if s.entClient != nil {
|
||||
instances, err := s.entClient.PaymentProviderInstance.Query().
|
||||
Where(paymentproviderinstance.EnabledEQ(true)).
|
||||
All(ctx)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("list enabled provider instances: %w", err)
|
||||
}
|
||||
cfg.EnabledTypes = applyVisibleMethodRoutingToEnabledTypes(cfg.EnabledTypes, vals, buildVisibleMethodSourceAvailability(instances))
|
||||
} else {
|
||||
cfg.EnabledTypes = applyVisibleMethodRoutingToEnabledTypes(cfg.EnabledTypes, vals, nil)
|
||||
}
|
||||
// Load Stripe publishable key from the first enabled Stripe provider instance
|
||||
cfg.StripePublishableKey = s.getStripePublishableKey(ctx)
|
||||
return cfg, nil
|
||||
@@ -234,18 +247,23 @@ func (s *PaymentConfigService) parsePaymentConfig(vals map[string]string) *Payme
|
||||
cfg.LoadBalanceStrategy = payment.DefaultLoadBalanceStrategy
|
||||
}
|
||||
if raw := vals[SettingEnabledPaymentTypes]; raw != "" {
|
||||
types := make([]string, 0, len(strings.Split(raw, ",")))
|
||||
for _, t := range strings.Split(raw, ",") {
|
||||
t = strings.TrimSpace(t)
|
||||
if t != "" {
|
||||
cfg.EnabledTypes = append(cfg.EnabledTypes, t)
|
||||
types = append(types, t)
|
||||
}
|
||||
}
|
||||
cfg.EnabledTypes = NormalizeVisibleMethods(types)
|
||||
}
|
||||
return cfg
|
||||
}
|
||||
|
||||
// getStripePublishableKey finds the publishable key from the first enabled Stripe provider instance.
|
||||
func (s *PaymentConfigService) getStripePublishableKey(ctx context.Context) string {
|
||||
if s.entClient == nil {
|
||||
return ""
|
||||
}
|
||||
instances, err := s.entClient.PaymentProviderInstance.Query().
|
||||
Where(
|
||||
paymentproviderinstance.EnabledEQ(true),
|
||||
@@ -385,3 +403,79 @@ func pcParseInt(s string, defaultVal int) int {
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func buildVisibleMethodSourceAvailability(instances []*dbent.PaymentProviderInstance) map[string]bool {
|
||||
available := make(map[string]bool, 4)
|
||||
for _, inst := range instances {
|
||||
switch inst.ProviderKey {
|
||||
case payment.TypeAlipay:
|
||||
if inst.SupportedTypes == "" || payment.InstanceSupportsType(inst.SupportedTypes, payment.TypeAlipay) || payment.InstanceSupportsType(inst.SupportedTypes, payment.TypeAlipayDirect) {
|
||||
available[VisibleMethodSourceOfficialAlipay] = true
|
||||
}
|
||||
case payment.TypeWxpay:
|
||||
if inst.SupportedTypes == "" || payment.InstanceSupportsType(inst.SupportedTypes, payment.TypeWxpay) || payment.InstanceSupportsType(inst.SupportedTypes, payment.TypeWxpayDirect) {
|
||||
available[VisibleMethodSourceOfficialWechat] = true
|
||||
}
|
||||
case payment.TypeEasyPay:
|
||||
for _, supportedType := range splitTypes(inst.SupportedTypes) {
|
||||
switch NormalizeVisibleMethod(supportedType) {
|
||||
case payment.TypeAlipay:
|
||||
available[VisibleMethodSourceEasyPayAlipay] = true
|
||||
case payment.TypeWxpay:
|
||||
available[VisibleMethodSourceEasyPayWechat] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return available
|
||||
}
|
||||
|
||||
func applyVisibleMethodRoutingToEnabledTypes(base []string, vals map[string]string, available map[string]bool) []string {
|
||||
shouldExpose := map[string]bool{
|
||||
payment.TypeAlipay: visibleMethodShouldBeExposed(payment.TypeAlipay, vals, available),
|
||||
payment.TypeWxpay: visibleMethodShouldBeExposed(payment.TypeWxpay, vals, available),
|
||||
}
|
||||
|
||||
seen := make(map[string]struct{}, len(base)+2)
|
||||
out := make([]string, 0, len(base)+2)
|
||||
appendType := func(paymentType string) {
|
||||
paymentType = NormalizeVisibleMethod(paymentType)
|
||||
if paymentType == "" {
|
||||
return
|
||||
}
|
||||
if _, ok := seen[paymentType]; ok {
|
||||
return
|
||||
}
|
||||
seen[paymentType] = struct{}{}
|
||||
out = append(out, paymentType)
|
||||
}
|
||||
|
||||
for _, paymentType := range base {
|
||||
visibleMethod := NormalizeVisibleMethod(paymentType)
|
||||
switch visibleMethod {
|
||||
case payment.TypeAlipay, payment.TypeWxpay:
|
||||
if shouldExpose[visibleMethod] {
|
||||
appendType(visibleMethod)
|
||||
}
|
||||
default:
|
||||
appendType(visibleMethod)
|
||||
}
|
||||
}
|
||||
|
||||
for _, visibleMethod := range []string{payment.TypeAlipay, payment.TypeWxpay} {
|
||||
if shouldExpose[visibleMethod] {
|
||||
appendType(visibleMethod)
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func visibleMethodShouldBeExposed(method string, vals map[string]string, available map[string]bool) bool {
|
||||
enabledKey := visibleMethodEnabledSettingKey(method)
|
||||
sourceKey := visibleMethodSourceSettingKey(method)
|
||||
if enabledKey == "" || sourceKey == "" || vals[enabledKey] != "true" {
|
||||
return false
|
||||
}
|
||||
source := NormalizeVisibleMethodSource(method, vals[sourceKey])
|
||||
return source != "" && available[source]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user