Skip to content

FOUR-11922 - Backend: Develop APIs to fetch the list of Wizard Templates #5710

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Dec 4, 2023
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
28 changes: 28 additions & 0 deletions ProcessMaker/Http/Controllers/Api/WizardTemplateController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace ProcessMaker\Http\Controllers\Api;

use Illuminate\Http\Request;
use ProcessMaker\Http\Controllers\Controller;
use ProcessMaker\Http\Resources\ApiCollection;
use ProcessMaker\Models\WizardTemplate;

class WizardTemplateController extends Controller
{
/**
* Get list of wizard templates
*/
public function index(Request $request): ApiCollection
{
$perPage = $request->input('per_page', 10);
$column = $request->input('order_by', 'id');
$direction = $request->input('order_direction', 'asc');

$query = WizardTemplate::query()
->orderBy($column, $direction);

$data = $query->paginate($perPage);

return new ApiCollection($data);
}
}
24 changes: 15 additions & 9 deletions ProcessMaker/Jobs/SyncWizardTemplates.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@
use Illuminate\Support\Facades\Http;
use ProcessMaker\ImportExport\Importer;
use ProcessMaker\ImportExport\Options;
use ProcessMaker\Models\Process;
use ProcessMaker\Models\ProcessCategory;
use ProcessMaker\Models\WizardTemplate;
use ProcessMaker\Models\WizardTemplateCategory;

class SyncWizardTemplates implements ShouldQueue
{
Expand Down Expand Up @@ -46,10 +47,10 @@ public function handle()
? explode(',', $config['wizard_categories'])
: [$config['wizard_categories']];

$wizardTemplateCategoryId = WizardTemplateCategory::firstOrCreate(
['name' => 'Default Wizard Templates'],
$wizardTemplateCategoryId = ProcessCategory::firstOrCreate(
['name' => 'Wizard Templates'],
[
'name' => 'Default Wizard Templates',
'name' => 'Wizard Templates',
'status' => 'ACTIVE',
'is_system' => 0,
]
Expand All @@ -64,11 +65,11 @@ public function handle()

// Extract the json data from the response and iterate over the categories and templates to retrieve them.
$data = $response->json();
foreach ($data as $templateCategory => $templates) {
foreach ($data as $templateCategory => $wizardTemplates) {
if (!in_array($templateCategory, $categories) && !in_array('all', $categories)) {
continue;
}
foreach ($templates as $template) {
foreach ($wizardTemplates as $template) {
$existingTemplate = WizardTemplate::where('uuid', $template['uuid'])->first();
// If the template already exists in the database with a user then skip it,
// since we don't want to overwrite their changes.
Expand All @@ -86,17 +87,22 @@ public function handle()
throw new Exception("Unable to fetch wizard template {$template['name']}.");
}
$payload = $response->json();
$dataKey = "export.{$payload['root']}.attributes.wizard_template_category_id";
$dataKey = "export.{$payload['root']}.attributes.process_category_id";
data_set($payload, $dataKey, $wizardTemplateCategoryId);

$options = new Options([
'mode' => 'update',
'isTemplate' => true,
'asset_type' => 'WIZARD_TEMPLATE',
'saveAssetsMode' => 'saveAllAssets',
]);

$importer = new Importer($payload, $options);
$importer->doImport();

$template = Process::where('uuid', $template['uuid'])->first();

WizardTemplate::create([
'process_id' => $template->id,
]);
}
}
}
Expand Down
38 changes: 38 additions & 0 deletions ProcessMaker/Models/WizardTemplate.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace ProcessMaker\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use ProcessMaker\Traits\HasUuids;

class WizardTemplate extends ProcessMakerModel
{
use HasFactory;
use HasUuids;

protected $table = 'wizard_templates';

protected $fillable = [
'uuid',
'process_template_id',
'process_id',
'media_collection',
];

/**
* Get the process associated with the wizard template.
*/
public function process(): BelongsTo
{
return $this->belongsTo(Process::class, 'process_id');
}

/**
* Get the process template associated with the wizard template.
*/
public function process_template(): BelongsTo
{
return $this->belongsTo(ProcessTemplates::class, 'process_template_id');
}
}
21 changes: 21 additions & 0 deletions database/factories/ProcessMaker/Models/WizardTemplateFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace Database\Factories\ProcessMaker\Models;

use Illuminate\Database\Eloquent\Factories\Factory;
use ProcessMaker\Models\Process;
use ProcessMaker\Models\WizardTemplate;

class WizardTemplateFactory extends Factory
{
protected $model = WizardTemplate::class;

public function definition()
{
return [
'uuid' => $this->faker->uuid,
'process_template_id' => null,
'process_id' => Process::factory()->create()->id,
];
}
}
6 changes: 4 additions & 2 deletions routes/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,8 @@
use ProcessMaker\Http\Controllers\Api\TemplateController;
use ProcessMaker\Http\Controllers\Api\UserController;
use ProcessMaker\Http\Controllers\Api\UserTokenController;
use ProcessMaker\Http\Controllers\Process\ModelerController;
use ProcessMaker\Http\Controllers\Api\WizardTemplateController;
use ProcessMaker\Http\Controllers\TestStatusController;
use ProcessMaker\Http\Middleware\ValidateEditUserAndPasswordPermission;

Route::middleware('auth:api', 'setlocale', 'bindings', 'sanitize')->prefix('api/1.0')->name('api.')->group(function () {
// Users
Expand Down Expand Up @@ -255,6 +254,9 @@
Route::get('modeler/templates/{type}/{id}', [TemplateController::class, 'show'])->name('modeler.template.show')->middleware('template-authorization');
Route::post('templates/{type}/import/validation', [TemplateController::class, 'preImportValidation'])->name('template.preImportValidation')->middleware('template-authorization');

// Wizard Templates
Route::get('wizard-templates', [WizardTemplateController::class, 'index'])->name('wizard-templates.index');

// Process Translations
Route::get('process/translations', [ProcessTranslationController::class, 'index'])->name('process-translation.index')->middleware('can:view-process-translations');
Route::get('process/translations/pending', [ProcessTranslationController::class, 'pending'])->name('process-translation.pending')->middleware('can:view-process-translations');
Expand Down
35 changes: 35 additions & 0 deletions tests/Feature/Api/WizardTemplatesTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace Tests\Feature\Api;

use ProcessMaker\Models\WizardTemplate;
use Tests\Feature\Shared\RequestHelper;
use Tests\TestCase;

class WizardTemplatesTest extends TestCase
{
use RequestHelper;

public function testGetWizardTemplates()
{
$total = 20;
WizardTemplate::factory()->count($total)->create();

$params = [
'order_by' => 'id',
'order_direction' => 'asc',
'per_page' => 10,
];
$route = route('api.wizard-templates.index', $params);
$response = $this->apiCall('GET', $route);

$response->assertStatus(200);
$response->assertJsonCount(10, 'data');
$response->assertJson([
'meta' => [
'per_page' => $params['per_page'],
'total' => $total,
],
]);
}
}