From b37cde5a8c13f210147f3db62e7f7f3de0400ffa Mon Sep 17 00:00:00 2001 From: MaysWind Date: Mon, 30 Jun 2025 22:06:43 +0800 Subject: [PATCH] user feature restriction supports application settings syncing --- conf/ezbookkeeping.ini | 1 + pkg/api/user_app_cloud_settings.go | 31 ++++++++++++++++++++++- pkg/core/user_feature_restriction.go | 10 ++++++-- pkg/core/user_feature_restriction_test.go | 4 ++- 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/conf/ezbookkeeping.ini b/conf/ezbookkeeping.ini index bddff559..ae734f8e 100644 --- a/conf/ezbookkeeping.ini +++ b/conf/ezbookkeeping.ini @@ -236,6 +236,7 @@ max_user_avatar_size = 1048576 # 9: Import Transactions # 10: Export Transactions # 11: Clear All Data +# 12: Sync Application Settings default_feature_restrictions = [data] diff --git a/pkg/api/user_app_cloud_settings.go b/pkg/api/user_app_cloud_settings.go index 0e575303..3cb38a74 100644 --- a/pkg/api/user_app_cloud_settings.go +++ b/pkg/api/user_app_cloud_settings.go @@ -14,12 +14,14 @@ import ( // UserApplicationCloudSettingsApi represents user application cloud settings api type UserApplicationCloudSettingsApi struct { userAppCloudSettings *services.UserApplicationCloudSettingsService + users *services.UserService } // Initialize a user application cloud settings api singleton instance var ( UserApplicationCloudSettings = &UserApplicationCloudSettingsApi{ userAppCloudSettings: services.UserApplicationCloudSettings, + users: services.Users, } ) @@ -58,6 +60,20 @@ func (a *UserApplicationCloudSettingsApi) ApplicationSettingsUpdateHandler(c *co } uid := c.GetCurrentUid() + user, err := a.users.GetUserById(c, uid) + + if err != nil { + if !errs.IsCustomError(err) { + log.Warnf(c, "[user_app_cloud_settings.ApplicationSettingsUpdateHandler] failed to get user for user \"uid:%d\", because %s", uid, err.Error()) + } + + return false, errs.ErrUserNotFound + } + + if user.FeatureRestriction.Contains(core.USER_FEATURE_RESTRICTION_TYPE_SYNC_APPLICATION_SETTINGS) { + return false, errs.ErrNotPermittedToPerformThisAction + } + userApplicationCloudSettings, err := a.userAppCloudSettings.GetUserApplicationCloudSettingsByUid(c, uid) if err != nil { @@ -179,8 +195,21 @@ func (a *UserApplicationCloudSettingsApi) ApplicationSettingsUpdateHandler(c *co // ApplicationSettingsDisableHandler disabled user application cloud settings by request parameters for current user func (a *UserApplicationCloudSettingsApi) ApplicationSettingsDisableHandler(c *core.WebContext) (any, *errs.Error) { uid := c.GetCurrentUid() + user, err := a.users.GetUserById(c, uid) - err := a.userAppCloudSettings.ClearUserApplicationCloudSettings(c, uid) + if err != nil { + if !errs.IsCustomError(err) { + log.Warnf(c, "[user_app_cloud_settings.ApplicationSettingsDisableHandler] failed to get user for user \"uid:%d\", because %s", uid, err.Error()) + } + + return false, errs.ErrUserNotFound + } + + if user.FeatureRestriction.Contains(core.USER_FEATURE_RESTRICTION_TYPE_SYNC_APPLICATION_SETTINGS) { + return false, errs.ErrNotPermittedToPerformThisAction + } + + err = a.userAppCloudSettings.ClearUserApplicationCloudSettings(c, uid) if err != nil { log.Errorf(c, "[user_app_cloud_settings.ApplicationSettingsDisableHandler] failed to clear user application cloud settings for user \"uid:%d\", because %s", uid, err.Error()) diff --git a/pkg/core/user_feature_restriction.go b/pkg/core/user_feature_restriction.go index 8a8f13b2..3285b0a0 100644 --- a/pkg/core/user_feature_restriction.go +++ b/pkg/core/user_feature_restriction.go @@ -31,7 +31,7 @@ func (r UserFeatureRestrictions) Contains(featureRestrictionType UserFeatureRest func (r UserFeatureRestrictions) String() string { builder := strings.Builder{} - for restrictionType := USER_FEATURE_RESTRICTION_TYPE_UPDATE_PASSWORD; restrictionType <= USER_FEATURE_RESTRICTION_TYPE_CLEAR_ALL_DATA; restrictionType++ { + for restrictionType := userFeatureRestrictionTypeMinValue; restrictionType <= userFeatureRestrictionTypeMaxValue; restrictionType++ { if !r.Contains(restrictionType) { continue } @@ -62,7 +62,7 @@ func ParseUserFeatureRestrictions(featureRestrictions string) UserFeatureRestric continue } - if uint64(USER_FEATURE_RESTRICTION_TYPE_UPDATE_PASSWORD) <= uint64(value) && uint64(value) <= uint64(USER_FEATURE_RESTRICTION_TYPE_CLEAR_ALL_DATA) { + if uint64(userFeatureRestrictionTypeMinValue) <= uint64(value) && uint64(value) <= uint64(userFeatureRestrictionTypeMaxValue) { typeValue := uint64(1 << (value - 1)) restrictions = restrictions | typeValue } @@ -87,8 +87,12 @@ const ( USER_FEATURE_RESTRICTION_TYPE_IMPORT_TRANSACTION UserFeatureRestrictionType = 9 USER_FEATURE_RESTRICTION_TYPE_EXPORT_TRANSACTION UserFeatureRestrictionType = 10 USER_FEATURE_RESTRICTION_TYPE_CLEAR_ALL_DATA UserFeatureRestrictionType = 11 + USER_FEATURE_RESTRICTION_TYPE_SYNC_APPLICATION_SETTINGS UserFeatureRestrictionType = 12 ) +const userFeatureRestrictionTypeMinValue UserFeatureRestrictionType = USER_FEATURE_RESTRICTION_TYPE_UPDATE_PASSWORD +const userFeatureRestrictionTypeMaxValue UserFeatureRestrictionType = USER_FEATURE_RESTRICTION_TYPE_SYNC_APPLICATION_SETTINGS + // String returns a textual representation of the restriction type of user features func (t UserFeatureRestrictionType) String() string { switch t { @@ -114,6 +118,8 @@ func (t UserFeatureRestrictionType) String() string { return "Export Transactions" case USER_FEATURE_RESTRICTION_TYPE_CLEAR_ALL_DATA: return "Clear All Data" + case USER_FEATURE_RESTRICTION_TYPE_SYNC_APPLICATION_SETTINGS: + return "Sync Application Settings" default: return fmt.Sprintf("Invalid(%d)", int(t)) } diff --git a/pkg/core/user_feature_restriction_test.go b/pkg/core/user_feature_restriction_test.go index 75bd8f1e..97e70706 100644 --- a/pkg/core/user_feature_restriction_test.go +++ b/pkg/core/user_feature_restriction_test.go @@ -80,6 +80,7 @@ func TestUserFeatureRestrictionsString(t *testing.T) { featureRestrictions = featureRestrictions.Add(USER_FEATURE_RESTRICTION_TYPE_IMPORT_TRANSACTION) featureRestrictions = featureRestrictions.Add(USER_FEATURE_RESTRICTION_TYPE_EXPORT_TRANSACTION) featureRestrictions = featureRestrictions.Add(USER_FEATURE_RESTRICTION_TYPE_CLEAR_ALL_DATA) + featureRestrictions = featureRestrictions.Add(USER_FEATURE_RESTRICTION_TYPE_SYNC_APPLICATION_SETTINGS) expectedValue = "Update Password," + "Update Email," + "Update Profile Basic Info," + @@ -90,7 +91,8 @@ func TestUserFeatureRestrictionsString(t *testing.T) { "Forget Password," + "Import Transactions," + "Export Transactions," + - "Clear All Data" + "Clear All Data," + + "Sync Application Settings" actualValue = featureRestrictions.String() assert.Equal(t, expectedValue, actualValue) }