import api, { getResponseCount } from '@/store/api'; import i18n from '@/i18n'; const getServerErrorMessages = function (error) { let errorData = error.response.data.error ? error.response.data.error : error.response.data; if (typeof errorData == 'string') { return []; } return Object.values(errorData) .reduce((a, b) => a.concat(b)) .filter((info) => info.Message) .map((info) => info.Message); }; const UserManagementStore = { namespaced: true, state: { allUsers: [], accountRoles: [], accountLockoutDuration: null, accountLockoutThreshold: null, accountMinPasswordLength: null, accountMaxPasswordLength: null, }, getters: { allUsers(state) { return state.allUsers; }, accountRoles(state) { return state.accountRoles; }, accountSettings(state) { return { lockoutDuration: state.accountLockoutDuration, lockoutThreshold: state.accountLockoutThreshold, }; }, accountPasswordRequirements(state) { return { minLength: state.accountMinPasswordLength, maxLength: state.accountMaxPasswordLength, }; }, }, mutations: { setUsers(state, allUsers) { state.allUsers = allUsers; }, setAccountRoles(state, accountRoles) { state.accountRoles = accountRoles; }, setLockoutDuration(state, lockoutDuration) { state.accountLockoutDuration = lockoutDuration; }, setLockoutThreshold(state, lockoutThreshold) { state.accountLockoutThreshold = lockoutThreshold; }, setAccountMinPasswordLength(state, minPasswordLength) { state.accountMinPasswordLength = minPasswordLength; }, setAccountMaxPasswordLength(state, maxPasswordLength) { state.accountMaxPasswordLength = maxPasswordLength; }, }, actions: { async getUsers({ commit }) { return await api .get('/redfish/v1/AccountService/Accounts') .then((response) => response.data.Members.map((user) => user['@odata.id']), ) .then((userIds) => api.all(userIds.map((user) => api.get(user)))) .then((users) => { const userData = users.map((user) => user.data); commit('setUsers', userData); }) .catch((error) => { console.log(error); const message = i18n.t('pageUserManagement.toast.errorLoadUsers'); throw new Error(message); }); }, getAccountSettings({ commit }) { api .get('/redfish/v1/AccountService') .then(({ data }) => { commit('setLockoutDuration', data.AccountLockoutDuration); commit('setLockoutThreshold', data.AccountLockoutThreshold); commit('setAccountMinPasswordLength', data.MinPasswordLength); commit('setAccountMaxPasswordLength', data.MaxPasswordLength); }) .catch((error) => { console.log(error); const message = i18n.t( 'pageUserManagement.toast.errorLoadAccountSettings', ); throw new Error(message); }); }, getAccountRoles({ commit }) { api .get('/redfish/v1/AccountService/Roles') .then(({ data: { Members = [] } = {} }) => { const roles = Members.map((role) => { return role['@odata.id'].split('/').pop(); }); commit('setAccountRoles', roles); }) .catch((error) => console.log(error)); }, async createUser({ dispatch }, { username, password, privilege, status }) { const data = { UserName: username, Password: password, RoleId: privilege, Enabled: status, }; return await api .post('/redfish/v1/AccountService/Accounts', data) .then(() => dispatch('getUsers')) .then(() => i18n.t('pageUserManagement.toast.successCreateUser', { username, }), ) .catch((error) => { let serverMessages = getServerErrorMessages(error); let message = serverMessages.length > 0 ? serverMessages.join(' ') : i18n.t('pageUserManagement.toast.errorCreateUser', { username: username, }); throw new Error(message); }); }, async updateUser( { dispatch }, { originalUsername, username, password, privilege, status, locked }, ) { const data = {}; if (username) data.UserName = username; if (password) data.Password = password; if (privilege) data.RoleId = privilege; if (status !== undefined) data.Enabled = status; if (locked !== undefined) data.Locked = locked; return await api .patch(`/redfish/v1/AccountService/Accounts/${originalUsername}`, data) .then(() => dispatch('getUsers')) .then(() => i18n.t('pageUserManagement.toast.successUpdateUser', { username: originalUsername, }), ) .catch((error) => { console.log(error); const serverMessages = getServerErrorMessages(error); const message = serverMessages.length > 0 ? serverMessages.join(' ') : i18n.t('pageUserManagement.toast.errorUpdateUser', { username: originalUsername, }); throw new Error(message); }); }, async deleteUser({ dispatch }, username) { return await api .delete(`/redfish/v1/AccountService/Accounts/${username}`) .then(() => dispatch('getUsers')) .then(() => i18n.t('pageUserManagement.toast.successDeleteUser', { username, }), ) .catch((error) => { console.log(error); const message = i18n.t('pageUserManagement.toast.errorDeleteUser', { username, }); throw new Error(message); }); }, async deleteUsers({ dispatch }, users) { const promises = users.map(({ username }) => { return api .delete(`/redfish/v1/AccountService/Accounts/${username}`) .catch((error) => { console.log(error); return error; }); }); return await api .all(promises) .then((response) => { dispatch('getUsers'); return response; }) .then( api.spread((...responses) => { const { successCount, errorCount } = getResponseCount(responses); let toastMessages = []; if (successCount) { const message = i18n.tc( 'pageUserManagement.toast.successBatchDelete', successCount, ); toastMessages.push({ type: 'success', message }); } if (errorCount) { const message = i18n.tc( 'pageUserManagement.toast.errorBatchDelete', errorCount, ); toastMessages.push({ type: 'error', message }); } return toastMessages; }), ); }, async enableUsers({ dispatch }, users) { const data = { Enabled: true, }; const promises = users.map(({ username }) => { return api .patch(`/redfish/v1/AccountService/Accounts/${username}`, data) .catch((error) => { console.log(error); return error; }); }); return await api .all(promises) .then((response) => { dispatch('getUsers'); return response; }) .then( api.spread((...responses) => { const { successCount, errorCount } = getResponseCount(responses); let toastMessages = []; if (successCount) { const message = i18n.tc( 'pageUserManagement.toast.successBatchEnable', successCount, ); toastMessages.push({ type: 'success', message }); } if (errorCount) { const message = i18n.tc( 'pageUserManagement.toast.errorBatchEnable', errorCount, ); toastMessages.push({ type: 'error', message }); } return toastMessages; }), ); }, async disableUsers({ dispatch }, users) { const data = { Enabled: false, }; const promises = users.map(({ username }) => { return api .patch(`/redfish/v1/AccountService/Accounts/${username}`, data) .catch((error) => { console.log(error); return error; }); }); return await api .all(promises) .then((response) => { dispatch('getUsers'); return response; }) .then( api.spread((...responses) => { const { successCount, errorCount } = getResponseCount(responses); let toastMessages = []; if (successCount) { const message = i18n.tc( 'pageUserManagement.toast.successBatchDisable', successCount, ); toastMessages.push({ type: 'success', message }); } if (errorCount) { const message = i18n.tc( 'pageUserManagement.toast.errorBatchDisable', errorCount, ); toastMessages.push({ type: 'error', message }); } return toastMessages; }), ); }, async saveAccountSettings( { dispatch }, { lockoutThreshold, lockoutDuration }, ) { const data = {}; if (lockoutThreshold !== undefined) { data.AccountLockoutThreshold = lockoutThreshold; } if (lockoutDuration !== undefined) { data.AccountLockoutDuration = lockoutDuration; } return await api .patch('/redfish/v1/AccountService', data) //GET new settings to update view .then(() => dispatch('getAccountSettings')) .then(() => i18n.t('pageUserManagement.toast.successSaveSettings')) .catch((error) => { console.log(error); const message = i18n.t('pageUserManagement.toast.errorSaveSettings'); throw new Error(message); }); }, }, }; export default UserManagementStore;