From 018e0813d22db17852ddbd1fa39f2972450f2062 Mon Sep 17 00:00:00 2001 From: devoalda Date: Mon, 7 Aug 2023 11:50:04 +0800 Subject: [PATCH] fix(Seed + Todo Creation): Fixed: - Database seeder - Todo creation/edit form + Completed Checkbox - Models - Validation for views --- .../Controllers/ProjectTodoController.php | 16 +++- app/Models/Project.php | 11 ++- app/Models/Todo.php | 14 +++- app/Models/User.php | 13 ++- database/seeders/DatabaseSeeder.php | 6 +- resources/views/todo/create.blade.php | 79 +++++++++++++++---- resources/views/todo/edit.blade.php | 10 +++ tests/Feature/ExampleTest.php | 9 ++- 8 files changed, 125 insertions(+), 33 deletions(-) diff --git a/app/Http/Controllers/ProjectTodoController.php b/app/Http/Controllers/ProjectTodoController.php index 202e808..af06a1e 100644 --- a/app/Http/Controllers/ProjectTodoController.php +++ b/app/Http/Controllers/ProjectTodoController.php @@ -28,6 +28,9 @@ class ProjectTodoController extends Controller $projects = $user->projects; $project = $projects->find($project_id); + if (!$project || $project->user->id !== auth()->user()->id) + return back()->with('error', 'Project not found'); + $todos = $project->todos; return view('todo.index', [ @@ -40,9 +43,12 @@ class ProjectTodoController extends Controller /** * Show the form for creating a new resource. */ - public function create(): Factory|View|Application + public function create($project_id): Factory|View|Application { - return view('todo.create'); + $project = auth()->user()->projects->find($project_id); + return view('todo.create', [ + 'project' => $project, + ]); } /** @@ -90,6 +96,9 @@ class ProjectTodoController extends Controller $projects = $user->projects; $project = $projects->find($project_id); + if (!$project || $project->user->id !== auth()->user()->id || $todo->user()[0]->id !== auth()->user()->id) + return back()->with('error', 'Project/Todo not found'); + return view('todo.show', compact('project', 'todo')); } @@ -102,6 +111,9 @@ class ProjectTodoController extends Controller $projects = $user->projects; $project = $projects->find($project_id); + if (!$project || $project->user->id !== auth()->user()->id || $todo->user()[0]->id !== auth()->user()->id) + return back()->with('error', 'Project/Todo not found'); + // Check if the given todo is in the given project (Reverse find with todo's project_id) if ($todo->project->id !== $project_id) return back()->with('error', 'Todo not found in the given project'); diff --git a/app/Models/Project.php b/app/Models/Project.php index a8fd42c..658d524 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -32,8 +32,15 @@ class Project extends Model return $this->belongsToMany(Todo::class, 'project_todo', 'project_id', 'todo_id'); } - public function user(): BelongsTo + public function user(): HasOneThrough { - return $this->belongsTo(User::class); + return $this->hasOneThrough( + User::class, + projectUser::class, + 'project_id', + 'id', + 'id', + 'user_id' + ); } } diff --git a/app/Models/Todo.php b/app/Models/Todo.php index f7edc7b..4b86744 100644 --- a/app/Models/Todo.php +++ b/app/Models/Todo.php @@ -9,6 +9,8 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Database\Eloquent\Relations\HasOneThrough; use Illuminate\Database\Eloquent\Relations\MorphTo; +use Illuminate\Support\Collection; +use Illuminate\Support\Facades\DB; class Todo extends Model { @@ -34,9 +36,17 @@ class Todo extends Model "updated_at" => "integer", ]; - public function user(): BelongsTo + public function user(): Collection { - return $this->belongsTo(User::class); + // Select User given Todo + return DB::table('users') + ->join('project_user', 'users.id', '=', 'project_user.user_id') + ->join('projects', 'project_user.project_id', '=', 'projects.id') + ->join('project_todo', 'projects.id', '=', 'project_todo.project_id') + ->join('todos', 'project_todo.todo_id', '=', 'todos.id') + ->where('todos.id', '=', $this->id) + ->select('users.*') + ->get(); } public function project(): HasOneThrough diff --git a/app/Models/User.php b/app/Models/User.php index b065d87..ef50aef 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -16,7 +16,6 @@ class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable, UuidTrait; - protected $dateFormat = 'U'; protected $table = 'users'; /** @@ -50,13 +49,13 @@ class User extends Authenticatable 'password' => 'hashed', ]; - public function projects(): BelongsToMany + public function projects(): HasManyThrough { - return $this->belongsToMany(Project::class, 'project_user', 'user_id', 'project_id'); + return $this->hasManyThrough(Project::class, projectUser::class, 'user_id', 'id', 'id', 'project_id'); } -// public function todos(): HasManyThrough -// { -// return $this->hasManyThrough(Todo::class, projectUser::class, 'user_id', 'id', 'id', 'project_id'); -// } + public function todos(): HasManyThrough + { + return $this->hasManyThrough(Todo::class, projectUser::class, 'user_id', 'id', 'id', 'project_id'); + } } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index a9f4519..3ba91b1 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -12,7 +12,11 @@ class DatabaseSeeder extends Seeder */ public function run(): void { - // \App\Models\User::factory(10)->create(); + \App\Models\User::factory(3) + ->has(\App\Models\Project::factory()->count(3) + ->has(\App\Models\Todo::factory()->count(10))) + ->create(); + // \App\Models\User::factory()->create([ // 'name' => 'Test User', diff --git a/resources/views/todo/create.blade.php b/resources/views/todo/create.blade.php index 0c19ce4..61b5ad6 100644 --- a/resources/views/todo/create.blade.php +++ b/resources/views/todo/create.blade.php @@ -1,24 +1,23 @@

- {{ __('Create Project') }} + {{ __('Create Todo') }}

- +
-
+ @csrf
- - - @error('name') + + + @error('title')
{{ $message }}
@@ -28,7 +27,7 @@
+ class="bg-gray-100 dark:bg-gray-700 border border-gray-300 dark:border-gray-700 focus:ring-2 focus:ring-blue-500 rounded-lg w-full p-4 @error('description') border-red-500 @enderror"> @error('description')
{{ $message }} @@ -36,16 +35,62 @@ @enderror
-
- +
+
+ + + + @error('due_start') +
+ {{ $message }} +
+ @enderror +
+
+ + + @error('due_end') +
+ {{ $message }} +
+ @enderror +
-
-
-
+ +
+ +
+ +
+ + + + Cancel + + + + +
diff --git a/resources/views/todo/edit.blade.php b/resources/views/todo/edit.blade.php index b031a70..02ec689 100644 --- a/resources/views/todo/edit.blade.php +++ b/resources/views/todo/edit.blade.php @@ -62,6 +62,16 @@
+ +
+ +
+