diff --git a/Client/src/HOC/withAdminCheck.jsx b/Client/src/HOC/withAdminCheck.jsx
index 30a767f36..097f224e9 100644
--- a/Client/src/HOC/withAdminCheck.jsx
+++ b/Client/src/HOC/withAdminCheck.jsx
@@ -10,7 +10,7 @@ const withAdminCheck = (WrappedComponent) => {
useEffect(() => {
networkService
- .doesAdminExist()
+ .doesSuperAdminExist()
.then((response) => {
if (response.data.data === true) {
navigate("/login");
@@ -20,7 +20,7 @@ const withAdminCheck = (WrappedComponent) => {
logger.error(error);
});
}, [navigate]);
- return ;
+ return ;
};
const wrappedComponentName =
WrappedComponent.displayName || WrappedComponent.name || "Component";
diff --git a/Client/src/Pages/Auth/Login.jsx b/Client/src/Pages/Auth/Login.jsx
index b962fbb9a..30b7f8f8a 100644
--- a/Client/src/Pages/Auth/Login.jsx
+++ b/Client/src/Pages/Auth/Login.jsx
@@ -301,7 +301,7 @@ const Login = () => {
return;
}
networkService
- .doesAdminExist()
+ .doesSuperAdminExist()
.then((response) => {
if (response.data.data === false) {
navigate("/register");
diff --git a/Client/src/Pages/Auth/Register/Register.jsx b/Client/src/Pages/Auth/Register/Register.jsx
index 4680c1821..4dd8fad24 100644
--- a/Client/src/Pages/Auth/Register/Register.jsx
+++ b/Client/src/Pages/Auth/Register/Register.jsx
@@ -23,11 +23,11 @@ import { logger } from "../../../Utils/Logger";
* Displays the initial landing page.
*
* @param {Object} props
- * @param {boolean} props.isAdmin - Whether the user is creating and admin account
+ * @param {boolean} props.isSuperAdmin - Whether the user is creating and admin account
* @param {Function} props.onContinue - Callback function to handle "Continue with Email" button click.
* @returns {JSX.Element}
*/
-const LandingPage = ({ isAdmin, onSignup }) => {
+const LandingPage = ({ isSuperAdmin, onSignup }) => {
const theme = useTheme();
return (
@@ -40,7 +40,8 @@ const LandingPage = ({ isAdmin, onSignup }) => {
Sign Up
- Create your {isAdmin ? "admin " : ""}account to get started.
+ Create your {isSuperAdmin ? "Super admin " : ""}account to get
+ started.
@@ -93,7 +94,7 @@ const LandingPage = ({ isAdmin, onSignup }) => {
};
LandingPage.propTypes = {
- isAdmin: PropTypes.bool,
+ isSuperAdmin: PropTypes.bool,
onSignup: PropTypes.func,
};
@@ -422,7 +423,7 @@ StepThree.propTypes = {
onBack: PropTypes.func,
};
-const Register = ({ isAdmin }) => {
+const Register = ({ isSuperAdmin }) => {
const dispatch = useDispatch();
const navigate = useNavigate();
const { token } = useParams();
@@ -525,7 +526,10 @@ const Register = ({ isAdmin }) => {
const handleStepThree = async (e) => {
e.preventDefault();
- let registerForm = { ...form, role: isAdmin ? ["admin"] : form.role };
+ let registerForm = {
+ ...form,
+ role: isSuperAdmin ? ["superadmin"] : form.role,
+ };
let error = validateForm(registerForm, {
context: { password: form.password },
});
@@ -616,7 +620,10 @@ const Register = ({ isAdmin }) => {
}}
>
{step === 0 ? (
- setStep(1)} />
+ setStep(1)}
+ />
) : step === 1 ? (
{
);
};
Register.propTypes = {
- isAdmin: PropTypes.bool,
+ isSuperAdmin: PropTypes.bool,
};
export default Register;
diff --git a/Client/src/Utils/NetworkService.js b/Client/src/Utils/NetworkService.js
index de4508cff..97071a7aa 100644
--- a/Client/src/Utils/NetworkService.js
+++ b/Client/src/Utils/NetworkService.js
@@ -293,8 +293,8 @@ class NetworkService {
* @returns {Promise} The response from the axios GET request.
*
*/
- async doesAdminExist() {
- return this.axiosInstance.get("/auth/users/admin");
+ async doesSuperAdminExist() {
+ return this.axiosInstance.get("/auth/users/superadmin");
}
/**
diff --git a/Server/validation/joi.js b/Server/validation/joi.js
index 4f8042e12..3a9b7e1a1 100644
--- a/Server/validation/joi.js
+++ b/Server/validation/joi.js
@@ -5,8 +5,11 @@ const joi = require("joi");
//****************************************
const roleValidatior = (role) => (value, helpers) => {
- if (!value.includes(role)) {
- throw new joi.ValidationError(`You do not have ${role} authorization`);
+ const hasRole = roles.some((role) => value.includes(role));
+ if (!hasRole) {
+ throw new Joi.ValidationError(
+ `You do not have the required authorization. Required roles: ${roles.join(", ")}`
+ );
}
return value;
};
@@ -66,7 +69,7 @@ const registerValidation = joi.object({
profileImage: joi.any(),
role: joi
.array()
- .items(joi.string().valid("admin", "user"))
+ .items(joi.string().valid("superadmin", "admin", "user"))
.min(1)
.required(),
});
@@ -123,7 +126,7 @@ const deleteUserParamValidation = joi.object({
});
const inviteRoleValidation = joi.object({
- roles: joi.custom(roleValidatior("admin")).required(),
+ roles: joi.custom(roleValidatior(["admin", "superadmin"])).required(),
});
const inviteBodyValidation = joi.object({