From 4be92ee612facfe262ab69c9b9f8dbbb2ebce83d Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Thu, 1 Feb 2018 13:54:58 +0800 Subject: [PATCH] Simplify job on progress list query into AdminDashboardQuery class Eagerload tasks on job list tab on project detail page Remove user job list pagination because it only shows current jobs Add nameLink method on job model --- app/Entities/Projects/Job.php | 10 +++++++++ app/Entities/Projects/JobsRepository.php | 14 +++--------- app/Http/Controllers/Projects/JobsController.php | 2 +- app/Http/Controllers/Users/JobsController.php | 9 ++------ app/Queries/AdminDashboardQuery.php | 27 +++++++++++++++++------ resources/views/jobs/unfinished.blade.php | 8 +++---- resources/views/users/jobs.blade.php | 5 ++--- tests/Unit/Models/JobTest.php | 15 +++++++++++++ tests/Unit/Queries/AdminDashboardQueryTest.php | 28 ++++++++++++++++++++++++ 9 files changed, 85 insertions(+), 33 deletions(-) diff --git a/app/Entities/Projects/Job.php b/app/Entities/Projects/Job.php index 65d41c9..276009a 100755 --- a/app/Entities/Projects/Job.php +++ b/app/Entities/Projects/Job.php @@ -18,6 +18,16 @@ class Job extends Model protected $presenter = JobPresenter::class; protected $guarded = ['id', 'created_at', 'updated_at']; + public function nameLink() + { + return link_to_route('jobs.show', $this->name, [$this->id], [ + 'title' => trans( + 'app.show_detail_title', + ['name' => $this->name, 'type' => trans('job.job')] + ), + ]); + } + public function project() { return $this->belongsTo(Project::class, 'project_id'); diff --git a/app/Entities/Projects/JobsRepository.php b/app/Entities/Projects/JobsRepository.php index aded52e..396f68b 100755 --- a/app/Entities/Projects/JobsRepository.php +++ b/app/Entities/Projects/JobsRepository.php @@ -4,6 +4,7 @@ namespace App\Entities\Projects; use App\Entities\BaseRepository; use App\Entities\Users\User; +use App\Queries\AdminDashboardQuery; use DB; /** @@ -22,17 +23,8 @@ class JobsRepository extends BaseRepository public function getUnfinishedJobs(User $user) { - $jobsQuery = $this->model->whereHas('tasks', function ($query) { - return $query->where('progress', '<', 100); - })->whereHas('project', function ($query) { - return $query->whereIn('status_id', [2, 3]); - })->with(['tasks', 'project']); - - if ($user->hasRole('admin') == false) { - $jobsQuery->where('worker_id', $user->id); - } - - return $jobsQuery->get(); + return (new AdminDashboardQuery) + ->onProgressJobs($user, ['project', 'worker']); } public function requireProjectById($projectId) diff --git a/app/Http/Controllers/Projects/JobsController.php b/app/Http/Controllers/Projects/JobsController.php index 7df14fa..f07f925 100755 --- a/app/Http/Controllers/Projects/JobsController.php +++ b/app/Http/Controllers/Projects/JobsController.php @@ -24,7 +24,7 @@ class JobsController extends Controller public function index(Project $project) { - $jobs = $project->jobs; + $jobs = $project->jobs()->with(['tasks'])->get(); return view('projects.jobs.index', compact('project', 'jobs')); } diff --git a/app/Http/Controllers/Users/JobsController.php b/app/Http/Controllers/Users/JobsController.php index 8d9fec1..f3180f7 100644 --- a/app/Http/Controllers/Users/JobsController.php +++ b/app/Http/Controllers/Users/JobsController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Users; use App\Entities\Users\User; use App\Http\Controllers\Controller; +use App\Queries\AdminDashboardQuery; /** * User Jobs Controller. @@ -14,13 +15,7 @@ class JobsController extends Controller { public function index(User $user) { - $jobs = $user->jobs()->whereHas('tasks', function ($query) { - return $query->where('progress', '<', 100); - })->whereHas('project', function ($query) { - return $query->whereIn('status_id', [2, 3]); - })->where('worker_id', $user->id) - ->with(['tasks', 'project']) - ->paginate(); + $jobs = (new AdminDashboardQuery)->onProgressJobs($user); return view('users.jobs', compact('user', 'jobs')); } diff --git a/app/Queries/AdminDashboardQuery.php b/app/Queries/AdminDashboardQuery.php index 1111442..da90950 100644 --- a/app/Queries/AdminDashboardQuery.php +++ b/app/Queries/AdminDashboardQuery.php @@ -96,22 +96,35 @@ class AdminDashboardQuery } /** - * Get on progress project jobs count. + * Get on progress project jobs list. * * @return int */ - public function onProgressJobCount(User $user) + public function onProgressJobs(User $user, array $eagerLoads = []) { - $jobQuery = Job::whereHas('tasks', function ($query) { - return $query->where('progress', '<', 100); - })->whereHas('project', function ($query) { + $eagerLoads = array_merge(['tasks'], $eagerLoads); + $jobQuery = Job::whereHas('project', function ($query) { return $query->whereIn('status_id', [2, 3]); - }); + })->with($eagerLoads); if ($user->hasRole('admin') == false) { $jobQuery->where('worker_id', $user->id); } - return $jobQuery->count(); + $jobs = $jobQuery->get() + ->where('progress', '<', 100) + ->values(); + + return $jobs; + } + + /** + * Get on progress project jobs count. + * + * @return int + */ + public function onProgressJobCount(User $user) + { + return $this->onProgressJobs($user)->count(); } } diff --git a/resources/views/jobs/unfinished.blade.php b/resources/views/jobs/unfinished.blade.php index e12d84b..2b334db 100755 --- a/resources/views/jobs/unfinished.blade.php +++ b/resources/views/jobs/unfinished.blade.php @@ -1,6 +1,6 @@ @extends('layouts.app') -@section('title', trans('project.jobs')) +@section('title', trans('job.on_progress')) @section('content')

{{ trans('job.on_progress') }}

@@ -21,9 +21,9 @@ @forelse($jobs as $key => $job) {{ 1 + $key }} - {{ $job->project->name }} + {{ $job->project->nameLink() }} - {{ $job->name }} + {{ $job->nameLink() }} @if ($job->tasks->isEmpty() == false)