Skip to content

Commit 22c5682

Browse files
committed
статьи и комментарии для профиля
1 parent f6afd52 commit 22c5682

File tree

15 files changed

+503
-116
lines changed

15 files changed

+503
-116
lines changed

app/Http/Controllers/PostController.php

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44

55
use App\Models\Post;
66
use Illuminate\Http\Request;
7+
use Illuminate\Support\Facades\Auth;
78
use Illuminate\View\View;
89
use Illuminate\Support\Facades\Response;
10+
use Illuminate\Database\Eloquent\Builder;
911

1012
class PostController extends Controller
1113
{
14+
public $action = "append";
15+
1216
/**
1317
* @param \App\Models\Post $post
1418
*
@@ -19,13 +23,13 @@ public function show(Post $post)
1923
$post->with('comments');
2024

2125
return view('post.show', [
22-
'post' => $post,
26+
'post' => $post,
2327
]);
2428
}
2529

2630
public function edit(Post $post): View
2731
{
28-
//нужно будет проверять аавтора, если пост существует
32+
$this->authorize('isOwner', $post);
2933

3034
$title = $post->exists ? 'Редактирование' : 'Новая статья';
3135
return view('post.edit', [
@@ -36,7 +40,7 @@ public function edit(Post $post): View
3640

3741
public function update(Request $request, Post $post)
3842
{
39-
//нужно проверять аавтора, если пост существует
43+
$this->authorize('isOwner', $post);
4044

4145
$request->validate([
4246
'title' => 'required|string',
@@ -54,6 +58,19 @@ public function update(Request $request, Post $post)
5458
return redirect()->route('post.edit', $post);//пока сюда
5559
}
5660

61+
public function delete(Request $request, Post $post)
62+
{
63+
$this->authorize('isOwner', $post);
64+
65+
$post->delete();
66+
$this->action = "replace";
67+
68+
//сюда поставить уведомление
69+
70+
return $this->list($request);//пока сюда
71+
}
72+
73+
5774
/**
5875
* @param \Illuminate\Http\Request $request
5976
*
@@ -63,13 +80,17 @@ public function list(Request $request)
6380
{
6481
$posts = Post::with(['user'])
6582
->withCount('comments')
83+
->when($request->has('user_id'), fn(Builder $query) => $query->where('user_id', $request->get('user_id')))
6684
->orderBy('id', 'desc')
67-
->simplePaginate(5);
85+
->cursorPaginate(3);
6886

69-
$test = view('post.list', [
70-
'posts' => $posts,
87+
$test = view('particles.posts.list', [
88+
'posts' => $posts,
89+
'isMyProfile' => $request->has('user_id') && $request->user()?->id == $request->get('user_id'),
90+
'action' => $this->action
7191
])->fragmentsIf(!$request->isMethodSafe());
7292

73-
return $test;
93+
return $test;
7494
}
95+
7596
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use App\Models\Comment;
6+
use Illuminate\Http\Request;
7+
use App\Models\User;
8+
9+
class ProfileCommentsController extends Controller
10+
{
11+
/**
12+
* @param \App\Models\User $user
13+
* @param array $data
14+
*
15+
* @return string
16+
*/
17+
public function show(User $user, array $data = [])
18+
{
19+
return view(
20+
'pages.profile.tabs.comments-tab',
21+
array_merge($data, [
22+
'comments' => $user->comments()->latest()->get(),
23+
'user' => $user,
24+
'active' => 'comments'
25+
])
26+
)->fragmentIf(!request()->isMethod('GET'), 'comments');
27+
}
28+
29+
30+
/**
31+
* @param \App\Models\Comment $comment
32+
*
33+
* @return string
34+
*/
35+
public function showEdit(Comment $comment)
36+
{
37+
return $this->show($comment->commenter, [
38+
'edit' => $comment->getKey(),
39+
]);
40+
}
41+
42+
43+
/**
44+
* @param \Illuminate\Http\Request $request
45+
* @param \App\Models\Comment $comment
46+
*
47+
* @return string
48+
*/
49+
public function update(Request $request, Comment $comment)
50+
{
51+
$this->authorize('update', $comment);
52+
53+
$request->validate([
54+
'message' => 'required|string',
55+
]);
56+
57+
$comment->update([
58+
'comment' => $request->message,
59+
]);
60+
61+
return $this->show($comment->commenter);
62+
}
63+
64+
/**
65+
* @param \App\Models\Comment $comment
66+
*
67+
* @return string
68+
*/
69+
public function delete(Comment $comment)
70+
{
71+
$this->authorize('delete', $comment);
72+
73+
$comment->children()->exists()
74+
? $comment->delete()
75+
: $comment->forceDelete();
76+
77+
return $this->show($comment->commenter);
78+
}
79+
80+
}

