diff --git a/app/Http/Controllers/PostController.php b/app/Http/Controllers/PostController.php index b41c4f49..72baa631 100644 --- a/app/Http/Controllers/PostController.php +++ b/app/Http/Controllers/PostController.php @@ -4,11 +4,15 @@ use App\Models\Post; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; use Illuminate\View\View; use Illuminate\Support\Facades\Response; +use Illuminate\Database\Eloquent\Builder; class PostController extends Controller { + public $action = "append"; + /** * @param \App\Models\Post $post * @@ -19,13 +23,13 @@ public function show(Post $post) $post->with('comments'); return view('post.show', [ - 'post' => $post, + 'post' => $post, ]); } public function edit(Post $post): View { - //нужно будет проверять аавтора, если пост существует + $this->authorize('isOwner', $post); $title = $post->exists ? 'Редактирование' : 'Новая статья'; return view('post.edit', [ @@ -36,7 +40,7 @@ public function edit(Post $post): View public function update(Request $request, Post $post) { - //нужно проверять аавтора, если пост существует + $this->authorize('isOwner', $post); $request->validate([ 'title' => 'required|string', @@ -54,6 +58,19 @@ public function update(Request $request, Post $post) return redirect()->route('post.edit', $post);//пока сюда } + public function delete(Request $request, Post $post) + { + $this->authorize('isOwner', $post); + + $post->delete(); + $this->action = "replace"; + + //сюда поставить уведомление + + return $this->list($request);//пока сюда + } + + /** * @param \Illuminate\Http\Request $request * @@ -63,13 +80,15 @@ public function list(Request $request) { $posts = Post::with(['user']) ->withCount('comments') + ->when($request->has('user_id'), fn(Builder $query) => $query->where('user_id', $request->get('user_id'))) ->orderBy('id', 'desc') - ->simplePaginate(5); + ->cursorPaginate(3); - $test = view('post.list', [ - 'posts' => $posts, + return view('particles.posts.list', [ + 'posts' => $posts, + 'isMyProfile' => $request->has('user_id') && $request->user()?->id == $request->get('user_id'), + 'action' => $this->action ])->fragmentsIf(!$request->isMethodSafe()); - - return $test; } + } diff --git a/app/Http/Controllers/ProfileCommentsController.php b/app/Http/Controllers/ProfileCommentsController.php new file mode 100644 index 00000000..d05a8099 --- /dev/null +++ b/app/Http/Controllers/ProfileCommentsController.php @@ -0,0 +1,80 @@ + $user->comments()->latest()->get(), + 'user' => $user, + 'active' => 'comments' + ]) + )->fragmentIf(!request()->isMethod('GET'), 'comments'); + } + + + /** + * @param \App\Models\Comment $comment + * + * @return string + */ + public function showEdit(Comment $comment) + { + return $this->show($comment->commenter, [ + 'edit' => $comment->getKey(), + ]); + } + + + /** + * @param \Illuminate\Http\Request $request + * @param \App\Models\Comment $comment + * + * @return string + */ + public function update(Request $request, Comment $comment) + { + $this->authorize('update', $comment); + + $request->validate([ + 'message' => 'required|string', + ]); + + $comment->update([ + 'comment' => $request->message, + ]); + + return $this->show($comment->commenter); + } + + /** + * @param \App\Models\Comment $comment + * + * @return string + */ + public function delete(Comment $comment) + { + $this->authorize('delete', $comment); + + $comment->children()->exists() + ? $comment->delete() + : $comment->forceDelete(); + + return $this->show($comment->commenter); + } + +} diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 788bd7c8..dcf75325 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Models\Post; use App\Models\User; use Illuminate\Http\Request; @@ -15,7 +16,7 @@ class ProfileController extends Controller */ public function show(User $user, Request $request) { - $isMyAccount = $user->id === $request->user()->id; + $isMyAccount = $user->id === $request->user()?->id; $posts = $user->load('posts') ->orderBy('id', 'desc') @@ -25,28 +26,31 @@ public function show(User $user, Request $request) 'user' => $user, 'isMyAccount' => $isMyAccount, 'posts' => $posts, + 'active' => 'posts' ]); } - public function edit(Request $request){ - + public function edit(Request $request) + { return view('pages.profile.edit', [ - 'user' => $request->user(), + 'user' => $request->user(), ]); } public function update(Request $request) { - $request->validate([ - 'name' => 'required|string', - 'about'=> 'required|string' - ], + $request->validate( + [ + 'name' => 'required|string', + 'about' => 'sometimes|string' + ], [], [ - 'name' => 'Имя', + 'name' => 'Имя', 'about' => 'О себе' - ]); + ] + ); $request->user()->fill([ 'name' => $request->input('name'), @@ -54,4 +58,29 @@ public function update(Request $request) ])->save(); return $this->edit($request)->fragment('profile'); } + + /** + * @param \Illuminate\Http\Request $request + * + * @return string + */ + public function postTab(Request $request, User $user) + { + return view('pages.profile.tabs.posts-tab', [ + 'user' => $user, + 'active' => 'posts' + ])->fragmentsIf(!$request->isMethodSafe()); + } + + public function commentsTab(User $user, array $data = []) + { + return view( + 'pages.profile.tabs.comments-tab', + array_merge($data, [ + 'user' => $user, + 'active' => 'comments' + ]) + ) + ->fragmentIf(!request()->isMethod('GET'), 'comments'); + } } diff --git a/app/Policies/HasOwner.php b/app/Policies/HasOwner.php new file mode 100644 index 00000000..f98e782c --- /dev/null +++ b/app/Policies/HasOwner.php @@ -0,0 +1,41 @@ +id === $model->user_id) || is_null($model->user_id) + ? Response::allow() + : Response::denyAsNotFound(); + } + + /** + * Determine whether the user can view the model. + * + * @param User $user + * @param Model $model + * + * @return bool + */ + public function isOwner(User $user, Model $model): bool + { + return is_null($model->user_id) || ($user->id === $model->user_id); + } +} diff --git a/app/Policies/PostPolicy.php b/app/Policies/PostPolicy.php new file mode 100644 index 00000000..6c3bd789 --- /dev/null +++ b/app/Policies/PostPolicy.php @@ -0,0 +1,8 @@ +
+
-
+
+

