feat: forum rich-text editor, emoji picker, mentions, discover nav, feed, uploads, profile
Forum: - TipTap WYSIWYG editor with full toolbar - @emoji-mart/react emoji picker (consistent with tweets) - @mention autocomplete with user search API - Fix PHP 8.4 parse errors in Blade templates - Fix thread data display (paginator items) - Align forum page widths to max-w-5xl Discover: - Extract shared _nav.blade.php partial - Add missing nav links to for-you page - Add Following link for authenticated users Feed/Posts: - Post model, controllers, policies, migrations - Feed page components (PostComposer, FeedCard, etc) - Post reactions, comments, saves, reports, sharing - Scheduled publishing support - Link preview controller Profile: - Profile page components (ProfileHero, ProfileTabs) - Profile API controller Uploads: - Upload wizard enhancements - Scheduled publish picker - Studio status bar and readiness checklist
This commit is contained in:
16
app/Policies/PostCommentPolicy.php
Normal file
16
app/Policies/PostCommentPolicy.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace App\Policies;
|
||||
|
||||
use App\Models\PostComment;
|
||||
use App\Models\User;
|
||||
|
||||
class PostCommentPolicy
|
||||
{
|
||||
public function delete(User $user, PostComment $comment): bool
|
||||
{
|
||||
return $user->id === $comment->user_id
|
||||
|| $user->isAdmin()
|
||||
|| $user->isModerator();
|
||||
}
|
||||
}
|
||||
75
app/Policies/PostPolicy.php
Normal file
75
app/Policies/PostPolicy.php
Normal file
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace App\Policies;
|
||||
|
||||
use App\Models\Post;
|
||||
use App\Models\User;
|
||||
|
||||
class PostPolicy
|
||||
{
|
||||
/** Any authenticated user can create posts */
|
||||
public function create(User $user): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Only the post author can update */
|
||||
public function update(User $user, Post $post): bool
|
||||
{
|
||||
return $user->id === $post->user_id;
|
||||
}
|
||||
|
||||
/** Author or admin/moderator can delete */
|
||||
public function delete(User $user, Post $post): bool
|
||||
{
|
||||
return $user->id === $post->user_id
|
||||
|| $user->isAdmin()
|
||||
|| $user->isModerator();
|
||||
}
|
||||
|
||||
/** Anyone can view public posts; followers-only requires following */
|
||||
public function view(?User $user, Post $post): bool
|
||||
{
|
||||
if ($post->visibility === Post::VISIBILITY_PUBLIC) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (! $user) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($user->id === $post->user_id) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($post->visibility === Post::VISIBILITY_FOLLOWERS) {
|
||||
return $post->user->isFollowedBy($user->id);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Only the author can report their own posts */
|
||||
public function report(User $user, Post $post): bool
|
||||
{
|
||||
return $user->id !== $post->user_id;
|
||||
}
|
||||
|
||||
/** Only the post owner can pin/unpin their own post */
|
||||
public function pin(User $user, Post $post): bool
|
||||
{
|
||||
return $user->id === $post->user_id;
|
||||
}
|
||||
|
||||
/** Any authenticated user can save a post (own or others') */
|
||||
public function save(User $user, Post $post): bool
|
||||
{
|
||||
return $post->status === Post::STATUS_PUBLISHED;
|
||||
}
|
||||
|
||||
/** Only post owner may highlight a comment */
|
||||
public function highlightComment(User $user, Post $post): bool
|
||||
{
|
||||
return $user->id === $post->user_id;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user