Skip to content
This repository was archived by the owner on Jun 8, 2023. It is now read-only.
148 changes: 148 additions & 0 deletions app/Domains/Settings/ManageModules/Services/CreateModule.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
<?php

namespace App\Domains\Settings\ManageModules\Services;

use App\Interfaces\ServiceInterface;
use App\Models\Module;
use App\Models\ModuleRow;
use App\Models\ModuleRowField;
use App\Models\ModuleRowFieldChoice;
use App\Models\User;
use App\Services\BaseService;

class CreateModule extends BaseService implements ServiceInterface
{
private array $data;

private Module $module;

/**
* Get the validation rules that apply to the service.
*
* @return array
*/
public function rules(): array
{
return [
'account_id' => 'required|integer|exists:accounts,id',
'author_id' => 'required|integer|exists:users,id',
'name' => 'required|string|max:255',
'rows' => 'required|array',
];
}

/**
* Get the permissions that apply to the user calling the service.
*
* @return array
*/
public function permissions(): array
{
return [
'author_must_belong_to_account',
'author_must_be_account_administrator',
];
}

/**
* Create a module.
*
* @param array $data
* @return Module
*/
public function execute(array $data): Module
{
$this->data = $data;
$this->validateRules($data);

$this->createModule();
$this->analyzeRows();

return $this->module;
}

private function createModule(): void
{
$this->module = Module::create([
'account_id' => $this->data['account_id'],
'name' => $this->data['name'],
'type' => Module::TYPE_CUSTOM,
'reserved_to_contact_information' => false,
'can_be_deleted' => true,
]);
}

private function analyzeRows(): void
{
$rows = $this->data['rows'];

foreach ($rows as $row) {
$this->createModuleRow($row);
}
}

private function createModuleRow(array $row): void
{
$moduleRow = ModuleRow::create([
'module_id' => $this->module->id,
'position' => $row['position'],
]);

$this->analyzeFields($row['fields'], $moduleRow);
}

private function analyzeFields($fields, ModuleRow $moduleRow): void
{
foreach ($fields as $field) {
$this->analyzeField($field, $moduleRow);
}
}

private function analyzeField(array $field, ModuleRow $moduleRow): void
{
if ($field['type'] == 'input') {
$this->addTextField($field, $moduleRow);
}

if ($field['type'] == 'textarea') {
$this->addTextField($field, $moduleRow);
}

if ($field['type'] == 'dropdown') {
$this->addDropdownChoices($field, $moduleRow);
}
}

private function addTextField($field, ModuleRow $moduleRow): void
{
ModuleRowField::create([
'module_row_id' => $moduleRow->id,
'module_field_type' => ModuleRowField::TYPE_TEXTAREA,
'label' => $field['name'],
'position' => $field['position'],
'help' => $field['help'],
'placeholder' => $field['placeholder'],
'required' => $field['required'],
]);
}

private function addDropdownChoices($field, ModuleRow $moduleRow): void
{
$rowField = ModuleRowField::create([
'module_row_id' => $moduleRow->id,
'module_field_type' => ModuleRowField::TYPE_DROPDOWN,
'label' => $field['name'],
'position' => $field['position'],
'help' => $field['help'],
'placeholder' => null,
'required' => $field['required'],
]);

foreach ($field['choices'] as $choice) {
ModuleRowFieldChoice::create([
'module_row_field_id' => $rowField->id,
'label' => $choice['label'],
]);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,19 @@

namespace App\Domains\Settings\ManageModules\Web\Controllers;

use App\Domains\Settings\ManageModules\Services\CreateModule;
use App\Domains\Settings\ManageModules\Web\ViewHelpers\PersonalizeModuleCreateViewHelper;
use App\Domains\Settings\ManageModules\Web\ViewHelpers\PersonalizeModuleIndexViewHelper;
use App\Domains\Settings\ManageModules\Web\ViewHelpers\PersonalizeModuleShowViewHelper;
use App\Domains\Settings\ManageTemplates\Services\DestroyModule;
use App\Domains\Vault\ManageVault\Web\ViewHelpers\VaultIndexViewHelper;
use App\Http\Controllers\Controller;
use App\Models\Module;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Inertia\Inertia;
use Redirect;

class PersonalizeModulesController extends Controller
{
Expand All @@ -17,4 +25,54 @@ public function index()
'data' => PersonalizeModuleIndexViewHelper::data(Auth::user()->account),
]);
}

public function create(Request $request)
{
return Inertia::render('Settings/Personalize/Modules/Create', [
'layoutData' => VaultIndexViewHelper::layoutData(),
'data' => PersonalizeModuleCreateViewHelper::data(Auth::user()->account),
]);
}

public function store(Request $request)
{
$data = [
'account_id' => Auth::user()->account_id,
'author_id' => Auth::id(),
'name' => $request->input('name'),
'rows' => $request->input('rows'),
];

(new CreateModule())->execute($data);

return Redirect::route('settings.personalize.module.index');
}

public function show(Request $request, int $moduleId)
{
try {
$module = Module::where('account_id', Auth::user()->account_id)
->findOrFail($moduleId);
} catch (ModelNotFoundException) {
return redirect('settings.personalize.module.index');
}

return Inertia::render('Settings/Personalize/Modules/Show', [
'layoutData' => VaultIndexViewHelper::layoutData(),
'data' => PersonalizeModuleShowViewHelper::data($module, Auth::user()),
]);
}

public function destroy(Request $request, int $moduleId)
{
$data = [
'account_id' => Auth::user()->account_id,
'author_id' => Auth::id(),
'module_id' => $moduleId,
];

(new DestroyModule())->execute($data);

return Redirect::route('settings.personalize.module.index');
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace App\Domains\Settings\ManageModules\Web\ViewHelpers;

use App\Models\Account;

class PersonalizeModuleCreateViewHelper
{
public static function data(Account $account): array
{
return [
'url' => [
'settings' => route('settings.index'),
'personalize' => route('settings.personalize.index'),
'modules' => route('settings.personalize.module.index'),
'back' => route('settings.personalize.module.index'),
'store' => route('settings.personalize.module.store'),
],
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class PersonalizeModuleIndexViewHelper
public static function data(Account $account): array
{
$modules = $account->modules()
->where('can_be_deleted', true)
->orderBy('name', 'asc')
->get();

Expand All @@ -23,7 +24,7 @@ public static function data(Account $account): array
'url' => [
'settings' => route('settings.index'),
'personalize' => route('settings.personalize.index'),
'module_store' => route('settings.personalize.module.store'),
'create' => route('settings.personalize.module.create'),
],
];
}
Expand All @@ -37,7 +38,7 @@ public static function dtoModule(Module $module): array
'reserved_to_contact_information' => $module->reserved_to_contact_information,
'can_be_deleted' => $module->can_be_deleted,
'url' => [
'update' => route('settings.personalize.module.update', [
'show' => route('settings.personalize.module.show', [
'module' => $module->id,
]),
'destroy' => route('settings.personalize.module.destroy', [
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

namespace App\Domains\Settings\ManageModules\Web\ViewHelpers;

use App\Helpers\DateHelper;
use App\Models\Module;
use App\Models\ModuleRow;
use App\Models\ModuleRowField;
use App\Models\ModuleRowFieldChoice;
use App\Models\User;

class PersonalizeModuleShowViewHelper
{
public static function data(Module $module, User $user): array
{
$rowsCollection = $module->rows()
->get()
->map(fn (ModuleRow $row) => self::dtoModuleRow($row));

return [
'id' => $module->id,
'name' => $module->name,
'module_rows' => $rowsCollection,
'created_at' => DateHelper::format($module->created_at, $user),
'url' => [
'settings' => route('settings.index'),
'personalize' => route('settings.personalize.index'),
'modules' => route('settings.personalize.module.index'),
'destroy' => route('settings.personalize.module.destroy', [
'module' => $module->id,
]),
],
];
}

private static function dtoModuleRow(ModuleRow $row): array
{
$fieldsCollection = $row
->fields()
->orderBy('position', 'asc')
->get()
->map(fn (ModuleRowField $field) => self::dtoModuleRowField($field));

return [
'id' => $row->id,
'module_row_fields' => $fieldsCollection,
];
}

private static function dtoModuleRowField(ModuleRowField $moduleRowField): array
{
$choicesCollection = $moduleRowField
->choices()
->get()
->map(fn (ModuleRowFieldChoice $choice) => self::dtoModuleRowFieldChoice($choice));

return [
'id' => $moduleRowField->id,
'label' => $moduleRowField->label,
'help' => $moduleRowField->help,
'placeholder' => $moduleRowField->placeholder,
'required' => $moduleRowField->required,
'module_field_type' => $moduleRowField->module_field_type,
'choices' => $choicesCollection,
];
}

private static function dtoModuleRowFieldChoice(ModuleRowFieldChoice $choice): array
{
return [
'id' => $choice->id,
'label' => $choice->label,
];
}
}
2 changes: 2 additions & 0 deletions app/Models/Module.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ class Module extends Model
/**
* Possible module types.
*/
public const TYPE_CUSTOM = 'custom';

public const TYPE_NOTES = 'notes';

public const TYPE_CONTACT_NAMES = 'contact_names';
Expand Down
Loading