package codersdk import ( "context" "encoding/json" "net/http" "strings" ) type Entitlement string const ( EntitlementEntitled Entitlement = "entitled" EntitlementGracePeriod Entitlement = "grace_period" EntitlementNotEntitled Entitlement = "not_entitled" ) // To add a new feature, modify this set of enums as well as the FeatureNames // array below. type FeatureName string const ( FeatureUserLimit FeatureName = "user_limit" FeatureAuditLog FeatureName = "audit_log" FeatureBrowserOnly FeatureName = "browser_only" FeatureSCIM FeatureName = "scim" FeatureTemplateRBAC FeatureName = "template_rbac" FeatureHighAvailability FeatureName = "high_availability" FeatureMultipleGitAuth FeatureName = "multiple_git_auth" FeatureExternalProvisionerDaemons FeatureName = "external_provisioner_daemons" FeatureAppearance FeatureName = "appearance" ) // FeatureNames must be kept in-sync with the Feature enum above. var FeatureNames = []FeatureName{ FeatureUserLimit, FeatureAuditLog, FeatureBrowserOnly, FeatureSCIM, FeatureTemplateRBAC, FeatureHighAvailability, FeatureMultipleGitAuth, FeatureExternalProvisionerDaemons, FeatureAppearance, } // Humanize returns the feature name in a human-readable format. func (n FeatureName) Humanize() string { switch n { case FeatureTemplateRBAC: return "Template RBAC" case FeatureSCIM: return "SCIM" default: return strings.Title(strings.ReplaceAll(string(n), "_", " ")) } } // AlwaysEnable returns if the feature is always enabled if entitled. // Warning: We don't know if we need this functionality. // This method may disappear at any time. func (n FeatureName) AlwaysEnable() bool { return map[FeatureName]bool{ FeatureMultipleGitAuth: true, FeatureExternalProvisionerDaemons: true, FeatureAppearance: true, }[n] } type Feature struct { Entitlement Entitlement `json:"entitlement"` Enabled bool `json:"enabled"` Limit *int64 `json:"limit,omitempty"` Actual *int64 `json:"actual,omitempty"` } type Entitlements struct { Features map[FeatureName]Feature `json:"features"` Warnings []string `json:"warnings"` Errors []string `json:"errors"` HasLicense bool `json:"has_license"` Trial bool `json:"trial"` // DEPRECATED: use Experiments instead. Experimental bool `json:"experimental"` } func (c *Client) Entitlements(ctx context.Context) (Entitlements, error) { res, err := c.Request(ctx, http.MethodGet, "/api/v2/entitlements", nil) if err != nil { return Entitlements{}, err } defer res.Body.Close() if res.StatusCode != http.StatusOK { return Entitlements{}, readBodyAsError(res) } var ent Entitlements return ent, json.NewDecoder(res.Body).Decode(&ent) }