From ef49e56aa9a8cab2f2a8bdac290ba7ab1a54d541 Mon Sep 17 00:00:00 2001 From: jalatech Date: Tue, 5 Mar 2019 10:32:55 +0700 Subject: [PATCH] Add comment & post controller for user --- .../Controllers/User/CommentController.php | 300 ++++++++++++++++++ app/Http/Controllers/User/PostController.php | 300 ++++++++++++++++++ resources/lang/en/comments.php | 3 +- resources/lang/en/users.php | 2 +- resources/views/layouts/app.blade.php | 2 + .../views/users/comments/create.blade.php | 7 + resources/views/users/comments/edit.blade.php | 8 + .../views/users/comments/index.blade.php | 10 + resources/views/users/comments/show.blade.php | 8 + resources/views/users/posts/create.blade.php | 7 + resources/views/users/posts/edit.blade.php | 8 + resources/views/users/posts/index.blade.php | 10 + resources/views/users/posts/show.blade.php | 8 + routes/web.php | 2 + tests/Feature/User/CommentControllerTest.php | 194 +++++++++++ tests/Feature/User/PostControllerTest.php | 194 +++++++++++ 16 files changed, 1061 insertions(+), 2 deletions(-) create mode 100644 app/Http/Controllers/User/CommentController.php create mode 100644 app/Http/Controllers/User/PostController.php create mode 100644 resources/views/users/comments/create.blade.php create mode 100644 resources/views/users/comments/edit.blade.php create mode 100644 resources/views/users/comments/index.blade.php create mode 100644 resources/views/users/comments/show.blade.php create mode 100644 resources/views/users/posts/create.blade.php create mode 100644 resources/views/users/posts/edit.blade.php create mode 100644 resources/views/users/posts/index.blade.php create mode 100644 resources/views/users/posts/show.blade.php create mode 100644 tests/Feature/User/CommentControllerTest.php create mode 100644 tests/Feature/User/PostControllerTest.php diff --git a/app/Http/Controllers/User/CommentController.php b/app/Http/Controllers/User/CommentController.php new file mode 100644 index 0000000..a8226f4 --- /dev/null +++ b/app/Http/Controllers/User/CommentController.php @@ -0,0 +1,300 @@ + UserController::relations($request, $user)['user'], + 'comment' => [ + 'belongsToMany' => [], // also for morphToMany + 'hasMany' => [], // also for morphMany, hasManyThrough + 'hasOne' => [], // also for morphOne + ] + ]; + } + + /** + * Visibles + * @param \Illuminate\Http\Request|null $request + * @param User $user + * @param Comment $comment + * @return array + */ + public static function visibles(Request $request = null, User $user = null, Comment $comment = null) + { + return [ + 'parent' => [ + 'user' => UserController::visibles($request, $user)['show']['user'] + ], + 'index' => [ + 'comment' => [ + [ 'name' => 'comment', 'label' => ucwords(__('comments.comment')) ], + [ 'name' => 'created_at', 'label' => ucwords(__('comments.created_at')), 'class' => 'text-nowrap' ], + ] + ], + 'show' => [ + 'comment' => [ + [ 'name' => 'comment', 'label' => ucwords(__('comments.comment')) ], + [ 'name' => 'created_at', 'label' => ucwords(__('comments.created_at')), 'class' => 'text-nowrap' ], + ] + ] + ]; + } + + /** + * Fields + * @param \Illuminate\Http\Request|null $request + * @param User $user + * @param Comment $comment + * @return array + */ + public static function fields(Request $request = null, User $user = null, Comment $comment = null) + { + return [ + 'create' => [ + 'comment' => [ + [ 'field' => 'input', 'type' => 'text', 'name' => 'name', 'label' => ucwords(__('comments.name')), 'required' => true ], + ] + ], + 'edit' => [ + 'comment' => [ + [ 'field' => 'input', 'type' => 'text', 'name' => 'name', 'label' => ucwords(__('comments.name')) ], + ] + ] + ]; + } + + /** + * Rules + * @param \Illuminate\Http\Request|null $request + * @param User $user + * @param Comment $comment + * @return array + */ + public static function rules(Request $request = null, User $user = null, Comment $comment = null) + { + return [ + 'store' => [ + 'name' => 'required|string|max:255', + ], + 'update' => [ + 'name' => 'string|max:255', + ] + ]; + } + + /** + * Instantiate a new controller instance. + * + * @return void + */ + public function __construct() + { + $this->middleware('auth'); + } + + /** + * Display a listing of the resource. + * + * @param User $user + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function index(User $user) + { + $comments = Comment::filter() + ->where((new Comment)->qualifyColumn($user->getForeignKey()), $user->getKey()) + ->paginate()->appends(request()->query()); + $this->authorize('index', [ 'App\Comment', $user ]); + + return response()->view('users.comments.index', [ + 'user' => $user, + 'comments' => $comments, + 'relations' => self::relations(request(), $user), + 'visibles' => array_merge(self::visibles(request(), $user)['parent'], self::visibles(request(), $user)['index']), + ]); + } + + /** + * Show the form for creating a new resource. + * + * @param User $user + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create(User $user) + { + $this->authorize('create', [ 'App\Comment', $user ]); + + return response()->view('users.comments.create', [ + 'user' => $user, + 'relations' => self::relations(request(), $user), + 'visibles' => self::visibles(request(), $user)['parent'], + 'fields' => self::fields(request(), $user)['create'] + ]); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param User $user + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store(Request $request, User $user) + { + $this->authorize('create', [ 'App\Comment', $user ]); + $request->validate(self::rules($request, $user)['store']); + + $comment = new Comment; + foreach (self::rules($request, $user)['store'] as $key => $value) { + if (str_contains($value, [ 'file', 'image', 'mimetypes', 'mimes' ])) { + if ($request->hasFile($key)) { + $comment->{$key} = $request->file($key)->store('comments'); + } elseif ($request->exists($key)) { + $comment->{$key} = $request->{$key}; + } + } elseif ($request->exists($key)) { + $comment->{$key} = $request->{$key}; + } + } + $comment->user()->associate($user); + $comment->save(); + + if (request()->filled('redirect') && starts_with(request()->redirect, request()->root())) + $response = response()->redirectTo(request()->redirect); + else + $response = response()->redirectToRoute('users.comments.show', [ $user->getKey(), $comment->getKey() ]); + + return $response->withInput([ + $user->getForeignKey() => $user->getKey(), + $comment->getForeignKey() => $comment->getKey(), + ])->with('status', __('Success')); + } + + /** + * Display the specified resource. + * + * @param User $user + * @param Comment $comment + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function show(User $user, Comment $comment) + { + $user->comments()->findOrFail($comment->getKey()); + $this->authorize('view', [ $comment, $user ]); + + return response()->view('users.comments.show', [ + 'user' => $user, + 'comment' => $comment, + 'relations' => self::relations(request(), $user, $comment), + 'visibles' => array_merge(self::visibles(request(), $user, $comment)['parent'], self::visibles(request(), $user, $comment)['show']) + ]); + } + + /** + * Show the form for editing the specified resource. + * + * @param User $user + * @param Comment $comment + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function edit(User $user, Comment $comment) + { + $user->comments()->findOrFail($comment->getKey()); + $this->authorize('update', [ $comment, $user ]); + + return response()->view('users.comments.edit', [ + 'user' => $user, + 'comment' => $comment, + 'relations' => self::relations(request(), $user, $comment), + 'visibles' => self::visibles(request(), $user, $comment)['parent'], + 'fields' => self::fields(request(), $user, $comment)['edit'] + ]); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param User $user + * @param Comment $comment + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function update(Request $request, User $user, Comment $comment) + { + $user->comments()->findOrFail($comment->getKey()); + + $this->authorize('update', [ $comment, $user ]); + $request->validate(self::rules($request, $user, $comment)['update']); + + foreach (self::rules($request, $user, $comment)['update'] as $key => $value) { + if (str_contains($value, [ 'file', 'image', 'mimetypes', 'mimes' ])) { + if ($request->hasFile($key)) { + $comment->{$key} = $request->file($key)->store('comments'); + } elseif ($request->exists($key)) { + $comment->{$key} = $request->{$key}; + } + } elseif ($request->exists($key)) { + $comment->{$key} = $request->{$key}; + } + } + $comment->user()->associate($user); + $comment->save(); + + if (request()->filled('redirect') && starts_with(request()->redirect, request()->root())) + $response = response()->redirectTo(request()->redirect); + else + $response = response()->redirectToRoute('users.comments.show', [ $user->getKey(), $comment->getKey() ]); + + return $response->withInput([ + $user->getForeignKey() => $user->getKey(), + $comment->getForeignKey() => $comment->getKey(), + ])->with('status', __('Success')); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\User $user + * @param \App\Comment $comment + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function destroy(User $user, Comment $comment) + { + $user->comments()->findOrFail($comment->getKey()); + $this->authorize('delete', [ $comment, $user ]); + $comment->delete(); + + if (request()->filled('redirect') && starts_with(request()->redirect, request()->root()) && !str_contains(request()->redirect, '/'.array_last(explode('.', 'users.comments')).'/'.$comment->getKey())) + $response = response()->redirectTo(request()->redirect); + else + $response = response()->redirectToRoute('users.comments.index', $user->getKey()); + + return $response->with('status', __('Success')); + } +} diff --git a/app/Http/Controllers/User/PostController.php b/app/Http/Controllers/User/PostController.php new file mode 100644 index 0000000..c0ead50 --- /dev/null +++ b/app/Http/Controllers/User/PostController.php @@ -0,0 +1,300 @@ + UserController::relations($request, $user)['user'], + 'post' => [ + 'belongsToMany' => [], // also for morphToMany + 'hasMany' => [], // also for morphMany, hasManyThrough + 'hasOne' => [], // also for morphOne + ] + ]; + } + + /** + * Visibles + * @param \Illuminate\Http\Request|null $request + * @param User $user + * @param Post $post + * @return array + */ + public static function visibles(Request $request = null, User $user = null, Post $post = null) + { + return [ + 'parent' => [ + 'user' => UserController::visibles($request, $user)['show']['user'] + ], + 'index' => [ + 'post' => [ + [ 'name' => 'post', 'label' => ucwords(__('posts.post')) ], + [ 'name' => 'created_at', 'label' => ucwords(__('posts.created_at')), 'class' => 'text-nowrap' ], + ] + ], + 'show' => [ + 'post' => [ + [ 'name' => 'post', 'label' => ucwords(__('posts.post')) ], + [ 'name' => 'created_at', 'label' => ucwords(__('posts.created_at')), 'class' => 'text-nowrap' ], + ] + ] + ]; + } + + /** + * Fields + * @param \Illuminate\Http\Request|null $request + * @param User $user + * @param Post $post + * @return array + */ + public static function fields(Request $request = null, User $user = null, Post $post = null) + { + return [ + 'create' => [ + 'post' => [ + [ 'field' => 'input', 'type' => 'text', 'name' => 'name', 'label' => ucwords(__('posts.name')), 'required' => true ], + ] + ], + 'edit' => [ + 'post' => [ + [ 'field' => 'input', 'type' => 'text', 'name' => 'name', 'label' => ucwords(__('posts.name')) ], + ] + ] + ]; + } + + /** + * Rules + * @param \Illuminate\Http\Request|null $request + * @param User $user + * @param Post $post + * @return array + */ + public static function rules(Request $request = null, User $user = null, Post $post = null) + { + return [ + 'store' => [ + 'name' => 'required|string|max:255', + ], + 'update' => [ + 'name' => 'string|max:255', + ] + ]; + } + + /** + * Instantiate a new controller instance. + * + * @return void + */ + public function __construct() + { + $this->middleware('auth'); + } + + /** + * Display a listing of the resource. + * + * @param User $user + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function index(User $user) + { + $posts = Post::filter() + ->where((new Post)->qualifyColumn($user->getForeignKey()), $user->getKey()) + ->paginate()->appends(request()->query()); + $this->authorize('index', [ 'App\Post', $user ]); + + return response()->view('users.posts.index', [ + 'user' => $user, + 'posts' => $posts, + 'relations' => self::relations(request(), $user), + 'visibles' => array_merge(self::visibles(request(), $user)['parent'], self::visibles(request(), $user)['index']), + ]); + } + + /** + * Show the form for creating a new resource. + * + * @param User $user + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create(User $user) + { + $this->authorize('create', [ 'App\Post', $user ]); + + return response()->view('users.posts.create', [ + 'user' => $user, + 'relations' => self::relations(request(), $user), + 'visibles' => self::visibles(request(), $user)['parent'], + 'fields' => self::fields(request(), $user)['create'] + ]); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param User $user + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store(Request $request, User $user) + { + $this->authorize('create', [ 'App\Post', $user ]); + $request->validate(self::rules($request, $user)['store']); + + $post = new Post; + foreach (self::rules($request, $user)['store'] as $key => $value) { + if (str_contains($value, [ 'file', 'image', 'mimetypes', 'mimes' ])) { + if ($request->hasFile($key)) { + $post->{$key} = $request->file($key)->store('posts'); + } elseif ($request->exists($key)) { + $post->{$key} = $request->{$key}; + } + } elseif ($request->exists($key)) { + $post->{$key} = $request->{$key}; + } + } + $post->user()->associate($user); + $post->save(); + + if (request()->filled('redirect') && starts_with(request()->redirect, request()->root())) + $response = response()->redirectTo(request()->redirect); + else + $response = response()->redirectToRoute('users.posts.show', [ $user->getKey(), $post->getKey() ]); + + return $response->withInput([ + $user->getForeignKey() => $user->getKey(), + $post->getForeignKey() => $post->getKey(), + ])->with('status', __('Success')); + } + + /** + * Display the specified resource. + * + * @param User $user + * @param Post $post + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function show(User $user, Post $post) + { + $user->posts()->findOrFail($post->getKey()); + $this->authorize('view', [ $post, $user ]); + + return response()->view('users.posts.show', [ + 'user' => $user, + 'post' => $post, + 'relations' => self::relations(request(), $user, $post), + 'visibles' => array_merge(self::visibles(request(), $user, $post)['parent'], self::visibles(request(), $user, $post)['show']) + ]); + } + + /** + * Show the form for editing the specified resource. + * + * @param User $user + * @param Post $post + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function edit(User $user, Post $post) + { + $user->posts()->findOrFail($post->getKey()); + $this->authorize('update', [ $post, $user ]); + + return response()->view('users.posts.edit', [ + 'user' => $user, + 'post' => $post, + 'relations' => self::relations(request(), $user, $post), + 'visibles' => self::visibles(request(), $user, $post)['parent'], + 'fields' => self::fields(request(), $user, $post)['edit'] + ]); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param User $user + * @param Post $post + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function update(Request $request, User $user, Post $post) + { + $user->posts()->findOrFail($post->getKey()); + + $this->authorize('update', [ $post, $user ]); + $request->validate(self::rules($request, $user, $post)['update']); + + foreach (self::rules($request, $user, $post)['update'] as $key => $value) { + if (str_contains($value, [ 'file', 'image', 'mimetypes', 'mimes' ])) { + if ($request->hasFile($key)) { + $post->{$key} = $request->file($key)->store('posts'); + } elseif ($request->exists($key)) { + $post->{$key} = $request->{$key}; + } + } elseif ($request->exists($key)) { + $post->{$key} = $request->{$key}; + } + } + $post->user()->associate($user); + $post->save(); + + if (request()->filled('redirect') && starts_with(request()->redirect, request()->root())) + $response = response()->redirectTo(request()->redirect); + else + $response = response()->redirectToRoute('users.posts.show', [ $user->getKey(), $post->getKey() ]); + + return $response->withInput([ + $user->getForeignKey() => $user->getKey(), + $post->getForeignKey() => $post->getKey(), + ])->with('status', __('Success')); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\User $user + * @param \App\Post $post + * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function destroy(User $user, Post $post) + { + $user->posts()->findOrFail($post->getKey()); + $this->authorize('delete', [ $post, $user ]); + $post->delete(); + + if (request()->filled('redirect') && starts_with(request()->redirect, request()->root()) && !str_contains(request()->redirect, '/'.array_last(explode('.', 'users.posts')).'/'.$post->getKey())) + $response = response()->redirectTo(request()->redirect); + else + $response = response()->redirectToRoute('users.posts.index', $user->getKey()); + + return $response->with('status', __('Success')); + } +} diff --git a/resources/lang/en/comments.php b/resources/lang/en/comments.php index be9c6d0..d64636d 100644 --- a/resources/lang/en/comments.php +++ b/resources/lang/en/comments.php @@ -6,7 +6,8 @@ 'singular' => 'comment', 'comment' => 'comment', - 'user' => 'user' + 'user' => 'user', + 'created_at' => 'created at' //'parent' => 'parent', //'childs' => 'childs', diff --git a/resources/lang/en/users.php b/resources/lang/en/users.php index a5c1b09..5a69098 100644 --- a/resources/lang/en/users.php +++ b/resources/lang/en/users.php @@ -7,7 +7,7 @@ 'name' => 'name', 'email' => 'email', - 'created_at' => 'created_at', + 'created_at' => 'created at', //'parent' => 'parent', 'posts' => 'posts', diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index fee0ad8..916905c 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -40,6 +40,7 @@