Skip to content

Commit e78e6ee

Browse files
authored
Merge pull request #6913 from ProcessMaker/FOUR-15872
FOUR-15872 Implement task screen endpoint
2 parents 756f234 + 0eb08d8 commit e78e6ee

File tree

8 files changed

+2619
-7
lines changed

8 files changed

+2619
-7
lines changed

ProcessMaker/Http/Controllers/Api/V1_1/TaskController.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use ProcessMaker\Http\Controllers\Controller;
88
use ProcessMaker\Models\ProcessRequestToken;
9+
use ProcessMaker\Http\Resources\V1_1\TaskScreen;
910

1011
class TaskController extends Controller
1112
{
@@ -30,4 +31,18 @@ public function show(ProcessRequestToken $task)
3031
{
3132
return $task;
3233
}
34+
35+
public function showScreen($taskId)
36+
{
37+
$task = ProcessRequestToken::select('id', 'process_request_id', 'element_id', 'process_id')
38+
->findOrFail($taskId);
39+
$response = new TaskScreen($task);
40+
$response = response($response->toArray(request())['screen'], 200);
41+
$now = time();
42+
// screen cache time
43+
$cacheTime = config('screen_task_cache_time', 86400);
44+
$response->headers->set('Cache-Control', 'max-age=' . $cacheTime . ', must-revalidate, public');
45+
$response->headers->set('Expires', gmdate('D, d M Y H:i:s', $now + $cacheTime) . ' GMT');
46+
return $response;
47+
}
3348
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
namespace ProcessMaker\Http\Resources\V1_1;
4+
5+
use ProcessMaker\Http\Resources\ApiResource;
6+
use ProcessMaker\Http\Resources\ScreenVersion as ScreenVersionResource;
7+
use ProcessMaker\ProcessTranslations\ProcessTranslation;
8+
use ProcessMaker\Traits\TaskScreenResourceTrait;
9+
10+
class TaskScreen extends ApiResource
11+
{
12+
use TaskScreenResourceTrait;
13+
14+
/**
15+
* Transform the resource into an array.
16+
*
17+
* @param \Illuminate\Http\Request
18+
* @return array
19+
*/
20+
public function toArray($request)
21+
{
22+
return $this->includeScreen($request);
23+
}
24+
25+
private function includeScreen($request)
26+
{
27+
$array = ['screen' => null];
28+
29+
$screen = $this->getScreenVersion();
30+
31+
if ($screen) {
32+
if ($screen->type === 'ADVANCED') {
33+
$array['screen'] = $screen;
34+
} else {
35+
$resource = new ScreenVersionResource($screen);
36+
$array['screen'] = $resource->toArray($request);
37+
}
38+
} else {
39+
$array['screen'] = null;
40+
}
41+
42+
if ($array['screen']) {
43+
// Apply translations to screen
44+
$processTranslation = new ProcessTranslation($this->process);
45+
$array['screen']['config'] = $processTranslation->applyTranslations($array['screen']);
46+
$array['screen']['config'] = $this->removeInspectorMetadata($array['screen']['config']);
47+
48+
// Apply translations to nested screens
49+
if (array_key_exists('nested', $array['screen'])) {
50+
foreach ($array['screen']['nested'] as &$nestedScreen) {
51+
$nestedScreen['config'] = $processTranslation->applyTranslations($nestedScreen);
52+
$nestedScreen['config'] = $this->removeInspectorMetadata($nestedScreen['config']);
53+
}
54+
}
55+
}
56+
57+
return $array;
58+
}
59+
}

ProcessMaker/Traits/TaskResourceIncludes.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
trait TaskResourceIncludes
1414
{
15+
use TaskScreenResourceTrait;
16+
1517
private function includeData()
1618
{
1719
return ['data' => $this->getData()];
@@ -29,7 +31,7 @@ private function includeRequestor()
2931

3032
private function includeProcessRequest()
3133
{
32-
return ['process_request' => new Users($this->processRequest)];
34+
return ['process_request' => $this->processRequest->attributesToArray()];
3335
}
3436

3537
private function includeDraft()
@@ -72,11 +74,13 @@ private function includeScreen($request)
7274
// Apply translations to screen
7375
$processTranslation = new ProcessTranslation($this->process);
7476
$array['screen']['config'] = $processTranslation->applyTranslations($array['screen']);
77+
$array['screen']['config'] = $this->removeInspectorMetadata($array['screen']['config']);
7578

7679
// Apply translations to nested screens
7780
if (array_key_exists('nested', $array['screen'])) {
7881
foreach ($array['screen']['nested'] as &$nestedScreen) {
7982
$nestedScreen['config'] = $processTranslation->applyTranslations($nestedScreen);
83+
$nestedScreen['config'] = $this->removeInspectorMetadata($nestedScreen['config']);
8084
}
8185
}
8286
}
@@ -125,6 +129,11 @@ private function includeInterstitial()
125129
$translatedConf = $processTranslation->applyTranslations($interstitial['interstitial_screen']);
126130
$interstitial['interstitial_screen']['config'] = $translatedConf;
127131

132+
// Remove inspector metadata
133+
$interstitial['interstitial_screen']['config'] = $this->removeInspectorMetadata(
134+
$interstitial['interstitial_screen']['config']
135+
);
136+
128137
return [
129138
'allow_interstitial' => $interstitial['allow_interstitial'],
130139
'interstitial_screen' => $interstitial['interstitial_screen'],
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace ProcessMaker\Traits;
4+
5+
trait TaskScreenResourceTrait
6+
{
7+
8+
/**
9+
* Removes the inspector metadata from the screen configuration
10+
*
11+
* @param array $config
12+
* @return array
13+
*/
14+
private function removeInspectorMetadata(array $config)
15+
{
16+
foreach ($config as $i => $page) {
17+
$config[$i]['items'] = $this->removeInspectorMetadataItems($page['items']);
18+
}
19+
return $config;
20+
}
21+
22+
/**
23+
* Removes the inspector metadata from the screen configuration items
24+
*
25+
* @param array $items
26+
* @return array
27+
*/
28+
private function removeInspectorMetadataItems(array $items)
29+
{
30+
foreach ($items as $i => $item) {
31+
if (isset($item['inspector'])) {
32+
unset($item['inspector']);
33+
}
34+
if (isset($item['component']) && $item['component'] === 'FormMultiColumn') {
35+
foreach ($item['items'] as $c => $col) {
36+
$item['items'][$c] = $this->removeInspectorMetadataItems($col);
37+
}
38+
} elseif (isset($item['items']) && is_array($item['items'])) {
39+
$item['items'] = $this->removeInspectorMetadataItems($item['items']);
40+
}
41+
$items[$i] = $item;
42+
}
43+
return $items;
44+
}
45+
}

routes/v1_1/api.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@
88
->name('api.1.1.')
99
->group(function () {
1010
// Tasks Endpoints
11-
Route::name('tasks.')->group(function () {
11+
Route::name('tasks.')->prefix('tasks')->group(function () {
1212
// Route to list tasks
13-
Route::get('tasks', [TaskController::class, 'index'])
13+
Route::get('/', [TaskController::class, 'index'])
1414
->name('index');
1515

1616
// Route to show a task
17-
Route::get('tasks/{task}', [TaskController::class, 'show'])
18-
->name('show');
17+
Route::get('/{task}', [TaskController::class, 'show'])
18+
->name('show')
19+
->middleware(['bindings','can:view,task']);
20+
21+
// Route to show the screen of a task
22+
Route::get('/{taskId}/screen', [TaskController::class, 'showScreen'])
23+
->name('show.screen');
1924
});
2025
});

0 commit comments

Comments
 (0)