RBAC, Permissions, and Export/Import

This commit is contained in:
Koncept Kit
2025-12-16 20:04:00 +07:00
parent 02e38e1050
commit 9ed778db1c
30 changed files with 4579 additions and 487 deletions

View File

@@ -9,6 +9,7 @@ export const AuthProvider = ({ children }) => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [token, setToken] = useState(localStorage.getItem('token'));
const [permissions, setPermissions] = useState([]);
useEffect(() => {
const initAuth = async () => {
@@ -20,9 +21,13 @@ export const AuthProvider = ({ children }) => {
});
setUser(response.data);
setToken(storedToken);
// Fetch user permissions
await fetchPermissions(storedToken);
} catch (error) {
localStorage.removeItem('token');
setToken(null);
setPermissions([]);
}
}
setLoading(false);
@@ -30,12 +35,34 @@ export const AuthProvider = ({ children }) => {
initAuth();
}, []);
const fetchPermissions = async (authToken) => {
try {
const tokenToUse = authToken || token || localStorage.getItem('token');
if (!tokenToUse) {
setPermissions([]);
return;
}
const response = await axios.get(`${API_URL}/api/auth/permissions`, {
headers: { Authorization: `Bearer ${tokenToUse}` }
});
setPermissions(response.data.permissions || []);
} catch (error) {
console.error('Failed to fetch permissions:', error);
setPermissions([]);
}
};
const login = async (email, password) => {
const response = await axios.post(`${API_URL}/api/auth/login`, { email, password });
const { access_token, user: userData } = response.data;
localStorage.setItem('token', access_token);
setToken(access_token);
setUser(userData);
// Fetch user permissions
await fetchPermissions(access_token);
return userData;
};
@@ -43,6 +70,7 @@ export const AuthProvider = ({ children }) => {
localStorage.removeItem('token');
setToken(null);
setUser(null);
setPermissions([]);
};
const register = async (userData) => {
@@ -124,10 +152,18 @@ export const AuthProvider = ({ children }) => {
return response.data;
};
const hasPermission = (permissionCode) => {
if (!user) return false;
// Superadmin always has all permissions
if (user.role === 'superadmin') return true;
return permissions.includes(permissionCode);
};
return (
<AuthContext.Provider value={{
user,
token,
permissions,
login,
logout,
register,
@@ -136,6 +172,7 @@ export const AuthProvider = ({ children }) => {
resetPassword,
changePassword,
resendVerificationEmail,
hasPermission,
loading
}}>
{children}