From 6ad6b8be611ecec44ea1832eb3372976e69f0443 Mon Sep 17 00:00:00 2001 From: pashaapsky Date: Tue, 8 Sep 2020 21:04:38 +0300 Subject: [PATCH 1/5] Edit AppServiceProvider for tagsCloud links --- app/Http/Controllers/PostsController.php | 1 - app/Http/Controllers/TagsController.php | 15 +++++++++++++++ app/Providers/AppServiceProvider.php | 5 ++++- app/Tag.php | 5 +++++ resources/views/index.blade.php | 15 +++------------ resources/views/layouts/aside-tags.blade.php | 5 +++++ resources/views/layouts/posts/tags.blade.php | 5 +++++ resources/views/tags/index.blade.php | 1 + routes/web.php | 8 +++----- 9 files changed, 41 insertions(+), 19 deletions(-) create mode 100644 app/Http/Controllers/TagsController.php create mode 100644 resources/views/layouts/aside-tags.blade.php create mode 100644 resources/views/layouts/posts/tags.blade.php create mode 100644 resources/views/tags/index.blade.php diff --git a/app/Http/Controllers/PostsController.php b/app/Http/Controllers/PostsController.php index eaaa25c..9e4b099 100644 --- a/app/Http/Controllers/PostsController.php +++ b/app/Http/Controllers/PostsController.php @@ -12,7 +12,6 @@ class PostsController extends Controller public function index() { $posts = Post::with('tags')->latest()->get(); - return view('/posts.index', compact('posts')); } diff --git a/app/Http/Controllers/TagsController.php b/app/Http/Controllers/TagsController.php new file mode 100644 index 0000000..76820d0 --- /dev/null +++ b/app/Http/Controllers/TagsController.php @@ -0,0 +1,15 @@ +posts()->with('tags')->get(); + return view('index', compact('posts')); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index ee8ca5b..3210700 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use App\Tag; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -13,7 +14,9 @@ class AppServiceProvider extends ServiceProvider */ public function register() { - // + view()->composer('layouts.aside-tags', function ($view) { + $view->with('tagsCloud', Tag::all()); + }); } /** diff --git a/app/Tag.php b/app/Tag.php index 2c0ea2a..aee6777 100644 --- a/app/Tag.php +++ b/app/Tag.php @@ -14,4 +14,9 @@ public function posts() { return $this->belongsToMany(Post::class); } + + public function getRouteKeyName() + { + return 'name'; + } } diff --git a/resources/views/index.blade.php b/resources/views/index.blade.php index b37f383..99fd965 100644 --- a/resources/views/index.blade.php +++ b/resources/views/index.blade.php @@ -8,7 +8,7 @@
-

Most recent posts

+

Latest posts

@if ($posts->count())
@@ -27,7 +27,7 @@ @if($post->tags->isNotEmpty()) @endif @@ -47,16 +47,7 @@ @endforeach
-
-

Available Tags

- -
- @foreach($tags as $tag) - {{ strtoupper($tag->name) }} - @endforeach -
-
- + @include('layouts.aside-tags') @else

Not available posts yet

@endif diff --git a/resources/views/layouts/aside-tags.blade.php b/resources/views/layouts/aside-tags.blade.php new file mode 100644 index 0000000..4654e0e --- /dev/null +++ b/resources/views/layouts/aside-tags.blade.php @@ -0,0 +1,5 @@ +
+

Available Tags

+ + @include('layouts.posts.tags', ['tags' => $tagsCloud]) +
diff --git a/resources/views/layouts/posts/tags.blade.php b/resources/views/layouts/posts/tags.blade.php new file mode 100644 index 0000000..d1c8683 --- /dev/null +++ b/resources/views/layouts/posts/tags.blade.php @@ -0,0 +1,5 @@ +
+ @foreach($tags as $tag) + {{ strtoupper($tag->name) }} + @endforeach +
diff --git a/resources/views/tags/index.blade.php b/resources/views/tags/index.blade.php new file mode 100644 index 0000000..b3d9bbc --- /dev/null +++ b/resources/views/tags/index.blade.php @@ -0,0 +1 @@ +get(); - $tags = Tag::all(); - return view('/index', compact('posts', 'tags')); + $posts = Post::with('tags')->latest()->get(); + return view('/index', compact('posts')); })->name('home'); - +Route::get('/tags/{tag}', 'TagsController@index'); Route::get('/admin/posts', 'PostsController@index')->name('post-index'); Route::get('/posts/create', 'PostsController@create')->name('post-create'); Route::get('/posts/{post}', 'PostsController@show')->name('post-show'); From 335af2d412cfe9886fdb974830638fa91d54cfbb Mon Sep 17 00:00:00 2001 From: apsky Date: Wed, 9 Sep 2020 12:30:30 +0300 Subject: [PATCH 2/5] configurate routes --- app/Http/Controllers/PostsController.php | 5 +++++ resources/views/layouts/admin/admin-header.blade.php | 2 +- routes/web.php | 12 ++++-------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/PostsController.php b/app/Http/Controllers/PostsController.php index 9e4b099..8584ae3 100644 --- a/app/Http/Controllers/PostsController.php +++ b/app/Http/Controllers/PostsController.php @@ -11,6 +11,11 @@ class PostsController extends Controller { public function index() { + $posts = Post::with('tags')->latest()->get(); + return view('/index', compact('posts')); + } + + public function adminIndex() { $posts = Post::with('tags')->latest()->get(); return view('/posts.index', compact('posts')); } diff --git a/resources/views/layouts/admin/admin-header.blade.php b/resources/views/layouts/admin/admin-header.blade.php index 584de0d..c9776df 100644 --- a/resources/views/layouts/admin/admin-header.blade.php +++ b/resources/views/layouts/admin/admin-header.blade.php @@ -25,7 +25,7 @@ diff --git a/routes/web.php b/routes/web.php index 8e857a1..cb0e7ec 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,23 +1,19 @@ latest()->get(); - return view('/index', compact('posts')); -})->name('home'); - Route::get('/tags/{tag}', 'TagsController@index'); -Route::get('/admin/posts', 'PostsController@index')->name('post-index'); + +Route::get('/', 'PostsController@index')->name('home'); Route::get('/posts/create', 'PostsController@create')->name('post-create'); Route::get('/posts/{post}', 'PostsController@show')->name('post-show'); -Route::post('/posts/', 'PostsController@store'); Route::get('/posts/{post}/edit', 'PostsController@edit'); +Route::post('/posts/', 'PostsController@store'); Route::patch('/posts/{post}', 'PostsController@update'); Route::delete('/posts/{post}', 'PostsController@destroy'); +Route::get('/admin/posts', 'PostsController@adminIndex')->name('admin-post-index'); Route::get('/about', function () { return view('static.about'); From b858922c8965e6889edbe10ffbdbf4649cd90125 Mon Sep 17 00:00:00 2001 From: apsky Date: Thu, 10 Sep 2020 09:12:11 +0300 Subject: [PATCH 3/5] edit .env + git --- .env.example | 46 ++++++++++++++++++++++++++++++++++++++++++++++ .gitignore | 1 + 2 files changed, 47 insertions(+) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ac74863 --- /dev/null +++ b/.env.example @@ -0,0 +1,46 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +LOG_CHANNEL=stack + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=laravel +DB_USERNAME=root +DB_PASSWORD= + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=smtp.mailtrap.io +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS=null +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_APP_CLUSTER=mt1 + +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/.gitignore b/.gitignore index f129f43..5740ff0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /public/storage /storage/*.key /vendor +.env .env.backup .phpunit.result.cache Homestead.json From 885212b62176a24582cb975dd166535928d9aaeb Mon Sep 17 00:00:00 2001 From: pashaapsky Date: Thu, 10 Sep 2020 20:14:40 +0300 Subject: [PATCH 4/5] edit auth routes + timezone europe --- app/Http/Controllers/Auth/RegisterController.php | 2 +- config/app.php | 2 +- resources/views/auth/login.blade.php | 10 +++++++++- resources/views/auth/register.blade.php | 10 +++++++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index c6a6de6..dbac62c 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -52,7 +52,7 @@ protected function validator(array $data) return Validator::make($data, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], - 'password' => ['required', 'string', 'min:8', 'confirmed'], + 'password' => ['required', 'string', 'min:1', 'confirmed'], ]); } diff --git a/config/app.php b/config/app.php index 8409e00..17b0fbe 100644 --- a/config/app.php +++ b/config/app.php @@ -67,7 +67,7 @@ | */ - 'timezone' => 'UTC', + 'timezone' => 'Europe/Moscow', /* |-------------------------------------------------------------------------- diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index c12b97e..80108b6 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -1,8 +1,12 @@ @extends('layouts.app') +@section('header') + @include('layouts.base.header') +@endsection + @section('content')
-
+
{{ __('Login') }}
@@ -71,3 +75,7 @@
@endsection + +@section('footer') + @include('layouts.base.footer') +@endsection diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index d236a48..9a4397f 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -1,8 +1,12 @@ @extends('layouts.app') +@section('header') + @include('layouts.base.header') +@endsection + @section('content')
-
+
{{ __('Register') }}
@@ -75,3 +79,7 @@
@endsection + +@section('footer') + @include('layouts.base.footer') +@endsection From a8fccdf699d6a4754f5ea93a4a2c46397f5dac34 Mon Sep 17 00:00:00 2001 From: pashaapsky Date: Thu, 10 Sep 2020 22:07:37 +0300 Subject: [PATCH 5/5] add authorization with policies --- app/Http/Controllers/PostsController.php | 22 ++++++- app/Policies/PostPolicy.php | 17 ++++++ app/Providers/AuthServiceProvider.php | 9 ++- app/User.php | 4 ++ database/dumps/apsky-laravel.sql | 7 ++- .../2020_08_26_090725_create_posts_table.php | 2 + resources/views/layouts/aside-tags.blade.php | 8 ++- resources/views/layouts/base/header.blade.php | 4 +- resources/views/posts/admin-index.blade.php | 61 +++++++++++++++++++ resources/views/posts/index.blade.php | 4 +- routes/web.php | 1 + 11 files changed, 125 insertions(+), 14 deletions(-) create mode 100644 app/Policies/PostPolicy.php create mode 100644 resources/views/posts/admin-index.blade.php diff --git a/app/Http/Controllers/PostsController.php b/app/Http/Controllers/PostsController.php index 8584ae3..c655b3f 100644 --- a/app/Http/Controllers/PostsController.php +++ b/app/Http/Controllers/PostsController.php @@ -9,15 +9,28 @@ class PostsController extends Controller { + public function __construct() + { + $this->middleware('auth'); + $this->middleware('can:update,post')->except(['index', 'userPosts', 'adminIndex', 'create']); + } + public function index() { $posts = Post::with('tags')->latest()->get(); return view('/index', compact('posts')); } + public function userPosts() + { +// $posts = Post::where('owner_id', auth()->id())->with('tags')->latest()->get(); + $posts = Auth()->user()->posts()->with('tags')->latest()->get(); + return view('/posts.index', compact('posts')); + } + public function adminIndex() { $posts = Post::with('tags')->latest()->get(); - return view('/posts.index', compact('posts')); + return view('/posts.admin-index', compact('posts')); } public function create() @@ -27,7 +40,7 @@ public function create() public function store(Request $request) { - $request->validate([ + $attr = $request->validate([ 'code' => 'required|unique:posts|regex:/[a-zA-Z0-9_-]+/', 'name' => 'required|min:5|max:100', 'description' => 'required|max:255', @@ -36,9 +49,12 @@ public function store(Request $request) if ($request->all(['published'])) { $request->merge(['published' => 1]); + $attr['published'] = 1; } - Post::create($request->all()); + $attr['owner_id'] = auth()->id(); + + Post::create($attr); return redirect('/'); } diff --git a/app/Policies/PostPolicy.php b/app/Policies/PostPolicy.php new file mode 100644 index 0000000..6275d0d --- /dev/null +++ b/app/Policies/PostPolicy.php @@ -0,0 +1,17 @@ +owner_id == $user->id; + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 3049068..a025a1a 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -14,6 +14,7 @@ class AuthServiceProvider extends ServiceProvider */ protected $policies = [ // 'App\Model' => 'App\Policies\ModelPolicy', + 'App\Post' => 'App\Policies\PostPolicy', ]; /** @@ -21,10 +22,14 @@ class AuthServiceProvider extends ServiceProvider * * @return void */ - public function boot() + public function boot(\Illuminate\Contracts\Auth\Access\Gate $gate) { $this->registerPolicies(); - // + $gate->before(function ($user) { + if ($user->id == 2) { + return true; + } + }); } } diff --git a/app/User.php b/app/User.php index e79dab7..b235ec4 100644 --- a/app/User.php +++ b/app/User.php @@ -36,4 +36,8 @@ class User extends Authenticatable protected $casts = [ 'email_verified_at' => 'datetime', ]; + + public function posts() { + return $this->hasMany(Post::class, 'owner_id'); + } } diff --git a/database/dumps/apsky-laravel.sql b/database/dumps/apsky-laravel.sql index 9fcc4a2..8fe0f92 100644 --- a/database/dumps/apsky-laravel.sql +++ b/database/dumps/apsky-laravel.sql @@ -198,7 +198,7 @@ CREATE TABLE `posts` ( LOCK TABLES `posts` WRITE; /*!40000 ALTER TABLE `posts` DISABLE KEYS */; -INSERT INTO `posts` VALUES (4,'4123','Post4','Post desc4','Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias beatae consequatur consequuntur, debitis dicta eos explicabo fugit labore molestiae, nam nemo odit placeat quae quisquam quos repellat repellendus tempore, voluptates?',1,'2020-08-26 17:05:56','2020-09-07 14:10:35'),(5,'12313','qweqe','qweqe','qweqeq',0,'2020-08-28 05:05:04','2020-08-28 05:05:04'),(6,'qweqe','qweqe','qweqe','qweqweqe',0,'2020-08-28 06:58:18','2020-08-28 06:58:18'),(7,'qweq','qweqe','qweqe','qweqe',0,'2020-08-28 07:01:17','2020-08-28 07:01:17'),(8,'1231qweq','qweqe','qweqeq','qweqeqe',0,'2020-08-28 07:20:33','2020-08-28 07:20:33'),(9,'qweqeqeqweqw','eeqweqeqe','qweqe','11',0,'2020-08-28 07:28:29','2020-08-28 07:28:29'); +INSERT INTO `posts` VALUES (4,'4123','Post4','Post desc4','Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias beatae consequatur consequuntur, debitis dicta eos explicabo fugit labore molestiae, nam nemo odit placeat quae quisquam quos repellat repellendus tempore, voluptates?',1,'2020-08-26 17:05:56','2020-09-07 14:10:35'),(5,'12313','qweqe','qweqe','Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias beatae consequatur consequuntur, debitis dicta eos explicabo fugit labore molestiae, nam nemo odit placeat quae quisquam quos repellat repellendus tempore, voluptates?',0,'2020-08-28 05:05:04','2020-09-10 17:23:00'),(6,'qweqe','qweqe','qweqe','Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias beatae consequatur consequuntur, debitis dicta eos explicabo fugit labore molestiae, nam nemo odit placeat quae quisquam quos repellat repellendus tempore, voluptates?',0,'2020-08-28 06:58:18','2020-09-10 17:23:00'),(7,'qweq','qweqe','qweqe','Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias beatae consequatur consequuntur, debitis dicta eos explicabo fugit labore molestiae, nam nemo odit placeat quae quisquam quos repellat repellendus tempore, voluptates?',0,'2020-08-28 07:01:17','2020-09-10 17:23:00'),(8,'1231qweq','qweqe','qweqeq','Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias beatae consequatur consequuntur, debitis dicta eos explicabo fugit labore molestiae, nam nemo odit placeat quae quisquam quos repellat repellendus tempore, voluptates?',0,'2020-08-28 07:20:33','2020-09-10 17:23:00'),(9,'qweqeqeqweqw','eeqweqeqe','qweqe','Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias beatae consequatur consequuntur, debitis dicta eos explicabo fugit labore molestiae, nam nemo odit placeat quae quisquam quos repellat repellendus tempore, voluptates?',0,'2020-08-28 07:28:29','2020-09-10 17:23:01'); /*!40000 ALTER TABLE `posts` ENABLE KEYS */; UNLOCK TABLES; @@ -247,7 +247,7 @@ CREATE TABLE `users` ( `updated_at` timestamp NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `users_email_unique` (`email`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -256,6 +256,7 @@ CREATE TABLE `users` ( LOCK TABLES `users` WRITE; /*!40000 ALTER TABLE `users` DISABLE KEYS */; +INSERT INTO `users` VALUES (2,'Павел','ap.sky@yandex.ru',NULL,'$2y$10$2yK9UmERiX.O4V7n7gdJiu/96XvQqbFHadj5ISipVZwLBYVOs6LMW',NULL,'2020-09-10 17:13:37','2020-09-10 17:13:37'); /*!40000 ALTER TABLE `users` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -268,4 +269,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-09-07 23:02:08 +-- Dump completed on 2020-09-10 21:13:40 diff --git a/database/migrations/2020_08_26_090725_create_posts_table.php b/database/migrations/2020_08_26_090725_create_posts_table.php index d3cf397..751d533 100644 --- a/database/migrations/2020_08_26_090725_create_posts_table.php +++ b/database/migrations/2020_08_26_090725_create_posts_table.php @@ -23,6 +23,8 @@ public function up() $table->boolean('published')->default(0); $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP')); + + $table->foreignId('owner_id')->constrained('users')->onDelete('cascade'); }); } diff --git a/resources/views/layouts/aside-tags.blade.php b/resources/views/layouts/aside-tags.blade.php index 4654e0e..0fc5b9c 100644 --- a/resources/views/layouts/aside-tags.blade.php +++ b/resources/views/layouts/aside-tags.blade.php @@ -1,5 +1,9 @@
-

Available Tags

+ @if($tagsCloud->isNotEmpty()) +

Available Tags

- @include('layouts.posts.tags', ['tags' => $tagsCloud]) + @include('layouts.posts.tags', ['tags' => $tagsCloud]) + @else +

Not available tags

+ @endif
diff --git a/resources/views/layouts/base/header.blade.php b/resources/views/layouts/base/header.blade.php index c82ac8a..96751bb 100644 --- a/resources/views/layouts/base/header.blade.php +++ b/resources/views/layouts/base/header.blade.php @@ -1,6 +1,6 @@