Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
*
Expand Down
10 changes: 5 additions & 5 deletions ProcessMaker/Repositories/CaseApiRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -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'));
}

Expand All @@ -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) {
Expand All @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down
6 changes: 5 additions & 1 deletion routes/v1_1/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -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');
});
});
51 changes: 51 additions & 0 deletions tests/Feature/Api/V1_1/CaseControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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]);
}
}