app/Http/Controllers/ProfileController.php

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace App\Http\Controllers;
44

5+
use App\Models\Post;
56
use App\Models\User;
67
use Illuminate\Http\Request;
78

@@ -15,7 +16,7 @@ class ProfileController extends Controller
1516
*/
1617
public function show(User $user, Request $request)
1718
{
18-
$isMyAccount = $user->id === $request->user()->id;
19+
$isMyAccount = $user->id === $request->user()?->id;
1920

2021
$posts = $user->load('posts')
2122
->orderBy('id', 'desc')
@@ -25,33 +26,61 @@ public function show(User $user, Request $request)
2526
'user' => $user,
2627
'isMyAccount' => $isMyAccount,
2728
'posts' => $posts,
29+
'active' => 'posts'
2830
]);
2931
}
3032

31-
public function edit(Request $request){
32-
33+
public function edit(Request $request)
34+
{
3335
return view('pages.profile.edit', [
34-
'user' => $request->user(),
36+
'user' => $request->user(),
3537
]);
3638
}
3739

3840
public function update(Request $request)
3941
{
40-
$request->validate([
41-
'name' => 'required|string',
42-
'about'=> 'required|string'
43-
],
42+
$request->validate(
43+
[
44+
'name' => 'required|string',
45+
'about' => 'sometimes|string'
46+
],
4447
[],
4548
[
4649

47-
'name' => 'Имя',
50+
'name' => 'Имя',
4851
'about' => 'О себе'
49-
]);
52+
]
53+
);
5054

5155
$request->user()->fill([
5256
'name' => $request->input('name'),
5357
'about' => $request->input('about')
5458
])->save();
5559
return $this->edit($request)->fragment('profile');
5660
}
61+
62+
/**
63+
* @param \Illuminate\Http\Request $request
64+
*
65+
* @return string
66+
*/
67+
public function postTab(Request $request, User $user)
68+
{
69+
return view('pages.profile.tabs.posts-tab', [
70+
'user' => $user,
71+
'active' => 'posts'
72+
])->fragmentsIf(!$request->isMethodSafe());
73+
}
74+
75+
public function commentsTab(User $user, array $data = [])
76+
{
77+
return view(
78+
'pages.profile.tabs.comments-tab',
79+
array_merge($data, [
80+
'user' => $user,
81+
'active' => 'comments'
82+
])
83+
)
84+
->fragmentIf(!request()->isMethod('GET'), 'comments');
85+
}
5786
}

app/Policies/OwnerPolicy.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
namespace App\Policies;
4+
5+
use App\Models\User;
6+
use Illuminate\Auth\Access\HandlesAuthorization;
7+
use Illuminate\Auth\Access\Response;
8+
use Illuminate\Database\Eloquent\Model;
9+
10+
trait OwnerPolicy
11+
{
12+
use HandlesAuthorization;
13+
14+
/**
15+
* Determine whether the user can view the model.
16+
*
17+
* @param User $user
18+
* @param Model $model
19+
*
20+
* @return mixed
21+
*/
22+
public function owner(User $user, Model $model)
23+
{
24+
return ($user->id === $model->user_id) || is_null($model->user_id)
25+
? Response::allow()
26+
: Response::denyAsNotFound();
27+
}
28+
29+
/**
30+
* Determine whether the user can view the model.
31+
*
32+
* @param User $user
33+
* @param Model $model
34+
*
35+
* @return bool
36+
*/
37+
public function isOwner(User $user, Model $model): bool
38+
{
39+
return is_null($model->user_id) || ($user->id === $model->user_id);
40+
}
41+
}

app/Policies/PostPolicy.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace App\Policies;
4+
5+
class PostPolicy
6+
{
7+
use OwnerPolicy;
8+
9+
}

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"doctrine/dbal": "^3.7",
1111
"guzzlehttp/guzzle": "^7.2",
1212
"jolicode/jolitypo": "^1.4",
13-
"laravel/framework": "^10.10",
13+
"laravel/framework": "^10.31",
1414
"laravel/sanctum": "^3.2",
1515
"laravel/socialite": "^5.9",
1616
"laravel/tinker": "^2.8",

composer.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)