mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-06 21:36:37 +08:00
fix: refresh license status from server edits
This commit is contained in:
+25
-15
@@ -51,6 +51,7 @@ type licenseServerStatusResp struct {
|
|||||||
Valid bool `json:"valid"`
|
Valid bool `json:"valid"`
|
||||||
LicenseType *string `json:"license_type"`
|
LicenseType *string `json:"license_type"`
|
||||||
ExpiryDate *string `json:"expiry_date"`
|
ExpiryDate *string `json:"expiry_date"`
|
||||||
|
MaxDevices int `json:"max_devices"`
|
||||||
MaxUsers *int `json:"max_users"`
|
MaxUsers *int `json:"max_users"`
|
||||||
UnlimitedUsers bool `json:"unlimited_users"`
|
UnlimitedUsers bool `json:"unlimited_users"`
|
||||||
DaysRemaining *int `json:"days_remaining"`
|
DaysRemaining *int `json:"days_remaining"`
|
||||||
@@ -114,21 +115,7 @@ func licenseStatusHandler(svc *service.Container) gin.HandlerFunc {
|
|||||||
if idErr == nil {
|
if idErr == nil {
|
||||||
var upstream licenseServerStatusResp
|
var upstream licenseServerStatusResp
|
||||||
if getErr := client.get(c.Request.Context(), "/api/v1/status/"+url.PathEscape(deviceID), &upstream); getErr == nil && upstream.Valid {
|
if getErr := client.get(c.Request.Context(), "/api/v1/status/"+url.PathEscape(deviceID), &upstream); getErr == nil && upstream.Valid {
|
||||||
state.Valid = upstream.Valid
|
applyLicenseStatus(&state, upstream, deviceID)
|
||||||
if upstream.LicenseType != nil {
|
|
||||||
state.LicenseType = *upstream.LicenseType
|
|
||||||
}
|
|
||||||
if upstream.ExpiryDate != nil {
|
|
||||||
state.ExpiryDate = *upstream.ExpiryDate
|
|
||||||
}
|
|
||||||
state.MaxUsers = upstream.MaxUsers
|
|
||||||
state.UnlimitedUsers = upstream.UnlimitedUsers
|
|
||||||
state.DaysRemaining = upstream.DaysRemaining
|
|
||||||
if upstream.DeviceName != "" {
|
|
||||||
state.DeviceName = upstream.DeviceName
|
|
||||||
}
|
|
||||||
state.DeviceID = deviceID
|
|
||||||
state.UpdatedAt = time.Now().Format(time.RFC3339)
|
|
||||||
_ = persistLicenseState(c.Request.Context(), svc, state)
|
_ = persistLicenseState(c.Request.Context(), svc, state)
|
||||||
} else if getErr == nil && !upstream.Valid {
|
} else if getErr == nil && !upstream.Valid {
|
||||||
state.Valid = false
|
state.Valid = false
|
||||||
@@ -380,6 +367,29 @@ func licenseStatusMaxUsers(state service.LicenseActivationState) any {
|
|||||||
return service.OpenSourceUserLimit
|
return service.OpenSourceUserLimit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func applyLicenseStatus(state *service.LicenseActivationState, upstream licenseServerStatusResp, deviceID string) {
|
||||||
|
state.Valid = upstream.Valid
|
||||||
|
if upstream.LicenseType != nil {
|
||||||
|
state.LicenseType = *upstream.LicenseType
|
||||||
|
}
|
||||||
|
if upstream.ExpiryDate != nil {
|
||||||
|
state.ExpiryDate = *upstream.ExpiryDate
|
||||||
|
} else {
|
||||||
|
state.ExpiryDate = ""
|
||||||
|
}
|
||||||
|
if upstream.MaxDevices > 0 {
|
||||||
|
state.MaxDevices = upstream.MaxDevices
|
||||||
|
}
|
||||||
|
state.MaxUsers = upstream.MaxUsers
|
||||||
|
state.UnlimitedUsers = upstream.UnlimitedUsers
|
||||||
|
state.DaysRemaining = upstream.DaysRemaining
|
||||||
|
if upstream.DeviceName != "" {
|
||||||
|
state.DeviceName = upstream.DeviceName
|
||||||
|
}
|
||||||
|
state.DeviceID = deviceID
|
||||||
|
state.UpdatedAt = time.Now().Format(time.RFC3339)
|
||||||
|
}
|
||||||
|
|
||||||
func persistLicenseState(ctx context.Context, svc *service.Container, state service.LicenseActivationState) error {
|
func persistLicenseState(ctx context.Context, svc *service.Container, state service.LicenseActivationState) error {
|
||||||
data, err := json.Marshal(state)
|
data, err := json.Marshal(state)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -30,3 +30,50 @@ func TestLicenseStatusMaxUsersFallsBackToOpenSourceLimit(t *testing.T) {
|
|||||||
t.Fatalf("expected open-source max users %d, got %#v", service.OpenSourceUserLimit, got)
|
t.Fatalf("expected open-source max users %d, got %#v", service.OpenSourceUserLimit, got)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestApplyLicenseStatusReflectsEditedLimitAndClearsExpiry(t *testing.T) {
|
||||||
|
maxUsers := 60
|
||||||
|
licenseType := "subscription"
|
||||||
|
state := service.LicenseActivationState{
|
||||||
|
Valid: true,
|
||||||
|
LicenseType: "enterprise",
|
||||||
|
ExpiryDate: "2026-01-01",
|
||||||
|
MaxDevices: 2,
|
||||||
|
UnlimitedUsers: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
applyLicenseStatus(&state, licenseServerStatusResp{
|
||||||
|
Valid: true,
|
||||||
|
LicenseType: &licenseType,
|
||||||
|
ExpiryDate: nil,
|
||||||
|
MaxDevices: 5,
|
||||||
|
MaxUsers: &maxUsers,
|
||||||
|
UnlimitedUsers: false,
|
||||||
|
DeviceName: "Edited Device",
|
||||||
|
}, "device-1")
|
||||||
|
|
||||||
|
if !state.Valid || state.LicenseType != "subscription" || state.ExpiryDate != "" || state.MaxDevices != 5 {
|
||||||
|
t.Fatalf("status fields were not fully refreshed: %+v", state)
|
||||||
|
}
|
||||||
|
if state.MaxUsers == nil || *state.MaxUsers != 60 || state.UnlimitedUsers {
|
||||||
|
t.Fatalf("user limit was not refreshed from status: %+v", state)
|
||||||
|
}
|
||||||
|
if state.DeviceID != "device-1" || state.DeviceName != "Edited Device" {
|
||||||
|
t.Fatalf("device fields were not refreshed: %+v", state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestApplyLicenseStatusReflectsUnlimitedUsers(t *testing.T) {
|
||||||
|
maxUsers := 30
|
||||||
|
state := service.LicenseActivationState{Valid: true, MaxUsers: &maxUsers}
|
||||||
|
|
||||||
|
applyLicenseStatus(&state, licenseServerStatusResp{
|
||||||
|
Valid: true,
|
||||||
|
MaxUsers: nil,
|
||||||
|
UnlimitedUsers: true,
|
||||||
|
}, "device-1")
|
||||||
|
|
||||||
|
if state.MaxUsers != nil || !state.UnlimitedUsers {
|
||||||
|
t.Fatalf("unlimited status should clear previous finite user limit: %+v", state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -72,6 +72,8 @@ export function LicensePage() {
|
|||||||
setStatus({
|
setStatus({
|
||||||
active: true,
|
active: true,
|
||||||
activation,
|
activation,
|
||||||
|
max_users: activation.max_users,
|
||||||
|
unlimited_users: activation.unlimited_users,
|
||||||
message: '已激活',
|
message: '已激活',
|
||||||
})
|
})
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
|
|||||||
Reference in New Issue
Block a user