{{ $user->name }} @@ -26,46 +28,38 @@ На проекте с 23 мая 2022

-
+ +
+ @if ($isMyAccount) - - - Редактировать + + @else + + - - - - Выйти из профиля - @endif
-

Тут будут награды пользователя:

+
+ {!! \Illuminate\Support\Str::of($user->about)->markdown() !!} +
+
- @if ($isMyAccount) -
-
-
- Напишите первую статью, чтобы привлечь читателей -
- -
-
- @else -
-
-
- Здесь еще нет публикаций -
-
-
- @endif
+ + + @endsection diff --git a/resources/views/pages/profile/tabs/base.blade.php b/resources/views/pages/profile/tabs/base.blade.php new file mode 100644 index 00000000..4ddc3b2d --- /dev/null +++ b/resources/views/pages/profile/tabs/base.blade.php @@ -0,0 +1,28 @@ + + + + +
+ @yield('tab') +
+
diff --git a/resources/views/pages/profile/tabs/comments-tab.blade.php b/resources/views/pages/profile/tabs/comments-tab.blade.php new file mode 100644 index 00000000..81efca6a --- /dev/null +++ b/resources/views/pages/profile/tabs/comments-tab.blade.php @@ -0,0 +1,42 @@ +@extends('pages.profile.tabs.base') + +@section('tab') + @if($comments->isEmpty()) + @if ($isMyAccount) +
+
+
+ Вы не написали ни одного комментария +
+ +
+
+ @else +
+
+
+ Этот пользователь не оставил ни одного комментария +
+
+
+ @endif + @else + + + +
+
+ @foreach($comments as $comment) + @include('pages.profile.tabs.particles.comments.comment', [ + 'comment' => $comment, + 'edit' => $edit ?? null, + ]) + @endforeach +
+
+
+
+ @endif +@endsection diff --git a/resources/views/pages/profile/tabs/particles/comments/comment.blade.php b/resources/views/pages/profile/tabs/particles/comments/comment.blade.php new file mode 100644 index 00000000..26aa47a2 --- /dev/null +++ b/resources/views/pages/profile/tabs/particles/comments/comment.blade.php @@ -0,0 +1,69 @@ +
+ +
+
+ + {{ $comment->commenter->name }} + +
+ +
+ + + + @if($edit === $comment->getKey()) +
+ @method('PUT') + +
+ +
+
+ @else +

{!! $comment->prettyComment() !!}

+ @endif + + +
+
+ +
diff --git a/resources/views/pages/profile/tabs/posts-tab.blade.php b/resources/views/pages/profile/tabs/posts-tab.blade.php new file mode 100644 index 00000000..ba428458 --- /dev/null +++ b/resources/views/pages/profile/tabs/posts-tab.blade.php @@ -0,0 +1,6 @@ + +@extends('pages.profile.tabs.base') + +@section('tab') + +@endsection diff --git a/resources/views/particles/posts/list.blade.php b/resources/views/particles/posts/list.blade.php new file mode 100644 index 00000000..ce9458b9 --- /dev/null +++ b/resources/views/particles/posts/list.blade.php @@ -0,0 +1,101 @@ + + + @if($posts->isEmpty()) +
+
+ @if ($isMyProfile) +
+ Напишите первую статью, чтобы привлечь читателей +
+ + + @else + +
+ Здесь еще нет публикаций +
+ @endif +
+
+ @else + @foreach ($posts as $post) +
+ +
+
+
+ + {{ $post->user->title }} + +
+ +
+
+ {{ $post->user->name }} +
+

Разработчик laravel.su

+
+
+ +
+ +
+ + +

{{ $post->title }}

+ +

{!! \Illuminate\Support\Str::of($post->content)->markdown() !!}

+
+ +
+ + + + ~56 + + + + + {{ $post->comments_count }} + + + {{ $post->created_at->diffForHumans() }} +
+
+ @endforeach + @endif +
+ + + @if ($posts->hasMorePages()) +
+ +
+ @endif +
+
diff --git a/resources/views/post/list.blade.php b/resources/views/post/list.blade.php index 675223ae..50e6881a 100644 --- a/resources/views/post/list.blade.php +++ b/resources/views/post/list.blade.php @@ -4,7 +4,7 @@
+ style="background-image: url('/img/fire.svg'); background-repeat: no-repeat; background-position: right bottom">