From 98b26105aba92658639497168f452d7ff12880e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Cesar=20Laura=20Avenda=C3=B1o?= Date: Wed, 2 Oct 2024 15:19:17 +0000 Subject: [PATCH] FOUR-18605 Count the cases and requests by user and status (EP) --- .../Controllers/Api/V1_1/CaseController.php | 70 +++++++++++++++++++ .../Repositories/CaseApiRepository.php | 10 +-- routes/v1_1/api.php | 6 +- tests/Feature/Api/V1_1/CaseControllerTest.php | 51 ++++++++++++++ 4 files changed, 131 insertions(+), 6 deletions(-) diff --git a/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php index ffa3056358..75f0c449eb 100644 --- a/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php +++ b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php @@ -5,9 +5,12 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use ProcessMaker\Http\Controllers\Api\ProcessRequestController; use ProcessMaker\Http\Controllers\Controller; use ProcessMaker\Http\Requests\CaseListRequest; use ProcessMaker\Http\Resources\V1_1\CaseResource; +use ProcessMaker\Models\User; use ProcessMaker\Repositories\CaseApiRepository; class CaseController extends Controller @@ -83,6 +86,73 @@ public function getCompleted(CaseListRequest $request): JSonResponse return $this->paginateResponse($query); } + /** + * Get "my cases" counters + * + * @param CaseListRequest $request + * + * @return JsonResponse + */ + public function getMyCasesCounters(CaseListRequest $request): JsonResponse + { + // Load user object + if ($request->filled('userId')) { + $userId = $request->get('userId'); + $user = User::find($userId); + } else { + $user = Auth::user(); + } + + // Initializing variables + $totalAllCases = null; + $totalMyCases = null; + $totalInProgress = null; + $totalCompleted = null; + $totalMyRequest = null; + + // Check permission + if ($user->hasPermission('view-all_cases')) { + // The total number of cases recorded in the platform. User Id send is overridden. + $request->merge(['userId' => null]); + $queryAllCases = $this->caseRepository->getAllCases($request); + $totalAllCases = $queryAllCases->count(); + } + + // Restore user id + $request->merge(['userId' => $user->id]); + + // The total number of cases recorded by the user making the request. + $queryMyCases = $this->caseRepository->getAllCases($request); + $totalMyCases = $queryMyCases->count(); + + // The number of In Progress cases started by the user making the request. + $queryInProgressCases = $this->caseRepository->getInProgressCases($request); + $totalInProgress = $queryInProgressCases->count(); + + // The number of Completed cases started by the user making the request. + $queryCompletedCases = $this->caseRepository->getCompletedCases($request); + $totalCompleted = $queryCompletedCases->count(); + + // Check permission + if ($user->hasPermission('view-my_requests')) { + // Only in progress requests + $requestAux = new Request(); + $requestAux->replace(['type' => 'in_progress']); + + // The number of requests for user making the request. + $totalMyRequest = (new ProcessRequestController)->index($requestAux, true, $user); + } + + // Build response + return response()->json([ + 'totalAllCases' => $totalAllCases, + 'totalMyCases' => $totalMyCases, + 'totalInProgress' => $totalInProgress, + 'totalCompleted' => $totalCompleted, + 'totalMyRequest' => $totalMyRequest, + ]); + } + /** * Handle pagination and return JSON response. * diff --git a/ProcessMaker/Repositories/CaseApiRepository.php b/ProcessMaker/Repositories/CaseApiRepository.php index ccc6b14b92..08010b6ecf 100644 --- a/ProcessMaker/Repositories/CaseApiRepository.php +++ b/ProcessMaker/Repositories/CaseApiRepository.php @@ -116,11 +116,11 @@ public function getCompletedCases(Request $request): Builder */ protected function applyFilters(Request $request, Builder $query): void { - if ($request->has('userId')) { + if ($request->filled('userId')) { $query->where('user_id', $request->get('userId')); } - if ($request->has('status')) { + if ($request->filled('status')) { $query->where('case_status', $request->get('status')); } @@ -139,7 +139,7 @@ protected function applyFilters(Request $request, Builder $query): void */ public function search(Request $request, Builder $query): void { - if ($request->has('search')) { + if ($request->filled('search')) { $search = $request->get('search'); $query->where(function ($q) use ($search) { @@ -165,7 +165,7 @@ public function search(Request $request, Builder $query): void */ public function filterBy(Request $request, Builder $query): void { - if ($request->has('filterBy')) { + if ($request->filled('filterBy')) { $filterByValue = $request->get('filterBy'); foreach ($filterByValue as $key => $value) { @@ -193,7 +193,7 @@ public function filterBy(Request $request, Builder $query): void */ public function sortBy(Request $request, Builder $query): void { - if ($request->has('sortBy')) { + if ($request->filled('sortBy')) { $sort = explode(',', $request->get('sortBy')); foreach ($sort as $value) { diff --git a/routes/v1_1/api.php b/routes/v1_1/api.php index 1c722ad5cb..b147e8b5a7 100644 --- a/routes/v1_1/api.php +++ b/routes/v1_1/api.php @@ -38,8 +38,12 @@ Route::get('get_in_progress', [CaseController::class, 'getInProgress']) ->name('in_progress'); - // Route to list all completed cases + // Route to list all completed cases Route::get('get_completed', [CaseController::class, 'getCompleted']) ->name('completed'); + + // Route to get my cases counters + Route::get('get_my_cases_counters', [CaseController::class, 'getMyCasesCounters']) + ->name('my_cases_counters'); }); }); diff --git a/tests/Feature/Api/V1_1/CaseControllerTest.php b/tests/Feature/Api/V1_1/CaseControllerTest.php index 31333a9316..397532133e 100644 --- a/tests/Feature/Api/V1_1/CaseControllerTest.php +++ b/tests/Feature/Api/V1_1/CaseControllerTest.php @@ -2,9 +2,12 @@ namespace Tests\Feature\Api\V1_1; +use Faker\Factory as Faker; use Illuminate\Support\Facades\Hash; use ProcessMaker\Models\CaseParticipated; use ProcessMaker\Models\CaseStarted; +use ProcessMaker\Models\Permission; +use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Models\User; use Tests\Feature\Shared\RequestHelper; use Tests\TestCase; @@ -234,4 +237,52 @@ public function test_get_all_cases_filter_by_invalid_field(): void $response->assertStatus(422); $response->assertJsonPath('message', "Filter by field $invalidField is not allowed."); } + + public function test_get_my_cases_counters_ok(): void + { + /** + * Creating missing permissions, probably this part should be removed when + * the permissions were added in another ticket + */ + Permission::create([ + 'name' => 'view-all_cases', + 'title' => 'View All Cases', + ]); + Permission::create([ + 'name' => 'view-my_requests', + 'title' => 'View My Requests', + ]); + + $userA = $this->createUser('user_a'); + $userB = $this->createUser('user_b'); + + $userA->giveDirectPermission('view-all_cases'); + $userA->giveDirectPermission('view-my_requests'); + $userB->giveDirectPermission('view-all_cases'); + $userB->giveDirectPermission('view-my_requests'); + + $casesA = $this->createCasesStartedForUser($userA->id, 5, ['case_status' => 'COMPLETED']); + $casesB = $this->createCasesStartedForUser($userA->id, 5, ['case_status' => 'IN_PROGRESS']); + $casesC = $this->createCasesParticipatedForUser($userA->id, 5, ['case_status' => 'COMPLETED']); + $casesD = $this->createCasesParticipatedForUser($userA->id, 5, ['case_status' => 'IN_PROGRESS']); + + $casesE = $this->createCasesStartedForUser($userB->id, 5, ['case_status' => 'COMPLETED']); + $casesF = $this->createCasesStartedForUser($userB->id, 5, ['case_status' => 'IN_PROGRESS']); + $casesG = $this->createCasesParticipatedForUser($userB->id, 5, ['case_status' => 'COMPLETED']); + $casesH = $this->createCasesParticipatedForUser($userB->id, 5, ['case_status' => 'IN_PROGRESS']); + + $in_progress = ProcessRequest::factory(5)->create([ + 'status' => 'ACTIVE', + 'user_id' => $userA->id, + ]); + + $response = $this->apiCall('GET', route('api.1.1.cases.my_cases_counters'), ['userId' => $userA->id]); + + $response->assertStatus(200); + $response->assertJsonFragment(['totalAllCases' => 20]); + $response->assertJsonFragment(['totalMyCases' => 10]); + $response->assertJsonFragment(['totalInProgress' => 5]); + $response->assertJsonFragment(['totalCompleted' => 5]); + $response->assertJsonFragment(['totalMyRequest' => 5]); + } }