MCPcopy Create free account
hub / github.com/0xUnixIO/pulse / SyncSubscriptions

Function SyncSubscriptions

internal/payment/sync.go:17–103  ·  view source on GitHub ↗

SyncSubscriptions checks all active subscription orders against Stripe to catch any missed webhook events (cancellations, failures, etc.). sg 用于动态读取 Stripe 密钥;若未配置则静默跳过。

(ctx context.Context, sg SettingsGetter, envSecretKey string, orderStore orders.Store, userStore users.Store)

Source from the content-addressed store, hash-verified

15// to catch any missed webhook events (cancellations, failures, etc.).
16// sg 用于动态读取 Stripe 密钥;若未配置则静默跳过。
17func SyncSubscriptions(ctx context.Context, sg SettingsGetter, envSecretKey string, orderStore orders.Store, userStore users.Store) error {
18 liveKey, hasLive := ResolveSecretKeyByMode(sg, "live", envSecretKey)
19 testKey, hasTest := ResolveSecretKeyByMode(sg, "test", "")
20 if !hasLive && !hasTest {
21 return nil
22 }
23
24 allOrders, err := orderStore.ListOrders()
25 if err != nil {
26 return err
27 }
28
29 for _, order := range allOrders {
30 if order.StripeSubscriptionID == "" || order.Status != orders.StatusPaid {
31 continue
32 }
33
34 select {
35 case <-ctx.Done():
36 return ctx.Err()
37 default:
38 }
39
40 var sub *stripe.Subscription
41 if hasLive {
42 sub, err = GetSubscription(liveKey, order.StripeSubscriptionID)
43 }
44 if err != nil && hasTest {
45 sub, err = GetSubscription(testKey, order.StripeSubscriptionID)
46 }
47 if err != nil {
48 log.Printf("sync-stripe: get subscription %s: %v", order.StripeSubscriptionID, err)
49 continue
50 }
51
52 switch sub.Status {
53 case stripe.SubscriptionStatusCanceled,
54 stripe.SubscriptionStatusUnpaid,
55 stripe.SubscriptionStatusIncompleteExpired:
56 // 不覆盖已退款订单的终态
57 if order.Status == orders.StatusRefunded {
58 continue
59 }
60 order.Status = orders.StatusFailed
61 if _, err := orderStore.UpsertOrder(order); err != nil {
62 log.Printf("sync-stripe: update order %s: %v", order.ID, err)
63 }
64 if order.UserID != "" {
65 user, err := userStore.GetUser(order.UserID)
66 if err == nil && user.Status == users.StatusActive {
67 user.Status = users.StatusDisabled
68 user.CurrentPlanID = ""
69 if _, err := userStore.UpsertUser(user); err != nil {
70 log.Printf("sync-stripe: disable user %s: %v", user.ID, err)
71 } else {
72 log.Printf("sync-stripe: disabled user %s (subscription %s cancelled)", user.Username, order.StripeSubscriptionID)
73 }
74 }

Callers 1

RunFunction · 0.92

Calls 8

ResolveSecretKeyByModeFunction · 0.85
GetSubscriptionFunction · 0.85
ListOrdersMethod · 0.65
DoneMethod · 0.65
ErrMethod · 0.65
UpsertOrderMethod · 0.65
GetUserMethod · 0.65
UpsertUserMethod · 0.65

Tested by

no test coverage detected