2023-05-08 13:17:19 +00:00
|
|
|
import { isEqual } from "lodash";
|
2021-04-29 13:47:33 +00:00
|
|
|
|
|
|
|
|
import { IInvite } from "interfaces/invite";
|
2023-04-07 15:36:47 +00:00
|
|
|
import { IUser, IUserUpdateBody, IUpdateUserFormData } from "interfaces/user";
|
|
|
|
|
import { IRole } from "interfaces/role";
|
2021-04-29 13:47:33 +00:00
|
|
|
import { IFormData } from "../components/UserForm/UserForm";
|
|
|
|
|
|
|
|
|
|
type ICurrentUserData = Pick<
|
|
|
|
|
IUser,
|
|
|
|
|
"global_role" | "teams" | "name" | "email" | "sso_enabled"
|
|
|
|
|
>;
|
|
|
|
|
|
2023-04-07 15:36:47 +00:00
|
|
|
interface IRoleOptionsParams {
|
|
|
|
|
isPremiumTier?: boolean;
|
|
|
|
|
isApiOnly?: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-29 13:47:33 +00:00
|
|
|
/**
|
|
|
|
|
* Helper function that will compare the current user with data from the editing
|
|
|
|
|
* form and return an object with the difference between the two. This can be
|
|
|
|
|
* be used for PATCH updates when updating a user.
|
|
|
|
|
* @param currentUserData
|
|
|
|
|
* @param formData
|
|
|
|
|
*/
|
|
|
|
|
const generateUpdateData = (
|
|
|
|
|
currentUserData: IUser | IInvite,
|
|
|
|
|
formData: IFormData
|
2023-04-07 15:36:47 +00:00
|
|
|
): IUpdateUserFormData => {
|
2021-04-29 13:47:33 +00:00
|
|
|
const updatableFields = [
|
|
|
|
|
"global_role",
|
|
|
|
|
"teams",
|
|
|
|
|
"name",
|
|
|
|
|
"email",
|
|
|
|
|
"sso_enabled",
|
|
|
|
|
];
|
2023-04-07 15:36:47 +00:00
|
|
|
return Object.keys(formData).reduce<IUserUpdateBody | any>(
|
2021-04-29 13:47:33 +00:00
|
|
|
(updatedAttributes, attr) => {
|
|
|
|
|
// attribute can be updated and is different from the current value.
|
|
|
|
|
if (
|
|
|
|
|
updatableFields.includes(attr) &&
|
|
|
|
|
!isEqual(
|
|
|
|
|
formData[attr as keyof ICurrentUserData],
|
|
|
|
|
currentUserData[attr as keyof ICurrentUserData]
|
|
|
|
|
)
|
|
|
|
|
) {
|
|
|
|
|
// Note: ignore TS error as we will never have undefined set to an
|
|
|
|
|
// updatedAttributes value if we get to this code.
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
updatedAttributes[attr as keyof ICurrentUserData] =
|
|
|
|
|
formData[attr as keyof ICurrentUserData];
|
|
|
|
|
}
|
|
|
|
|
return updatedAttributes;
|
|
|
|
|
},
|
|
|
|
|
{}
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
2023-04-07 15:36:47 +00:00
|
|
|
export const roleOptions = ({
|
|
|
|
|
isPremiumTier,
|
|
|
|
|
isApiOnly,
|
|
|
|
|
}: IRoleOptionsParams): IRole[] => {
|
|
|
|
|
const roles: IRole[] = [
|
|
|
|
|
{
|
|
|
|
|
disabled: false,
|
|
|
|
|
label: "Observer",
|
|
|
|
|
value: "observer",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
disabled: false,
|
|
|
|
|
label: "Maintainer",
|
|
|
|
|
value: "maintainer",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
disabled: false,
|
|
|
|
|
label: "Admin",
|
|
|
|
|
value: "admin",
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
if (isPremiumTier) {
|
|
|
|
|
roles.unshift({
|
|
|
|
|
disabled: false,
|
|
|
|
|
label: "Observer+",
|
|
|
|
|
value: "observer_plus",
|
|
|
|
|
});
|
2023-04-18 14:52:03 +00:00
|
|
|
|
|
|
|
|
if (isApiOnly) {
|
|
|
|
|
roles.splice(3, 0, {
|
|
|
|
|
disabled: false,
|
|
|
|
|
label: "GitOps",
|
|
|
|
|
value: "gitops",
|
|
|
|
|
});
|
|
|
|
|
}
|
2023-04-07 15:36:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return roles;
|
|
|
|
|
};
|
|
|
|
|
|
2021-04-29 13:47:33 +00:00
|
|
|
export default {
|
|
|
|
|
generateUpdateData,
|
2023-04-07 15:36:47 +00:00
|
|
|
roleOptions,
|
2021-04-29 13:47:33 +00:00
|
|
|
};
|