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 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/app/Http/Controllers/PostsController.php b/app/Http/Controllers/PostsController.php index eaaa25c..c655b3f 100644 --- a/app/Http/Controllers/PostsController.php +++ b/app/Http/Controllers/PostsController.php @@ -9,13 +9,30 @@ 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.admin-index', compact('posts')); + } + public function create() { return view('/posts.create'); @@ -23,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', @@ -32,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/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/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/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/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/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/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/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/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/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 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/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/resources/views/layouts/aside-tags.blade.php b/resources/views/layouts/aside-tags.blade.php new file mode 100644 index 0000000..0fc5b9c --- /dev/null +++ b/resources/views/layouts/aside-tags.blade.php @@ -0,0 +1,9 @@ +
+ @if($tagsCloud->isNotEmpty()) +

Available Tags

+ + @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 @@