mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 12:31:26 -05:00
Refactor admin blog access
This commit is contained in:
@@ -19,6 +19,7 @@ export function AdminSidebar() {
|
|||||||
const { state } = useSidebar();
|
const { state } = useSidebar();
|
||||||
const { permissions } = useUserRole();
|
const { permissions } = useUserRole();
|
||||||
const isSuperuser = permissions?.role_level === 'superuser';
|
const isSuperuser = permissions?.role_level === 'superuser';
|
||||||
|
const isAdmin = permissions?.role_level === 'admin' || isSuperuser;
|
||||||
const collapsed = state === 'collapsed';
|
const collapsed = state === 'collapsed';
|
||||||
|
|
||||||
const navItems = [
|
const navItems = [
|
||||||
@@ -47,11 +48,11 @@ export function AdminSidebar() {
|
|||||||
url: '/admin/users',
|
url: '/admin/users',
|
||||||
icon: Users,
|
icon: Users,
|
||||||
},
|
},
|
||||||
{
|
...(isAdmin ? [{
|
||||||
title: 'Blog',
|
title: 'Blog',
|
||||||
url: '/admin/blog',
|
url: '/admin/blog',
|
||||||
icon: BookOpen,
|
icon: BookOpen,
|
||||||
},
|
}] : []),
|
||||||
...(isSuperuser ? [{
|
...(isSuperuser ? [{
|
||||||
title: 'Settings',
|
title: 'Settings',
|
||||||
url: '/admin/settings',
|
url: '/admin/settings',
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ interface BlogPost {
|
|||||||
|
|
||||||
export default function AdminBlog() {
|
export default function AdminBlog() {
|
||||||
const { user } = useAuth();
|
const { user } = useAuth();
|
||||||
const { isModerator } = useUserRole();
|
const { isAdmin, loading } = useUserRole();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
@@ -48,11 +48,6 @@ export default function AdminBlog() {
|
|||||||
const [featuredImageId, setFeaturedImageId] = useState('');
|
const [featuredImageId, setFeaturedImageId] = useState('');
|
||||||
const [featuredImageUrl, setFeaturedImageUrl] = useState('');
|
const [featuredImageUrl, setFeaturedImageUrl] = useState('');
|
||||||
|
|
||||||
if (!isModerator()) {
|
|
||||||
navigate('/');
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const { data: posts, isLoading } = useQuery({
|
const { data: posts, isLoading } = useQuery({
|
||||||
queryKey: ['admin-blog-posts'],
|
queryKey: ['admin-blog-posts'],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
@@ -65,6 +60,26 @@ export default function AdminBlog() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Show loading state while checking permissions
|
||||||
|
if (loading) {
|
||||||
|
return (
|
||||||
|
<AdminLayout>
|
||||||
|
<div className="flex items-center justify-center min-h-[60vh]">
|
||||||
|
<div className="text-center">
|
||||||
|
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto mb-4"></div>
|
||||||
|
<p className="text-muted-foreground">Loading...</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</AdminLayout>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Redirect if not admin or superuser
|
||||||
|
if (!isAdmin()) {
|
||||||
|
navigate('/');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
const saveMutation = useMutation({
|
const saveMutation = useMutation({
|
||||||
mutationFn: async ({ isDraft }: { isDraft: boolean }) => {
|
mutationFn: async ({ isDraft }: { isDraft: boolean }) => {
|
||||||
const postData = {
|
const postData = {
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
-- Drop existing policy that allows moderators
|
||||||
|
DROP POLICY IF EXISTS "Admins can do everything" ON public.blog_posts;
|
||||||
|
|
||||||
|
-- Create new policy for admins and superusers only
|
||||||
|
CREATE POLICY "Admins and superusers can manage blog posts"
|
||||||
|
ON public.blog_posts FOR ALL
|
||||||
|
USING (
|
||||||
|
has_role(auth.uid(), 'admin'::app_role) OR
|
||||||
|
has_role(auth.uid(), 'superuser'::app_role)
|
||||||
|
);
|
||||||
Reference in New Issue
Block a user