skyline/src/stores/root.js
Jingwei.Zhang 832cce176c refactor: remove the basic role display from the overview page
1. remove the basic role display from the overview page: because the api removed the base role information[1]
2. fix the title i18n

[1] I461ae3f8979377ae22ec851bf3315e509b22cfbd

Change-Id: Ib0e1ed51010c68dac64159a6154e65399f46a14d
2022-08-18 09:50:15 +08:00

263 lines
6.0 KiB
JavaScript

// Copyright 2021 99cloud
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import { action, observable, extendObservable } from 'mobx';
import { RouterStore } from 'mobx-react-router';
import { parse } from 'qs';
import client from 'client';
import { getQueryString } from 'utils/index';
import { setLocalStorageItem, clearLocalStorage } from 'utils/local-storage';
import { isEmpty, values } from 'lodash';
export class RootStore {
@observable
user = null;
@observable
projectId = null;
@observable
projectName = null;
@observable
roles = [];
@observable
baseDomains = [];
@observable
policies = [];
@observable
hasAdminRole = false;
@observable
hasAdminPageRole = false;
@observable
hasAdminOnlyRole = false;
@observable
openKeys = [];
@observable
endpoints = {};
@observable
oldPassword = {};
@observable
info = {};
@observable
version = '';
@observable
noticeCount = 0;
@observable
enableBilling = false;
@observable
neutronExtensions = [];
// @observable
// menu = renderMenu(i18n.t);
constructor() {
this.routing = new RouterStore();
this.routing.query = this.query;
global.navigateTo = this.routing.push;
}
get client() {
return client.skyline;
}
register(name, store) {
extendObservable(this, { [name]: store });
}
query = (params = {}, refresh = false) => {
const { pathname, search } = this.routing.location;
const currentParams = parse(search.slice(1));
const newParams = refresh ? params : { ...currentParams, ...params };
this.routing.push(`${pathname}?${getQueryString(newParams)}`);
};
setKeystoneToken(result) {
const { keystone_token } = result || {};
setLocalStorageItem('keystone_token', keystone_token);
}
@action
async login(params) {
const result = await this.client.login(params);
this.setKeystoneToken(result);
return this.getUserProfileAndPolicy();
}
async getUserSystemRoles(user) {
// only scope system roles has admin/reader can go to administrator
const { id } = user;
try {
const result = await client.keystone.systemUsers.roles.list(id);
const { roles = [] } = result;
return roles.some((it) => it.name === 'admin' || it.name === 'reader');
} catch (e) {
console.log(e);
return false;
}
}
@action
async updateUserRoles(user) {
const { roles = [], base_domains, user: userInfo = {} } = user || {};
this.roles = roles;
this.baseDomains = base_domains;
this.hasAdminPageRole = await this.getUserSystemRoles(userInfo);
this.hasAdminRole = this.hasAdminPageRole;
this.hasAdminOnlyRole = roles.some((it) => it.name === 'admin');
}
@action
updateUser(user, policies) {
this.user = user;
this.policies = policies;
const {
endpoints = {},
version = '',
project: { id: projectId, name: projectName } = {},
} = user || {};
this.projectId = projectId;
this.projectName = projectName;
this.version = version;
this.endpoints = endpoints;
this.updateUserRoles(user);
this.setKeystoneToken(user);
}
checkEndpoint(key) {
if (!key) {
return true;
}
return !!this.endpoints[key];
}
@action
async getUserProfileAndPolicy() {
const [profile, policies] = await Promise.all([
this.client.profile(),
this.client.policies.list(),
]);
await this.updateUser(profile, policies.policies || []);
return this.getNeutronExtensions();
}
@action
async getNeutronExtensions() {
try {
const { extensions } = await client.neutron.extensions.list();
this.neutronExtensions = extensions;
} catch (error) {
this.neutronExtensions = [];
}
}
@action
async logout() {
await this.client.logout();
this.clearData();
this.user = null;
this.policies = [];
this.roles = [];
this.hasAdminRole = false;
this.hasAdminPageRole = false;
this.version = '';
this.noticeCount = 0;
this.goToLoginPage();
}
@action
goToLoginPage(currentPath, refresh) {
if (currentPath) {
this.routing.push(`/auth/login?referer=${currentPath}`);
} else {
this.routing.push('/auth/login');
}
if (refresh) {
window.location.reload();
}
}
@action
updateOpenKeys(newKeys) {
this.openKeys = newKeys;
}
@action
async switchProject(projectId, domainId) {
this.user = null;
const result = await this.client.switchProject(projectId, domainId);
this.clearData();
this.setKeystoneToken(result);
return this.getUserProfileAndPolicy();
}
@action
async setPasswordInfo(data) {
this.oldPassword = data;
if (!data || isEmpty(data)) {
return;
}
const { region } = data;
const res = await this.client.contrib.keystoneEndpoints();
const regionInfo = res.find((it) => it.region_name === region);
const endpoints = {
keystone: regionInfo.url,
};
this.endpoints = endpoints;
}
@action
addNoticeCount() {
this.noticeCount += 1;
}
@action
removeNoticeCount() {
this.noticeCount -= 1;
}
@action
clearNoticeCount() {
this.noticeCount = 0;
}
clearData() {
// global stores need to be clear data when change auth
const allGlobalStores = require('./index').default;
const stores = values(allGlobalStores);
stores.forEach((store) => {
store.clearData();
});
// clear all local storage expect language
clearLocalStorage(['lang']);
}
}
const globalRootStore = new RootStore();
export default globalRootStore;