Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions app/Policies/BlogPolicy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace App\Policies;

use App\Models\Blog;
use App\Models\User;

class BlogPolicy
{
/**
* Determine whether the user can update the blog.
*/
public function update(User $user, Blog $blog): bool
{
return $user->id === $blog->user_id || $user->can('edit blogs');
}
}
21 changes: 21 additions & 0 deletions app/Policies/ResourcePolicy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace App\Policies;

use App\Models\Resource;
use App\Models\User;

class ResourcePolicy
{
/**
* Determine whether the user can update the resource.
*/
public function update(User $user, Resource $resource): bool
{
if ($resource->node?->isEffectivelyFrozen()) {
return false;
}

return $user->id === $resource->user_id || $user->can('edit resources');
}
}
22 changes: 17 additions & 5 deletions resources/js/components/BlogRow.vue
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
<script setup lang="ts">
import { Link, router } from '@inertiajs/vue3';
import { Pencil, Trash2, Eye, BookOpen } from 'lucide-vue-next';
import { computed } from 'vue';
import StatusBadge from '@/components/StatusBadge.vue';
import { usePermissions } from '@/lib/usePermissions';
import { useAuth } from '@/lib/useAuth';

const { can } = usePermissions();
const { userId, can } = useAuth();

const props = defineProps({
blog: {
Expand All @@ -13,6 +14,17 @@ const props = defineProps({
},
});

const canEdit = computed(() => {
return (
can('edit blogs') ||
(userId.value !== null && userId.value === props.blog.user_id)
);
});

const canDelete = computed(() => {
return can('delete blogs');
});

const deleteBlog = () => {
if (confirm('Are you sure you want to delete this blog?')) {
router.delete(`/admin/blogs/${props.blog.slug}`);
Expand Down Expand Up @@ -76,12 +88,12 @@ const deleteBlog = () => {

<!-- Right: Actions -->
<div
v-if="can('edit blogs') || can('delete blogs')"
v-if="canEdit || canDelete"
class="flex shrink-0 items-center gap-1"
@click.stop
>
<Link
v-if="can('edit blogs')"
v-if="canEdit"
:href="`/admin/blogs/edit/${blog.slug}`"
class="rounded-lg p-1.5 text-slate-400 transition-colors hover:bg-slate-100 hover:text-indigo-600 dark:text-gray-500 dark:hover:bg-gray-800 dark:hover:text-indigo-400"
title="Edit blog"
Expand All @@ -90,7 +102,7 @@ const deleteBlog = () => {
</Link>

<button
v-if="can('delete blogs')"
v-if="canDelete"
@click="deleteBlog"
type="button"
class="rounded-lg p-1.5 text-slate-400 transition-colors hover:bg-rose-50 hover:text-rose-600 dark:text-gray-500 dark:hover:bg-rose-500/10 dark:hover:text-rose-400"
Expand Down
25 changes: 18 additions & 7 deletions resources/js/components/admin/ResourceRow.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ import {
Pencil,
Trash2,
} from 'lucide-vue-next';
import { usePermissions } from '@/lib/usePermissions';
import { computed } from 'vue';
import { useAuth } from '@/lib/useAuth';

const { can } = usePermissions();
const { userId, can } = useAuth();

const props = defineProps({
resource: Object,
Expand All @@ -22,6 +23,18 @@ const emit = defineEmits<{
(e: 'edit', resource: any): void;
}>();

const canEdit = computed(() => {
return (
!props.isFrozen &&
(can('edit resources') ||
(userId.value !== null && userId.value === props.resource?.user_id))
);
});

const canDelete = computed(() => {
return !props.isFrozen && can('delete resources');
});

const handleDelete = () => {
if (confirm('Are you sure you want to delete this Resource?')) {
router.delete(`/admin/resources/${props.resource?.id}`);
Expand Down Expand Up @@ -76,14 +89,12 @@ const handleDelete = () => {

<!-- Right: Actions -->
<div
v-if="
!isFrozen && (can('edit resources') || can('delete resources'))
"
v-if="canEdit || canDelete"
class="flex shrink-0 items-center gap-1"
@click.stop
>
<button
v-if="can('edit resources')"
v-if="canEdit"
type="button"
@click="emit('edit', resource)"
class="cursor-pointer rounded-lg p-1.5 text-slate-400 transition-colors hover:bg-slate-100 hover:text-amber-700 dark:text-gray-500 dark:hover:bg-gray-800 dark:hover:text-amber-400"
Expand All @@ -93,7 +104,7 @@ const handleDelete = () => {
</button>

<button
v-if="can('delete resources')"
v-if="canDelete"
type="button"
@click="handleDelete"
class="rounded-lg p-1.5 text-slate-400 transition-colors hover:bg-rose-50 hover:text-rose-600 dark:text-gray-500 dark:hover:bg-rose-500/10 dark:hover:text-rose-400"
Expand Down
5 changes: 3 additions & 2 deletions routes/admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
Route::post('/blogs', [AdminBlogController::class, 'store'])->name('blogs.store');
});

Route::middleware('permission:edit blogs')->group(function () {
Route::middleware('can:update,blog')->group(function () {
Route::get('/blogs/edit/{blog}', [AdminBlogController::class, 'edit'])->name('blogs.edit');
Route::post('/blogs/edit/{blog}/patch', [AdminBlogController::class, 'update'])->name('blogs.update');
});
Expand Down Expand Up @@ -70,8 +70,9 @@
Route::post('/resources/bulk/videos', [AdminResourceController::class, 'storeBulkVideos']);
});

Route::post('/resources/{resource}/patch', [AdminResourceController::class, 'update'])->middleware('can:update,resource');

Route::middleware('permission:edit resources')->group(function () {
Route::post('/resources/{resource}/patch', [AdminResourceController::class, 'update']);
Route::post('/nodes/{node}/resources/bulk-rename', [AdminResourceController::class, 'bulkRename'])->name('resources.bulk-rename');
});

Expand Down
Loading