2023-08-04 10:42:04 +00:00
|
|
|
import { UserContext } from "@dashboard/auth/types";
|
|
|
|
import { MultiAutocompleteChoiceType } from "@dashboard/components/MultiAutocompleteSelectField";
|
2022-03-09 08:56:55 +00:00
|
|
|
import {
|
2023-08-04 10:42:04 +00:00
|
|
|
ChannelFragment,
|
2022-03-09 08:56:55 +00:00
|
|
|
PermissionFragment,
|
|
|
|
PermissionGroupDetailsFragment,
|
2022-06-21 09:36:55 +00:00
|
|
|
UserFragment,
|
2023-01-16 09:45:12 +00:00
|
|
|
} from "@dashboard/graphql";
|
2021-05-14 08:15:15 +00:00
|
|
|
import difference from "lodash/difference";
|
2020-04-23 15:43:08 +00:00
|
|
|
|
|
|
|
import { PermissionGroupDetailsPageFormData } from "./components/PermissionGroupDetailsPage";
|
|
|
|
/**
|
|
|
|
* Will return true if group has all permissions available in shop assigned.
|
|
|
|
*/
|
|
|
|
export const isGroupFullAccess = (
|
2023-08-04 10:42:04 +00:00
|
|
|
permissionGroup: PermissionGroupDetailsFragment | null | undefined,
|
2022-06-21 09:36:55 +00:00
|
|
|
shopPermissions: Array<Omit<PermissionFragment, "__typename">>,
|
2020-04-23 15:43:08 +00:00
|
|
|
) => {
|
2023-08-04 10:42:04 +00:00
|
|
|
if (!permissionGroup) {
|
|
|
|
return false;
|
|
|
|
}
|
2020-04-23 15:43:08 +00:00
|
|
|
const assignedCodes = extractPermissionCodes(permissionGroup);
|
|
|
|
|
|
|
|
if (assignedCodes.length !== shopPermissions?.length) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const permission of shopPermissions) {
|
|
|
|
if (assignedCodes.indexOf(permission.code) === undefined) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return list of codes which are assigned to the permission group.
|
|
|
|
*/
|
|
|
|
export const extractPermissionCodes = (
|
2023-08-04 10:42:04 +00:00
|
|
|
permissionGroup: PermissionGroupDetailsFragment | null | undefined,
|
|
|
|
) => {
|
|
|
|
if (!permissionGroup) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
|
|
|
return permissionGroup?.permissions
|
2020-04-23 15:43:08 +00:00
|
|
|
? permissionGroup.permissions.map(perm => perm.code)
|
|
|
|
: [];
|
2023-08-04 10:42:04 +00:00
|
|
|
};
|
2020-04-23 15:43:08 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Return lists of permissions which have to be added and removed from group.
|
|
|
|
*/
|
|
|
|
export const permissionsDiff = (
|
2023-08-04 10:42:04 +00:00
|
|
|
permissionGroup: PermissionGroupDetailsFragment | null | undefined,
|
2022-06-21 09:36:55 +00:00
|
|
|
formData: PermissionGroupDetailsPageFormData,
|
2020-04-23 15:43:08 +00:00
|
|
|
) => {
|
2023-08-04 10:42:04 +00:00
|
|
|
if (!permissionGroup) {
|
|
|
|
return {
|
|
|
|
addPermissions: [],
|
|
|
|
removePermissions: [],
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2020-04-23 15:43:08 +00:00
|
|
|
const newPermissions = formData.permissions;
|
|
|
|
const oldPermissions = extractPermissionCodes(permissionGroup);
|
|
|
|
|
|
|
|
return {
|
|
|
|
addPermissions: difference(newPermissions, oldPermissions),
|
2022-06-21 09:36:55 +00:00
|
|
|
removePermissions: difference(oldPermissions, newPermissions),
|
2020-04-23 15:43:08 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return lists of users which have to be added and removed from group.
|
|
|
|
*/
|
|
|
|
export const usersDiff = (
|
2023-08-04 10:42:04 +00:00
|
|
|
permissionGroup: PermissionGroupDetailsFragment | null | undefined,
|
2022-06-21 09:36:55 +00:00
|
|
|
formData: PermissionGroupDetailsPageFormData,
|
2020-04-23 15:43:08 +00:00
|
|
|
) => {
|
2023-08-04 10:42:04 +00:00
|
|
|
if (!permissionGroup) {
|
|
|
|
return {
|
|
|
|
addUsers: [],
|
|
|
|
removeUsers: [],
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
const newUsers = formData?.users?.map(u => u.id) ?? [];
|
|
|
|
const oldUsers = permissionGroup?.users?.map(u => u.id) ?? [];
|
2020-04-23 15:43:08 +00:00
|
|
|
|
|
|
|
return {
|
|
|
|
addUsers: difference(newUsers, oldUsers),
|
2022-06-21 09:36:55 +00:00
|
|
|
removeUsers: difference(oldUsers, newUsers),
|
2020-04-23 15:43:08 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2023-08-04 10:42:04 +00:00
|
|
|
/**
|
|
|
|
* Return lists of channels which have to be added and removed from group.
|
|
|
|
*/
|
|
|
|
export const channelsDiff = (
|
|
|
|
permissionGroup: PermissionGroupDetailsFragment | null | undefined,
|
|
|
|
formData: PermissionGroupDetailsPageFormData,
|
|
|
|
allChannels: ChannelFragment[],
|
|
|
|
isGroupEditable: boolean,
|
|
|
|
) => {
|
|
|
|
if (!permissionGroup || !isGroupEditable) {
|
|
|
|
return {
|
|
|
|
addChannels: [],
|
|
|
|
removeChannels: [],
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
const newChannels = formData.hasAllChannels
|
|
|
|
? allChannels.map(c => c.id)
|
|
|
|
: formData.channels;
|
|
|
|
const oldChannels = permissionGroup?.accessibleChannels?.map(c => c.id) ?? [];
|
|
|
|
const hasRestrictedChannels =
|
|
|
|
permissionGroup?.restrictedAccessToChannels ?? false;
|
|
|
|
|
|
|
|
if (!hasRestrictedChannels) {
|
|
|
|
return {
|
|
|
|
addChannels: newChannels,
|
|
|
|
removeChannels: [],
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
addChannels: difference(newChannels, oldChannels),
|
|
|
|
removeChannels: difference(oldChannels, newChannels),
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2020-04-23 15:43:08 +00:00
|
|
|
/**
|
|
|
|
* Permissions are exceeded when group has permission which is not handled by user
|
|
|
|
*/
|
|
|
|
export const arePermissionsExceeded = (
|
2023-08-04 10:42:04 +00:00
|
|
|
permissionGroup: PermissionGroupDetailsFragment | null | undefined,
|
|
|
|
user: UserFragment | null | undefined,
|
2020-04-23 15:43:08 +00:00
|
|
|
) => {
|
2023-08-04 10:42:04 +00:00
|
|
|
if (!permissionGroup || !user) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-04-23 15:43:08 +00:00
|
|
|
const groupPermissions = extractPermissionCodes(permissionGroup);
|
2023-08-04 10:42:04 +00:00
|
|
|
const userPermissions = user?.userPermissions?.map(p => p.code) ?? [];
|
2020-04-23 15:43:08 +00:00
|
|
|
return difference(groupPermissions, userPermissions).length > 0;
|
|
|
|
};
|
2023-08-04 10:42:04 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Return lists of permission group accessible channels.
|
|
|
|
*/
|
|
|
|
export const mapAccessibleChannelsToChoice = (
|
|
|
|
permissionGroup: PermissionGroupDetailsFragment,
|
|
|
|
isUserAbleToEdit?: boolean,
|
|
|
|
): MultiAutocompleteChoiceType[] =>
|
|
|
|
permissionGroup?.accessibleChannels?.map(
|
|
|
|
channel =>
|
|
|
|
({
|
|
|
|
label: channel.name,
|
|
|
|
value: channel.id,
|
|
|
|
disabled: isUserAbleToEdit !== undefined ? !isUserAbleToEdit : false,
|
|
|
|
} as unknown as MultiAutocompleteChoiceType),
|
|
|
|
) ?? [];
|
|
|
|
|
|
|
|
export const checkIfUserBelongToPermissionGroup = (
|
|
|
|
permissionGroup: PermissionGroupDetailsFragment | null | undefined,
|
|
|
|
userId: string,
|
|
|
|
) => {
|
|
|
|
return permissionGroup?.users?.some(u => u.id === userId) ?? false;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get channels options for select field.
|
|
|
|
*/
|
|
|
|
export const getUserAccessibleChannelsOptions = (
|
|
|
|
availableChannels: ChannelFragment[],
|
|
|
|
user?: UserContext["user"],
|
|
|
|
): ChannelFragment[] => {
|
|
|
|
if (!user) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!user.restrictedAccessToChannels) {
|
|
|
|
return availableChannels;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (user.accessibleChannels !== null) {
|
|
|
|
return user.accessibleChannels;
|
|
|
|
}
|
|
|
|
|
|
|
|
return [];
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if user has restricted access to channels.
|
|
|
|
*/
|
|
|
|
export const checkIfUserHasRestictedAccessToChannels = (
|
|
|
|
user?: UserContext["user"],
|
|
|
|
) => {
|
|
|
|
if (user) {
|
|
|
|
return user.restrictedAccessToChannels;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const getInitialChannels = (
|
|
|
|
permissionGroup: PermissionGroupDetailsFragment | null | undefined,
|
|
|
|
allChannelsLength: number,
|
|
|
|
) => {
|
|
|
|
if (!permissionGroup) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
|
|
!permissionGroup?.restrictedAccessToChannels &&
|
|
|
|
permissionGroup?.accessibleChannels?.length === allChannelsLength
|
|
|
|
) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
|
|
|
return permissionGroup?.accessibleChannels?.map(channel => channel.id) ?? [];
|
|
|
|
};
|