[Workplace Search] Refactor RoleMappingsLogic (#99284)

* Reorder methods

* Reorder actions interface

* Reorder values interface

* Reorder server details interface

* Add path

* Refactor handleDeleteMapping logic

* REorder and refactor actions

Also changes functions with no return values to properties to match app search

// Before:
foo: () => true

// After
foo: true

* Reorder reducers

* Reorder JSON body props

* Change JSON order in test

Passes locally but fails on CI

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Scotty Bollinger 2021-05-05 11:41:36 -05:00 committed by GitHub
parent ae6109e15a
commit e0d4acb1b1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 119 additions and 118 deletions

View file

@ -293,13 +293,13 @@ describe('RoleMappingsLogic', () => {
expect(http.post).toHaveBeenCalledWith('/api/workplace_search/org/role_mappings', {
body: JSON.stringify({
roleType: 'admin',
allGroups: false,
authProvider: [ANY_AUTH_PROVIDER],
rules: {
username: '',
},
roleType: 'admin',
groups: [],
allGroups: false,
authProvider: [ANY_AUTH_PROVIDER],
}),
});
await nextTick();
@ -317,13 +317,13 @@ describe('RoleMappingsLogic', () => {
`/api/workplace_search/org/role_mappings/${wsRoleMapping.id}`,
{
body: JSON.stringify({
roleType: 'admin',
allGroups: true,
authProvider: [ANY_AUTH_PROVIDER, 'other_auth'],
rules: {
username: 'user',
},
roleType: 'admin',
groups: [],
allGroups: true,
authProvider: [ANY_AUTH_PROVIDER, 'other_auth'],
}),
}
);

View file

@ -28,8 +28,8 @@ import {
} from './constants';
interface RoleMappingsServerDetails {
multipleAuthProvidersConfig: boolean;
roleMappings: WSRoleMapping[];
multipleAuthProvidersConfig: boolean;
}
interface RoleMappingServerDetails {
@ -41,68 +41,69 @@ interface RoleMappingServerDetails {
roleMapping?: WSRoleMapping;
}
interface RoleMappingsActions {
setRoleMappingsData(data: RoleMappingsServerDetails): RoleMappingsServerDetails;
setRoleMappingData(data: RoleMappingServerDetails): RoleMappingServerDetails;
handleRoleChange(roleType: Role): { roleType: Role };
handleAllGroupsSelectionChange(selected: boolean): { selected: boolean };
handleAttributeSelectorChange(
value: AttributeName,
firstElasticsearchRole: string
): { value: AttributeName; firstElasticsearchRole: string };
handleAttributeValueChange(value: string): { value: string };
handleGroupSelectionChange(
groupId: string,
selected: boolean
): { groupId: string; selected: boolean };
handleAuthProviderChange(value: string[]): { value: string[] };
resetState(): void;
initializeRoleMapping(roleId?: string): { roleId?: string };
handleSaveMapping(): void;
handleDeleteMapping(): void;
initializeRoleMappings(): void;
}
interface RoleMappingsValues {
attributes: string[];
availableAuthProviders: string[];
elasticsearchRoles: string[];
roleMapping: WSRoleMapping | null;
roleMappings: WSRoleMapping[];
roleType: Role;
attributeValue: string;
attributeName: AttributeName;
dataLoading: boolean;
multipleAuthProvidersConfig: boolean;
availableGroups: RoleGroup[];
selectedGroups: Set<string>;
includeInAllGroups: boolean;
selectedAuthProviders: string[];
}
const getFirstAttributeName = (roleMapping: WSRoleMapping): AttributeName =>
Object.entries(roleMapping.rules)[0][0] as AttributeName;
const getFirstAttributeValue = (roleMapping: WSRoleMapping): string =>
Object.entries(roleMapping.rules)[0][1] as string;
interface RoleMappingsActions {
handleAllGroupsSelectionChange(selected: boolean): { selected: boolean };
handleAuthProviderChange(value: string[]): { value: string[] };
handleAttributeSelectorChange(
value: AttributeName,
firstElasticsearchRole: string
): { value: AttributeName; firstElasticsearchRole: string };
handleAttributeValueChange(value: string): { value: string };
handleDeleteMapping(): void;
handleGroupSelectionChange(
groupId: string,
selected: boolean
): { groupId: string; selected: boolean };
handleRoleChange(roleType: Role): { roleType: Role };
handleSaveMapping(): void;
initializeRoleMapping(roleId?: string): { roleId?: string };
initializeRoleMappings(): void;
resetState(): void;
setRoleMappingData(data: RoleMappingServerDetails): RoleMappingServerDetails;
setRoleMappingsData(data: RoleMappingsServerDetails): RoleMappingsServerDetails;
}
interface RoleMappingsValues {
includeInAllGroups: boolean;
attributeName: AttributeName;
attributeValue: string;
attributes: string[];
availableAuthProviders: string[];
availableGroups: RoleGroup[];
dataLoading: boolean;
elasticsearchRoles: string[];
multipleAuthProvidersConfig: boolean;
roleMapping: WSRoleMapping | null;
roleMappings: WSRoleMapping[];
roleType: Role;
selectedAuthProviders: string[];
selectedGroups: Set<string>;
}
export const RoleMappingsLogic = kea<MakeLogicType<RoleMappingsValues, RoleMappingsActions>>({
path: ['enterprise_search', 'workplace_search', 'role_mappings'],
actions: {
setRoleMappingsData: (data: RoleMappingsServerDetails) => data,
setRoleMappingData: (data: RoleMappingServerDetails) => data,
handleAuthProviderChange: (value: string[]) => ({ value }),
handleRoleChange: (roleType: Role) => ({ roleType }),
handleGroupSelectionChange: (groupId: string, selected: boolean) => ({ groupId, selected }),
handleAllGroupsSelectionChange: (selected: boolean) => ({ selected }),
handleAttributeSelectorChange: (value: string, firstElasticsearchRole: string) => ({
value,
firstElasticsearchRole,
}),
handleAttributeValueChange: (value: string) => ({ value }),
handleAuthProviderChange: (value: string[]) => ({ value }),
resetState: () => true,
handleAllGroupsSelectionChange: (selected: boolean) => ({ selected }),
resetState: true,
initializeRoleMappings: true,
initializeRoleMapping: (roleId?: string) => ({ roleId }),
handleSaveMapping: () => true,
handleDeleteMapping: () => true,
initializeRoleMappings: () => true,
handleDeleteMapping: true,
handleSaveMapping: true,
},
reducers: {
dataLoading: [
@ -120,10 +121,12 @@ export const RoleMappingsLogic = kea<MakeLogicType<RoleMappingsValues, RoleMappi
resetState: () => [],
},
],
attributes: [
[],
multipleAuthProvidersConfig: [
false,
{
setRoleMappingData: (_, { attributes }) => attributes,
setRoleMappingsData: (_, { multipleAuthProvidersConfig }) => multipleAuthProvidersConfig,
setRoleMappingData: (_, { multipleAuthProvidersConfig }) => multipleAuthProvidersConfig,
resetState: () => false,
},
],
availableGroups: [
@ -132,6 +135,60 @@ export const RoleMappingsLogic = kea<MakeLogicType<RoleMappingsValues, RoleMappi
setRoleMappingData: (_, { availableGroups }) => availableGroups,
},
],
attributes: [
[],
{
setRoleMappingData: (_, { attributes }) => attributes,
},
],
elasticsearchRoles: [
[],
{
setRoleMappingData: (_, { elasticsearchRoles }) => elasticsearchRoles,
},
],
roleMapping: [
null,
{
setRoleMappingData: (_, { roleMapping }) => roleMapping || null,
resetState: () => null,
},
],
roleType: [
'admin',
{
setRoleMappingData: (_, { roleMapping }) =>
roleMapping ? (roleMapping.roleType as Role) : 'admin',
handleRoleChange: (_, { roleType }) => roleType,
},
],
includeInAllGroups: [
false,
{
setRoleMappingData: (_, { roleMapping }) => (roleMapping ? roleMapping.allGroups : false),
handleAllGroupsSelectionChange: (_, { selected }) => selected,
},
],
attributeValue: [
'',
{
setRoleMappingData: (_, { roleMapping }) =>
roleMapping ? getFirstAttributeValue(roleMapping) : '',
handleAttributeSelectorChange: (_, { value, firstElasticsearchRole }) =>
value === 'role' ? firstElasticsearchRole : '',
handleAttributeValueChange: (_, { value }) => value,
resetState: () => '',
},
],
attributeName: [
'username',
{
setRoleMappingData: (_, { roleMapping }) =>
roleMapping ? getFirstAttributeName(roleMapping) : 'username',
handleAttributeSelectorChange: (_, { value }) => value,
resetState: () => 'username',
},
],
selectedGroups: [
new Set(),
{
@ -154,68 +211,12 @@ export const RoleMappingsLogic = kea<MakeLogicType<RoleMappingsValues, RoleMappi
},
},
],
includeInAllGroups: [
false,
{
setRoleMappingData: (_, { roleMapping }) => (roleMapping ? roleMapping.allGroups : false),
handleAllGroupsSelectionChange: (_, { selected }) => selected,
},
],
elasticsearchRoles: [
[],
{
setRoleMappingData: (_, { elasticsearchRoles }) => elasticsearchRoles,
},
],
roleMapping: [
null,
{
setRoleMappingData: (_, { roleMapping }) => roleMapping || null,
resetState: () => null,
},
],
roleType: [
'admin',
{
setRoleMappingData: (_, { roleMapping }) =>
roleMapping ? (roleMapping.roleType as Role) : 'admin',
handleRoleChange: (_, { roleType }) => roleType,
},
],
attributeValue: [
'',
{
setRoleMappingData: (_, { roleMapping }) =>
roleMapping ? getFirstAttributeValue(roleMapping) : '',
handleAttributeSelectorChange: (_, { value, firstElasticsearchRole }) =>
value === 'role' ? firstElasticsearchRole : '',
handleAttributeValueChange: (_, { value }) => value,
resetState: () => '',
},
],
attributeName: [
'username',
{
setRoleMappingData: (_, { roleMapping }) =>
roleMapping ? getFirstAttributeName(roleMapping) : 'username',
handleAttributeSelectorChange: (_, { value }) => value,
resetState: () => 'username',
},
],
availableAuthProviders: [
[],
{
setRoleMappingData: (_, { authProviders }) => authProviders,
},
],
multipleAuthProvidersConfig: [
false,
{
setRoleMappingsData: (_, { multipleAuthProvidersConfig }) => multipleAuthProvidersConfig,
setRoleMappingData: (_, { multipleAuthProvidersConfig }) => multipleAuthProvidersConfig,
resetState: () => false,
},
],
selectedAuthProviders: [
[ANY_AUTH_PROVIDER],
{
@ -264,13 +265,13 @@ export const RoleMappingsLogic = kea<MakeLogicType<RoleMappingsValues, RoleMappi
}
},
handleDeleteMapping: async () => {
const { roleMapping } = values;
if (!roleMapping) return;
const { http } = HttpLogic.values;
const { navigateToUrl } = KibanaLogic.values;
const { roleMapping } = values;
if (!roleMapping) {
return;
}
const route = `/api/workplace_search/org/role_mappings/${roleMapping.id}`;
if (window.confirm(DELETE_ROLE_MAPPING_MESSAGE)) {
try {
await http.delete(route);
@ -295,13 +296,13 @@ export const RoleMappingsLogic = kea<MakeLogicType<RoleMappingsValues, RoleMappi
} = values;
const body = JSON.stringify({
roleType,
allGroups: includeInAllGroups,
authProvider: selectedAuthProviders,
rules: {
[attributeName]: attributeValue,
},
roleType,
groups: includeInAllGroups ? [] : Array.from(selectedGroups),
allGroups: includeInAllGroups,
authProvider: selectedAuthProviders,
});
const request = !roleMapping