From 2c032f17399e79ae594de1a3fee8e7b2229bd574 Mon Sep 17 00:00:00 2001
From: Ali <83188384+testA113@users.noreply.github.com>
Date: Mon, 20 Nov 2023 10:22:48 +1300
Subject: [PATCH] feat(cache): introduce cache option [EE-6293] (#10641)
---
.../migrator/migrate_dbversion110.go | 18 ++++
api/datastore/migrator/migrator.go | 1 +
.../test_data/output_24_to_latest.json | 4 +-
api/http/handler/users/user_update.go | 5 ++
api/portainer.go | 7 +-
app/config.js | 9 ++
.../create-edge-stack-view.html | 2 +-
app/kubernetes/__module.js | 64 +++++++++++++-
.../kube-create-custom-template-view.html | 2 +-
.../kube-registry-access-view.html | 2 +-
app/kubernetes/services/namespaceService.js | 10 ++-
.../resource-pools/resourcePoolsController.js | 2 +-
.../theme/theme-settings.controller.js | 4 +-
app/portainer/models/user.js | 1 +
app/portainer/react/components/account.ts | 17 ++++
app/portainer/react/components/index.ts | 2 +
app/portainer/services/axios.ts | 37 ++++++++
app/portainer/services/http-request.helper.ts | 28 ++++++
app/portainer/users/queries/queryKeys.ts | 4 +-
app/portainer/users/queries/useUser.ts | 4 +-
app/portainer/users/types.ts | 1 +
app/portainer/views/account/account.html | 16 ++--
.../create-user-access-token.html | 2 +-
.../createCustomTemplateView.html | 2 +-
.../views/devices/import/importDevice.html | 2 +-
.../devices/profiles/add/addProfile.html | 2 +-
.../devices/profiles/edit/editProfile.html | 2 +-
.../endpoints/access/endpointAccess.html | 1 +
.../views/endpoints/kvm/endpointKVM.html | 1 +
.../views/groups/access/groupAccess.html | 1 +
.../views/groups/create/creategroup.html | 2 +-
app/portainer/views/groups/edit/group.html | 2 +-
.../registries/create/createRegistry.html | 2 +-
.../views/registries/edit/registry.html | 2 +-
.../settingsAuthentication.html | 2 +-
.../edge-compute/settingsEdgeCompute.html | 2 +-
.../views/stacks/create/createstack.html | 2 +-
app/portainer/views/users/edit/user.html | 2 +-
app/react-tools/test-mocks.ts | 1 +
.../azure/DashboardView/DashboardView.tsx | 2 +-
.../CreateView/CreateView.tsx | 1 +
.../container-instances/ItemView/ItemView.tsx | 1 +
.../container-instances/ListView/ListView.tsx | 2 +-
.../PageHeader/PageHeader.stories.tsx | 1 +
.../components/PageHeader/PageHeader.tsx | 5 +-
.../UsersSelector/UsersSelector.mocks.ts | 1 +
.../containers/CreateView/CreateView.tsx | 1 +
.../docker/networks/ItemView/ItemView.tsx | 1 +
.../WaitingRoomView/WaitingRoomView.tsx | 1 +
.../cluster/ConfigureView/ConfigureView.tsx | 2 +-
.../CreateIngressView/CreateIngressView.tsx | 1 +
.../ApplicationSettingsForm.tsx | 86 +++++++++++++++++++
.../ApplicationSettingsWidget.tsx | 20 +++++
.../AccountView/ApplicationSettings/index.ts | 1 +
.../CreateHelmRepositoriesView.tsx | 1 +
.../account/useUpdateUserMutation.tsx | 32 +++++++
.../EdgeAutoCreateScriptView.tsx | 1 +
.../CreateView/CreateView.tsx | 1 +
.../update-schedules/ItemView/ItemView.tsx | 1 +
.../update-schedules/ListView/ListView.tsx | 2 +-
.../EndpointTypeView.tsx | 1 +
.../EnvironmentsCreationView.tsx | 1 +
.../environments/wizard/HomeView/HomeView.tsx | 1 +
.../settings/SettingsView/SettingsView.tsx | 2 +-
.../users/teams/ItemView/ItemView.tsx | 1 +
.../CreateTeamForm/CreateTeamForm.mocks.ts | 2 +
.../users/teams/ListView/ListView.tsx | 6 +-
app/react/test-utils/withUserProvider.tsx | 1 +
package.json | 1 +
yarn.lock | 13 +++
70 files changed, 418 insertions(+), 45 deletions(-)
create mode 100644 app/portainer/react/components/account.ts
create mode 100644 app/react/portainer/account/AccountView/ApplicationSettings/ApplicationSettingsForm.tsx
create mode 100644 app/react/portainer/account/AccountView/ApplicationSettings/ApplicationSettingsWidget.tsx
create mode 100644 app/react/portainer/account/AccountView/ApplicationSettings/index.ts
create mode 100644 app/react/portainer/account/useUpdateUserMutation.tsx
diff --git a/api/datastore/migrator/migrate_dbversion110.go b/api/datastore/migrator/migrate_dbversion110.go
index 88f0a4f19..d2bbcc677 100644
--- a/api/datastore/migrator/migrate_dbversion110.go
+++ b/api/datastore/migrator/migrate_dbversion110.go
@@ -23,3 +23,21 @@ func (migrator *Migrator) updateAppTemplatesVersionForDB110() error {
return migrator.settingsService.UpdateSettings(settings)
}
+
+// setUseCacheForDB110 sets the user cache to true for all users
+func (migrator *Migrator) setUserCacheForDB110() error {
+ users, err := migrator.userService.ReadAll()
+ if err != nil {
+ return err
+ }
+
+ for i := range users {
+ user := &users[i]
+ user.UseCache = true
+ if err := migrator.userService.Update(user.ID, user); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
diff --git a/api/datastore/migrator/migrator.go b/api/datastore/migrator/migrator.go
index 1e0f7253c..2ef3a0a68 100644
--- a/api/datastore/migrator/migrator.go
+++ b/api/datastore/migrator/migrator.go
@@ -231,6 +231,7 @@ func (m *Migrator) initMigrations() {
m.addMigrations("2.20",
m.updateAppTemplatesVersionForDB110,
+ m.setUserCacheForDB110,
)
// Add new migrations below...
diff --git a/api/datastore/test_data/output_24_to_latest.json b/api/datastore/test_data/output_24_to_latest.json
index ccff02ba6..b91a5d4c5 100644
--- a/api/datastore/test_data/output_24_to_latest.json
+++ b/api/datastore/test_data/output_24_to_latest.json
@@ -903,6 +903,7 @@
"color": ""
},
"TokenIssueAt": 0,
+ "UseCache": true,
"Username": "admin"
},
{
@@ -932,10 +933,11 @@
"color": ""
},
"TokenIssueAt": 0,
+ "UseCache": true,
"Username": "prabhat"
}
],
"version": {
- "VERSION": "{\"SchemaVersion\":\"2.20.0\",\"MigratorCount\":1,\"Edition\":1,\"InstanceID\":\"463d5c47-0ea5-4aca-85b1-405ceefee254\"}"
+ "VERSION": "{\"SchemaVersion\":\"2.20.0\",\"MigratorCount\":2,\"Edition\":1,\"InstanceID\":\"463d5c47-0ea5-4aca-85b1-405ceefee254\"}"
}
}
\ No newline at end of file
diff --git a/api/http/handler/users/user_update.go b/api/http/handler/users/user_update.go
index 7f10194e0..d963ef68b 100644
--- a/api/http/handler/users/user_update.go
+++ b/api/http/handler/users/user_update.go
@@ -24,6 +24,7 @@ type userUpdatePayload struct {
Username string `validate:"required" example:"bob"`
Password string `validate:"required" example:"cg9Wgky3"`
NewPassword string `validate:"required" example:"asfj2emv"`
+ UseCache *bool `validate:"required" example:"true"`
Theme *themePayload
// User role (1 for administrator account and 2 for regular account)
@@ -147,6 +148,10 @@ func (handler *Handler) userUpdate(w http.ResponseWriter, r *http.Request) *http
}
}
+ if payload.UseCache != nil {
+ user.UseCache = *payload.UseCache
+ }
+
if payload.Role != 0 {
user.Role = portainer.UserRole(payload.Role)
user.TokenIssueAt = time.Now().Unix()
diff --git a/api/portainer.go b/api/portainer.go
index 027a572cf..eafc6959d 100644
--- a/api/portainer.go
+++ b/api/portainer.go
@@ -1314,9 +1314,10 @@ type (
Username string `json:"Username" example:"bob"`
Password string `json:"Password,omitempty" swaggerignore:"true"`
// User role (1 for administrator account and 2 for regular account)
- Role UserRole `json:"Role" example:"1"`
- TokenIssueAt int64 `json:"TokenIssueAt" example:"1"`
- ThemeSettings UserThemeSettings
+ Role UserRole `json:"Role" example:"1"`
+ TokenIssueAt int64 `json:"TokenIssueAt" example:"1"`
+ ThemeSettings UserThemeSettings `json:"ThemeSettings"`
+ UseCache bool `json:"UseCache" example:"true"`
// Deprecated fields
diff --git a/app/config.js b/app/config.js
index fc72f3d22..9998b5953 100644
--- a/app/config.js
+++ b/app/config.js
@@ -1,6 +1,7 @@
import { Terminal } from 'xterm';
import * as fit from 'xterm/lib/addons/fit/fit';
import { agentInterceptor } from './portainer/services/axios';
+import { dispatchCacheRefreshEventIfNeeded } from './portainer/services/http-request.helper';
/* @ngInject */
export function configApp($urlRouterProvider, $httpProvider, localStorageServiceProvider, jwtOptionsProvider, $uibTooltipProvider, $compileProvider, cfpLoadingBarProvider) {
@@ -8,6 +9,14 @@ export function configApp($urlRouterProvider, $httpProvider, localStorageService
$compileProvider.debugInfoEnabled(false);
}
+ // ask to clear cache on mutation
+ $httpProvider.interceptors.push(() => ({
+ request: (reqConfig) => {
+ dispatchCacheRefreshEventIfNeeded(reqConfig);
+ return reqConfig;
+ },
+ }));
+
localStorageServiceProvider.setPrefix('portainer');
jwtOptionsProvider.config({
diff --git a/app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.html b/app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.html
index a2bf5914e..de7d96b08 100644
--- a/app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.html
+++ b/app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.html
@@ -1,4 +1,4 @@
-