From cb5c7667b538582e5f275a620b89b8bc0985ed9d Mon Sep 17 00:00:00 2001 From: Yang Luo Date: Thu, 10 Jul 2025 14:11:40 +0800 Subject: [PATCH] feat: change Subscription's StartTime and EndTime to string --- object/get-dashboard.go | 2 +- object/plan.go | 14 +++++++++----- object/product.go | 8 +++++++- object/subscription.go | 30 +++++++++++++++++++++++------- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/object/get-dashboard.go b/object/get-dashboard.go index b52c32af..40bd3e8f 100644 --- a/object/get-dashboard.go +++ b/object/get-dashboard.go @@ -103,7 +103,7 @@ func GetDashboard(owner string) (*map[string][]int64, error) { func countCreatedBefore(dashboardMapItem DashboardMapItem, before time.Time) int64 { count := dashboardMapItem.itemCount for _, e := range dashboardMapItem.dashboardDateItems { - createdTime, _ := time.Parse("2006-01-02T15:04:05-07:00", e.CreatedTime) + createdTime, _ := time.Parse(time.RFC3339, e.CreatedTime) if createdTime.Before(before) { count++ } diff --git a/object/plan.go b/object/plan.go index 861f69b9..383ab63c 100644 --- a/object/plan.go +++ b/object/plan.go @@ -49,17 +49,21 @@ func (plan *Plan) GetId() string { return fmt.Sprintf("%s/%s", plan.Owner, plan.Name) } -func GetDuration(period string) (startTime time.Time, endTime time.Time) { +func getDuration(period string) (string, string, error) { + startTime := time.Now() + var endTime time.Time + if period == PeriodYearly { - startTime = time.Now() endTime = startTime.AddDate(1, 0, 0) } else if period == PeriodMonthly { - startTime = time.Now() endTime = startTime.AddDate(0, 1, 0) } else { - panic(fmt.Sprintf("invalid period: %s", period)) + return "", "", fmt.Errorf("invalid period: %s", period) } - return + + startTimeString := startTime.Format(time.RFC3339) + endTimeString := endTime.Format(time.RFC3339) + return startTimeString, endTimeString, nil } func GetPlanCount(owner, field, value string) (int64, error) { diff --git a/object/product.go b/object/product.go index 7586b567..3c47124c 100644 --- a/object/product.go +++ b/object/product.go @@ -206,11 +206,17 @@ func BuyProduct(id string, user *User, providerName, pricingName, planName, host if plan == nil { return nil, nil, fmt.Errorf("the plan: %s does not exist", planName) } - sub := NewSubscription(owner, user.Name, plan.Name, paymentName, plan.Period) + + sub, err := NewSubscription(owner, user.Name, plan.Name, paymentName, plan.Period) + if err != nil { + return nil, nil, err + } + _, err = AddSubscription(sub) if err != nil { return nil, nil, err } + returnUrl = fmt.Sprintf("%s/buy-plan/%s/%s/result?subscription=%s", originFrontend, owner, pricingName, sub.Name) } } diff --git a/object/subscription.go b/object/subscription.go index bc271034..e73172a0 100644 --- a/object/subscription.go +++ b/object/subscription.go @@ -48,8 +48,8 @@ type Subscription struct { Plan string `xorm:"varchar(100)" json:"plan"` Payment string `xorm:"varchar(100)" json:"payment"` - StartTime time.Time `json:"startTime"` - EndTime time.Time `json:"endTime"` + StartTime string `xorm:"varchar(100)" json:"startTime"` + EndTime string `xorm:"varchar(100)" json:"endTime"` Period string `xorm:"varchar(100)" json:"period"` State SubscriptionState `xorm:"varchar(100)" json:"state"` } @@ -84,9 +84,19 @@ func (sub *Subscription) UpdateState() error { } if sub.State == SubStateActive || sub.State == SubStateUpcoming || sub.State == SubStateExpired { - if sub.EndTime.Before(time.Now()) { + startTime, err := time.Parse(time.RFC3339, sub.StartTime) + if err != nil { + return err + } + + endTime, err := time.Parse(time.RFC3339, sub.EndTime) + if err != nil { + return err + } + + if endTime.Before(time.Now()) { sub.State = SubStateExpired - } else if sub.StartTime.After(time.Now()) { + } else if startTime.After(time.Now()) { sub.State = SubStateUpcoming } else { sub.State = SubStateActive @@ -103,10 +113,15 @@ func (sub *Subscription) UpdateState() error { return nil } -func NewSubscription(owner, userName, planName, paymentName, period string) *Subscription { - startTime, endTime := GetDuration(period) +func NewSubscription(owner, userName, planName, paymentName, period string) (*Subscription, error) { + startTime, endTime, err := getDuration(period) + if err != nil { + return nil, err + } + id := util.GenerateId()[:6] - return &Subscription{ + + res := &Subscription{ Owner: owner, Name: "sub_" + id, DisplayName: "New Subscription - " + id, @@ -121,6 +136,7 @@ func NewSubscription(owner, userName, planName, paymentName, period string) *Sub Period: period, State: SubStatePending, // waiting for payment complete } + return res, nil } func GetSubscriptionCount(owner, field, value string) (int64, error) {