Skip to content
Merged
Changes from 1 commit
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
Next Next commit
fix: implement Last-Modified header with If-Modified-Since validation…
… for cache control
  • Loading branch information
eiresendez committed Sep 26, 2024
commit 1858009b36ace4b499dfe61ccbbb2c5f12caedb4
94 changes: 61 additions & 33 deletions ProcessMaker/Http/Controllers/Api/V1_1/TaskController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@

namespace ProcessMaker\Http\Controllers\Api\V1_1;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use ProcessMaker\Http\Controllers\Controller;
use ProcessMaker\Http\Resources\V1_1\TaskInterstitialResource;
use ProcessMaker\Http\Resources\V1_1\TaskResource;
Expand Down Expand Up @@ -59,54 +62,51 @@ public function index()
];
}

private function processFilters(Request $request, Builder $query)
{
if (request()->has('user_id')) {
ProcessRequestToken::scopeWhereUserAssigned($query, request()->get('user_id'));
}

if ($request->has('process_request_id')) {
$query->where(function ($q) use ($request) {
$q->where('process_request_id', $request->input('process_request_id'));
$this->addSubprocessTasks($request, $q);
});
}
if ($request->has('status')) {
$query->where('status', $request->input('status'));
}
}

private function addSubprocessTasks(Request $request, Builder &$q)
{
if ($request->has('include_sub_tasks')) {
$q->orWhereIn(
'process_request_id',
ProcessRequest::select('id')
->where('parent_request_id', $request->input('process_request_id'))
);
}
}

public function show(ProcessRequestToken $task)
{
$resource = TaskResource::preprocessInclude(request(), ProcessRequestToken::where('id', $task->id));

return $resource->toArray(request());
}

public function showScreen($taskId)
/**
* Display the screen for a given task.
*
* @throws ModelNotFoundException If the task is not found.
*/
public function showScreen(Request $request, int $taskId): Response
{
// Fetch the task data.
$task = ProcessRequestToken::select(
array_merge($this->defaultFields, ['process_request_id', 'process_id'])
)->findOrFail($taskId);

// Prepare the response.
$response = new TaskScreen($task);
$response = response($response->toArray(request())['screen'], 200);
$now = time();
// screen cache time
$screen = $response->toArray($request)['screen'];
$now = isset($screen['updated_at'])
? Carbon::parse($screen['updated_at'])->timestamp
: time();

// Create the response object.
$response = response($screen, 200);

// Set Cache-Control headers.
$cacheTime = config('screen_task_cache_time', 86400);
$response->headers->set('Cache-Control', 'max-age=' . $cacheTime . ', must-revalidate, public');
$response->headers->set('Cache-Control', 'no-cache, must-revalidate, public');
$response->headers->set('Expires', gmdate('D, d M Y H:i:s', $now + $cacheTime) . ' GMT');

// Set Last-Modified header.
$response->headers->set('Last-Modified', gmdate('D, d M Y H:i:s', $now) . ' GMT');

// Return 304 if the resource has not been modified since the provided date.
if ($request->headers->has('If-Modified-Since')) {
$ifModifiedSince = strtotime($request->headers->get('If-Modified-Since'));
if ($ifModifiedSince >= $now) {
return response()->noContent(304);
}
}

return $response;
}

Expand All @@ -125,4 +125,32 @@ public function showInterstitial($taskId)

return $response;
}

private function processFilters(Request $request, Builder $query)
{
if (request()->has('user_id')) {
ProcessRequestToken::scopeWhereUserAssigned($query, request()->get('user_id'));
}

if ($request->has('process_request_id')) {
$query->where(function ($q) use ($request) {
$q->where('process_request_id', $request->input('process_request_id'));
$this->addSubprocessTasks($request, $q);
});
}
if ($request->has('status')) {
$query->where('status', $request->input('status'));
}
}

private function addSubprocessTasks(Request $request, Builder &$q)
{
if ($request->has('include_sub_tasks')) {
$q->orWhereIn(
'process_request_id',
ProcessRequest::select('id')
->where('parent_request_id', $request->input('process_request_id'))
);
}
}
}