package model import ( "encoding/base64" "encoding/json" "time" "github.com/pkg/errors" basemodel "go.signoz.io/signoz/pkg/query-service/model" ) type License struct { Key string `json:"key" db:"key"` ActivationId string `json:"activationId" db:"activationId"` CreatedAt time.Time `db:"created_at"` // PlanDetails contains the encrypted plan info PlanDetails string `json:"planDetails" db:"planDetails"` // stores parsed license details LicensePlan FeatureSet basemodel.FeatureSet // populated in case license has any errors ValidationMessage string `db:"validationMessage"` // used only for sending details to front-end IsCurrent bool `json:"isCurrent"` } func (l *License) MarshalJSON() ([]byte, error) { return json.Marshal(&struct { Key string `json:"key" db:"key"` ActivationId string `json:"activationId" db:"activationId"` ValidationMessage string `db:"validationMessage"` IsCurrent bool `json:"isCurrent"` PlanKey string `json:"planKey"` ValidFrom time.Time `json:"ValidFrom"` ValidUntil time.Time `json:"ValidUntil"` Status string `json:"status"` }{ Key: l.Key, ActivationId: l.ActivationId, IsCurrent: l.IsCurrent, PlanKey: l.PlanKey, ValidFrom: time.Unix(l.ValidFrom, 0), ValidUntil: time.Unix(l.ValidUntil, 0), Status: l.Status, ValidationMessage: l.ValidationMessage, }) } type LicensePlan struct { PlanKey string `json:"planKey"` ValidFrom int64 `json:"validFrom"` ValidUntil int64 `json:"validUntil"` Status string `json:"status"` } func (l *License) ParsePlan() error { l.LicensePlan = LicensePlan{} planData, err := base64.StdEncoding.DecodeString(l.PlanDetails) if err != nil { return err } plan := LicensePlan{} err = json.Unmarshal([]byte(planData), &plan) if err != nil { l.ValidationMessage = "failed to parse plan from license" return errors.Wrap(err, "failed to parse plan from license") } l.LicensePlan = plan l.ParseFeatures() return nil } func (l *License) ParseFeatures() { switch l.PlanKey { case Pro: l.FeatureSet = ProPlan case Enterprise: l.FeatureSet = EnterprisePlan default: l.FeatureSet = BasicPlan } } type Licenses struct { TrialStart int64 `json:"trialStart"` TrialEnd int64 `json:"trialEnd"` OnTrial bool `json:"onTrial"` WorkSpaceBlock bool `json:"workSpaceBlock"` TrialConvertedToSubscription bool `json:"trialConvertedToSubscription"` GracePeriodEnd int64 `json:"gracePeriodEnd"` Licenses []License `json:"licenses"` } type SubscriptionServerResp struct { Status string `json:"status"` Data Licenses `json:"data"` }