Ad Contract for settings

This commit is contained in:
Philipp Lang 2023-06-01 12:04:31 +02:00
parent 62fb792e65
commit d2a000cb31
8 changed files with 41 additions and 28 deletions

View File

@ -2,9 +2,11 @@
namespace App\Invoice;
use App\Setting\Contracts\Indexable;
use App\Setting\Contracts\Storeable;
use App\Setting\LocalSettings;
class InvoiceSettings extends LocalSettings
class InvoiceSettings extends LocalSettings implements Indexable, Storeable
{
public string $from_long;
@ -41,7 +43,7 @@ class InvoiceSettings extends LocalSettings
return SettingIndexAction::class;
}
public static function saveAction(): string
public static function storeAction(): string
{
return SettingSaveAction::class;
}

View File

@ -4,9 +4,11 @@ namespace App\Mailman;
use App\Mailman\Actions\SettingIndexAction;
use App\Mailman\Actions\SettingSaveAction;
use App\Setting\Contracts\Indexable;
use App\Setting\Contracts\Storeable;
use App\Setting\LocalSettings;
class MailmanSettings extends LocalSettings
class MailmanSettings extends LocalSettings implements Storeable, Indexable
{
public ?string $base_url;
@ -39,7 +41,7 @@ class MailmanSettings extends LocalSettings
return SettingIndexAction::class;
}
public static function saveAction(): string
public static function storeAction(): string
{
return SettingSaveAction::class;
}

View File

@ -0,0 +1,11 @@
<?php
namespace App\Setting\Contracts;
interface Indexable
{
/**
* @return class-string
*/
public static function indexAction(): string;
}

View File

@ -0,0 +1,11 @@
<?php
namespace App\Setting\Contracts;
interface Storeable
{
/**
* @return class-string
*/
public static function storeAction(): string;
}

View File

@ -14,16 +14,6 @@ class GeneralSettings extends Settings
/** @var array<int, int> */
public array $allowed_nami_accounts;
/**
* @return array<int, string>
*/
public function moduleOptions(): array
{
return [
'bill',
];
}
public static function group(): string
{
return 'general';

View File

@ -8,16 +8,6 @@ abstract class LocalSettings extends Settings
{
abstract public static function slug(): string;
/**
* @return class-string
*/
abstract public static function indexAction(): string;
/**
* @return class-string
*/
abstract public static function saveAction(): string;
abstract public static function title(): string;
public static function url(): string

View File

@ -2,6 +2,8 @@
namespace App\Setting;
use App\Setting\Contracts\Indexable;
use App\Setting\Contracts\Storeable;
use Illuminate\Routing\Router;
class SettingFactory
@ -12,14 +14,19 @@ class SettingFactory
private array $settings = [];
/**
* @param class-string<LocalSettings> $setting
* @param class-string $setting
*/
public function register(string $setting): void
{
$this->settings[] = $setting;
app(Router::class)->middleware(['web', 'auth:web', SettingMiddleware::class])->get($setting::url(), $setting::indexAction());
app(Router::class)->middleware(['web', 'auth:web', SettingMiddleware::class])->post($setting::url(), $setting::saveAction());
if (new $setting() instanceof Indexable) {
app(Router::class)->middleware(['web', 'auth:web', SettingMiddleware::class])->get($setting::url(), $setting::indexAction());
}
if (new $setting() instanceof Storeable) {
app(Router::class)->middleware(['web', 'auth:web', SettingMiddleware::class])->post($setting::url(), $setting::storeAction());
}
if (1 === count($this->settings)) {
app(Router::class)->redirect('/setting', '/setting/'.$setting::slug());

View File

@ -1,6 +1,6 @@
<?php
namespace Tests\Feature\Bill;
namespace Tests\Feature\Invoice;
use App\Invoice\InvoiceSettings;
use Illuminate\Foundation\Testing\DatabaseTransactions;