From 293be04d40a150ac011381b424d50c2474d1ffc8 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 19 Aug 2025 19:35:12 +0200 Subject: [PATCH] Expand webhooks to support multiple delivery payloads, event triggers and responses. --- .../V1/Controllers/Webhook/ShowController.php | 9 ++ .../Commands/Upgrade/UpgradesDatabase.php | 1 + .../Commands/Upgrade/UpgradesWebhooks.php | 90 ++++++++++++ app/Http/Controllers/HomeController.php | 25 ++++ app/Models/Webhook.php | 40 ++++-- app/Models/WebhookDelivery.php | 26 ++++ app/Models/WebhookResponse.php | 26 ++++ app/Models/WebhookTrigger.php | 26 ++++ .../Webhook/WebhookRepository.php | 48 ++++--- .../JsonApi/Enrichments/WebhookEnrichment.php | 134 ++++++++++++++++++ app/Transformers/WebhookTransformer.php | 9 +- ...9_180459_create_webhook_details_tables.php | 127 +++++++++++++++++ database/seeders/AccountTypeSeeder.php | 21 +-- database/seeders/DatabaseSeeder.php | 1 + database/seeders/TransactionTypeSeeder.php | 19 +-- database/seeders/UserRoleSeeder.php | 11 +- database/seeders/WebhookDataSeeder.php | 48 +++++++ 17 files changed, 586 insertions(+), 75 deletions(-) create mode 100644 app/Console/Commands/Upgrade/UpgradesWebhooks.php create mode 100644 app/Models/WebhookDelivery.php create mode 100644 app/Models/WebhookResponse.php create mode 100644 app/Models/WebhookTrigger.php create mode 100644 app/Support/JsonApi/Enrichments/WebhookEnrichment.php create mode 100644 database/migrations/2025_08_19_180459_create_webhook_details_tables.php create mode 100644 database/seeders/WebhookDataSeeder.php diff --git a/app/Api/V1/Controllers/Webhook/ShowController.php b/app/Api/V1/Controllers/Webhook/ShowController.php index 31906c85ed..cfc2b1ab39 100644 --- a/app/Api/V1/Controllers/Webhook/ShowController.php +++ b/app/Api/V1/Controllers/Webhook/ShowController.php @@ -32,7 +32,9 @@ use FireflyIII\Generator\Webhook\MessageGeneratorInterface; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\Webhook; use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface; +use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment; use FireflyIII\Transformers\WebhookTransformer; +use FireflyIII\User; use Illuminate\Http\JsonResponse; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; @@ -90,6 +92,13 @@ class ShowController extends Controller $paginator = new LengthAwarePaginator($webhooks, $count, $pageSize, $this->parameters->get('page')); $paginator->setPath(route('api.v1.webhooks.index').$this->buildParams()); + // enrich + /** @var User $admin */ + $admin = auth()->user(); + $enrichment = new WebhookEnrichment(); + $enrichment->setUser($admin); + $webhooks = $enrichment->enrich($webhooks); + /** @var WebhookTransformer $transformer */ $transformer = app(WebhookTransformer::class); $transformer->setParameters($this->parameters); diff --git a/app/Console/Commands/Upgrade/UpgradesDatabase.php b/app/Console/Commands/Upgrade/UpgradesDatabase.php index a98ff922d8..92429a9a36 100644 --- a/app/Console/Commands/Upgrade/UpgradesDatabase.php +++ b/app/Console/Commands/Upgrade/UpgradesDatabase.php @@ -75,6 +75,7 @@ class UpgradesDatabase extends Command 'upgrade:610-currency-preferences', 'upgrade:620-piggy-banks', 'upgrade:620-pc-amounts', + 'upgrade:640-upgrade-webhooks', 'firefly-iii:correct-database', ]; $args = []; diff --git a/app/Console/Commands/Upgrade/UpgradesWebhooks.php b/app/Console/Commands/Upgrade/UpgradesWebhooks.php new file mode 100644 index 0000000000..7f3e6e8152 --- /dev/null +++ b/app/Console/Commands/Upgrade/UpgradesWebhooks.php @@ -0,0 +1,90 @@ +isExecuted() && true !== $this->option('force')) { + $this->friendlyInfo('This command has already been executed.'); + + return 0; + } + + $this->upgradeWebhooks(); + $this->markAsExecuted(); + $this->friendlyPositive('Upgraded webhooks.'); + + return 0; + } + + private function isExecuted(): bool + { + $configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); + if (null !== $configVar) { + return (bool)$configVar->data; + } + + return false; + } + + + private function upgradeWebhooks(): void + { + $set = Webhook::where('delivery', '>', 1)->orWhere('trigger', '>', 1)->orWhere('response', '>', 1)->get(); + /** @var Webhook $webhook */ + foreach ($set as $webhook) { + $this->upgradeWebhook($webhook); + } + } + + private function upgradeWebhook(Webhook $webhook): void + { + $delivery = WebhookDelivery::tryFrom((int)$webhook->delivery); + $response = WebhookResponse::tryFrom((int)$webhook->response); + $trigger = WebhookTrigger::tryFrom((int)$webhook->trigger); + if (null === $delivery || null === $response || null === $trigger) { + $this->friendlyError(sprintf('[a] Webhook #%d has an invalid delivery, response or trigger value. Will not upgrade.', $webhook->id)); + return; + } + $deliveryModel = WebhookDeliveryModel::where('key', $delivery->value)->first(); + $responseModel = WebhookResponseModel::where('key', $response->value)->first(); + $triggerModel = WebhookTriggerModel::where('key', $trigger->value)->first(); + if (null === $deliveryModel || null === $responseModel || null === $triggerModel) { + $this->friendlyError(sprintf('[b] Webhook #%d has an invalid delivery, response or trigger model. Will not upgrade.', $webhook->id)); + return; + } + $webhook->webhookDeliveries()->attach([$deliveryModel->id]); + $webhook->webhookResponses()->attach([$responseModel->id]); + $webhook->webhookTriggers()->attach([$triggerModel->id]); + $webhook->delivery = 1; + $webhook->response = 1; + $webhook->trigger = 1; + $webhook->save(); + $this->friendlyPositive(sprintf('Webhook #%d upgraded.', $webhook->id)); + } + private function markAsExecuted(): void + { + app('fireflyconfig')->set(self::CONFIG_NAME, true); + } +} diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index b829724308..6142cf7701 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -31,6 +31,10 @@ use FireflyIII\Events\RequestedVersionCheckStatus; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Http\Middleware\Installer; +use FireflyIII\Models\Webhook; +use FireflyIII\Models\WebhookDelivery; +use FireflyIII\Models\WebhookResponse; +use FireflyIII\Models\WebhookTrigger; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\User; @@ -121,6 +125,27 @@ class HomeController extends Controller */ public function index(AccountRepositoryInterface $repository): mixed { + $trigger = WebhookTrigger::first(); + $delivery = WebhookDelivery::first(); + $response = WebhookResponse::first(); + + $webhook = new Webhook(); + $webhook->user_id = auth()->id(); + $webhook->user_group_id = auth()->user()->user_group_id; + $webhook->title = 'Test Webhook'; + $webhook->url = 'https://example.com/webhook'; + $webhook->active = true; + $webhook->secret = 'abc'; + $webhook->trigger = 1; + $webhook->response = 1; + $webhook->delivery = 1; + $webhook->save(); + $webhook->webhookDeliveries()->saveMany(new Collection()->push($delivery)); + $webhook->webhookResponses()->saveMany(new Collection()->push($response)); + $webhook->webhookTriggers()->saveMany(new Collection()->push($trigger)); + + + $types = config('firefly.accountTypesByIdentifier.asset'); $count = $repository->count($types); Log::channel('audit')->info('User visits homepage.'); diff --git a/app/Models/Webhook.php b/app/Models/Webhook.php index 7932894770..a939084257 100644 --- a/app/Models/Webhook.php +++ b/app/Models/Webhook.php @@ -24,14 +24,15 @@ declare(strict_types=1); namespace FireflyIII\Models; -use FireflyIII\Enums\WebhookDelivery; -use FireflyIII\Enums\WebhookResponse; -use FireflyIII\Enums\WebhookTrigger; +use FireflyIII\Enums\WebhookDelivery as WebhookDeliveryEnum; +use FireflyIII\Enums\WebhookResponse as WebhookResponseEnum; +use FireflyIII\Enums\WebhookTrigger as WebhookTriggerEnum; use FireflyIII\Support\Models\ReturnsIntegerIdTrait; use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait; use FireflyIII\User; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -56,7 +57,7 @@ class Webhook extends Model public static function getDeliveries(): array { $array = []; - $set = WebhookDelivery::cases(); + $set = WebhookDeliveryEnum::cases(); foreach ($set as $item) { $array[$item->value] = $item->name; } @@ -67,7 +68,7 @@ class Webhook extends Model public static function getDeliveriesForValidation(): array { $array = []; - $set = WebhookDelivery::cases(); + $set = WebhookDeliveryEnum::cases(); foreach ($set as $item) { $array[$item->name] = $item->value; $array[$item->value] = $item->value; @@ -79,7 +80,7 @@ class Webhook extends Model public static function getResponses(): array { $array = []; - $set = WebhookResponse::cases(); + $set = WebhookResponseEnum::cases(); foreach ($set as $item) { $array[$item->value] = $item->name; } @@ -90,7 +91,7 @@ class Webhook extends Model public static function getResponsesForValidation(): array { $array = []; - $set = WebhookResponse::cases(); + $set = WebhookResponseEnum::cases(); foreach ($set as $item) { $array[$item->name] = $item->value; $array[$item->value] = $item->value; @@ -102,7 +103,7 @@ class Webhook extends Model public static function getTriggers(): array { $array = []; - $set = WebhookTrigger::cases(); + $set = WebhookTriggerEnum::cases(); foreach ($set as $item) { $array[$item->value] = $item->name; } @@ -113,7 +114,7 @@ class Webhook extends Model public static function getTriggersForValidation(): array { $array = []; - $set = WebhookTrigger::cases(); + $set = WebhookTriggerEnum::cases(); foreach ($set as $item) { $array[$item->name] = $item->value; $array[$item->value] = $item->value; @@ -130,13 +131,13 @@ class Webhook extends Model public static function routeBinder(string $value): self { if (auth()->check()) { - $webhookId = (int) $value; + $webhookId = (int)$value; /** @var User $user */ - $user = auth()->user(); + $user = auth()->user(); /** @var null|Webhook $webhook */ - $webhook = $user->webhooks()->find($webhookId); + $webhook = $user->webhooks()->find($webhookId); if (null !== $webhook) { return $webhook; } @@ -155,6 +156,21 @@ class Webhook extends Model return $this->hasMany(WebhookMessage::class); } + public function webhookDeliveries(): BelongsToMany + { + return $this->belongsToMany(WebhookDelivery::class); + } + + public function webhookResponses(): BelongsToMany + { + return $this->belongsToMany(WebhookResponse::class); + } + + public function webhookTriggers(): BelongsToMany + { + return $this->belongsToMany(WebhookTrigger::class); + } + protected function casts(): array { return [ diff --git a/app/Models/WebhookDelivery.php b/app/Models/WebhookDelivery.php new file mode 100644 index 0000000000..5538cf427d --- /dev/null +++ b/app/Models/WebhookDelivery.php @@ -0,0 +1,26 @@ + (int) $value, + ); + } +} diff --git a/app/Models/WebhookResponse.php b/app/Models/WebhookResponse.php new file mode 100644 index 0000000000..a651805f59 --- /dev/null +++ b/app/Models/WebhookResponse.php @@ -0,0 +1,26 @@ + (int) $value, + ); + } +} diff --git a/app/Models/WebhookTrigger.php b/app/Models/WebhookTrigger.php new file mode 100644 index 0000000000..fd8036face --- /dev/null +++ b/app/Models/WebhookTrigger.php @@ -0,0 +1,26 @@ + (int) $value, + ); + } +} diff --git a/app/Repositories/Webhook/WebhookRepository.php b/app/Repositories/Webhook/WebhookRepository.php index 6d684b8984..64f6230ac3 100644 --- a/app/Repositories/Webhook/WebhookRepository.php +++ b/app/Repositories/Webhook/WebhookRepository.php @@ -41,7 +41,12 @@ class WebhookRepository implements WebhookRepositoryInterface, UserGroupInterfac public function all(): Collection { - return $this->user->webhooks()->get(); + return $this->user->webhooks() + // only get upgraded webhooks + ->where('delivery', 1) + ->where('response', 1) + ->where('trigger', 1) + ->get(); } public function destroy(Webhook $webhook): void @@ -67,22 +72,20 @@ class WebhookRepository implements WebhookRepositoryInterface, UserGroupInterfac public function getMessages(Webhook $webhook): Collection { return $webhook->webhookMessages() - ->orderBy('created_at', 'DESC') - ->get(['webhook_messages.*']) - ; + ->orderBy('created_at', 'DESC') + ->get(['webhook_messages.*']); } public function getReadyMessages(Webhook $webhook): Collection { return $webhook->webhookMessages() - ->where('webhook_messages.sent', 0) - ->where('webhook_messages.errored', 0) - ->get(['webhook_messages.*']) - ->filter( - static fn (WebhookMessage $message) // @phpstan-ignore-line - => $message->webhookAttempts()->count() <= 2 - )->splice(0, 3) - ; + ->where('webhook_messages.sent', 0) + ->where('webhook_messages.errored', 0) + ->get(['webhook_messages.*']) + ->filter( + static fn(WebhookMessage $message) // @phpstan-ignore-line + => $message->webhookAttempts()->count() <= 2 + )->splice(0, 3); } public function store(array $data): Webhook @@ -93,9 +96,12 @@ class WebhookRepository implements WebhookRepositoryInterface, UserGroupInterfac 'user_group_id' => $this->user->user_group_id, 'active' => $data['active'] ?? false, 'title' => $data['title'] ?? null, - 'trigger' => $data['trigger'], - 'response' => $data['response'], - 'delivery' => $data['delivery'], + // 'trigger' => $data['trigger'], + // 'response' => $data['response'], + // 'delivery' => $data['delivery'], + 'trigger' => 1, + 'response' => 1, + 'delivery' => 1, 'secret' => $secret, 'url' => $data['url'], ]; @@ -105,12 +111,12 @@ class WebhookRepository implements WebhookRepositoryInterface, UserGroupInterfac public function update(Webhook $webhook, array $data): Webhook { - $webhook->active = $data['active'] ?? $webhook->active; - $webhook->trigger = $data['trigger'] ?? $webhook->trigger; - $webhook->response = $data['response'] ?? $webhook->response; - $webhook->delivery = $data['delivery'] ?? $webhook->delivery; - $webhook->title = $data['title'] ?? $webhook->title; - $webhook->url = $data['url'] ?? $webhook->url; + $webhook->active = $data['active'] ?? $webhook->active; +// $webhook->trigger = $data['trigger'] ?? $webhook->trigger; +// $webhook->response = $data['response'] ?? $webhook->response; +// $webhook->delivery = $data['delivery'] ?? $webhook->delivery; + $webhook->title = $data['title'] ?? $webhook->title; + $webhook->url = $data['url'] ?? $webhook->url; if (true === $data['secret']) { $secret = Str::random(24); diff --git a/app/Support/JsonApi/Enrichments/WebhookEnrichment.php b/app/Support/JsonApi/Enrichments/WebhookEnrichment.php new file mode 100644 index 0000000000..acbc315c28 --- /dev/null +++ b/app/Support/JsonApi/Enrichments/WebhookEnrichment.php @@ -0,0 +1,134 @@ +collection = $collection; + if ($this->collection->count() > 0) { + $this->collectIds(); + $this->collectInfo(); + $this->collectWebhookInfo(); + $this->appendCollectedInfo(); + } + return $this->collection; + } + + public function enrichSingle(Model|array $model): array|Model + { + Log::debug(__METHOD__); + $collection = new Collection([$model]); + $collection = $this->enrich($collection); + + return $collection->first(); + } + + public function setUser(User $user): void + { + $this->user = $user; + } + + public function setUserGroup(UserGroup $userGroup): void + { + $this->userGroup = $userGroup; + } + + private function collectIds(): void + { + /** @var Webhook $webhook */ + foreach ($this->collection as $webhook) { + $this->ids[] = $webhook->id; + } + $this->ids = array_unique($this->ids); + } + + private function collectInfo(): void + { + $all = WebhookDelivery::get(); + /** @var WebhookDelivery $item */ + foreach ($all as $item) { + $this->deliveries[$item->id] = $item->key; + } + $all = WebhookResponse::get(); + /** @var WebhookResponse $item */ + foreach ($all as $item) { + $this->responses[$item->id] = $item->key; + } + $all = WebhookTrigger::get(); + /** @var WebhookTrigger $item */ + foreach ($all as $item) { + $this->triggers[$item->id] = $item->key; + } + + } + + private function collectWebhookInfo(): void + { + $set = DB::table('webhook_webhook_delivery')->whereIn('webhook_id', $this->ids)->get(['webhook_id', 'webhook_delivery_id']); + /** @var \stdClass $item */ + foreach ($set as $item) { + $id = $item->webhook_id; + $deliveryId = $item->webhook_delivery_id; + $this->webhookDeliveries[$id][] = WebhookDeliveryEnum::from($this->deliveries[$deliveryId])->name; + } + + $set = DB::table('webhook_webhook_response')->whereIn('webhook_id', $this->ids)->get(['webhook_id', 'webhook_response_id']); + /** @var \stdClass $item */ + foreach ($set as $item) { + $id = $item->webhook_id; + $responseId = $item->webhook_response_id; + $this->webhookResponses[$id][] = WebhookResponseEnum::from($this->responses[$responseId])->name; + } + + $set = DB::table('webhook_webhook_trigger')->whereIn('webhook_id', $this->ids)->get(['webhook_id', 'webhook_trigger_id']); + /** @var \stdClass $item */ + foreach ($set as $item) { + $id = $item->webhook_id; + $triggerId = $item->webhook_trigger_id; + $this->webhookTriggers[$id][] = WebhookTriggerEnum::from($this->triggers[$triggerId])->name; + } + } + + private function appendCollectedInfo(): void + { + $this->collection = $this->collection->map(function (Webhook $item) { + $meta = [ + 'deliveries' => $this->webhookDeliveries[$item->id] ?? [], + 'responses' => $this->webhookResponses[$item->id] ?? [], + 'triggers' => $this->webhookTriggers[$item->id] ?? [], + ]; + $item->meta = $meta; + return $item; + }); + } + +} diff --git a/app/Transformers/WebhookTransformer.php b/app/Transformers/WebhookTransformer.php index d913b38f3d..5404982f34 100644 --- a/app/Transformers/WebhookTransformer.php +++ b/app/Transformers/WebhookTransformer.php @@ -51,9 +51,12 @@ class WebhookTransformer extends AbstractTransformer 'active' => $webhook->active, 'title' => $webhook->title, 'secret' => $webhook->secret, - 'trigger' => $this->getEnum('trigger', $webhook->trigger), - 'response' => $this->getEnum('response', $webhook->response), - 'delivery' => $this->getEnum('delivery', $webhook->delivery), + 'triggers' => $webhook->meta['triggers'], + 'deliveries' => $webhook->meta['deliveries'], + 'responses' => $webhook->meta['responses'], +// 'trigger' => $this->getEnum('trigger', $webhook->trigger), +// 'response' => $this->getEnum('response', $webhook->response), +// 'delivery' => $this->getEnum('delivery', $webhook->delivery), 'url' => $webhook->url, 'links' => [ [ diff --git a/database/migrations/2025_08_19_180459_create_webhook_details_tables.php b/database/migrations/2025_08_19_180459_create_webhook_details_tables.php new file mode 100644 index 0000000000..c25d4083eb --- /dev/null +++ b/database/migrations/2025_08_19_180459_create_webhook_details_tables.php @@ -0,0 +1,127 @@ +id(); + $table->timestamps(); + $table->smallInteger('key')->unsigned(); + $table->string('title', 100); + $table->unique(['key', 'title']); + }); + } + if (!Schema::hasTable('webhook_responses')) { + Schema::create('webhook_responses', function (Blueprint $table) { + $table->id(); + $table->timestamps(); + $table->smallInteger('key')->unsigned(); + $table->string('title', 100); + $table->unique(['key', 'title']); + }); + } + if (!Schema::hasTable('webhook_deliveries')) { + Schema::create('webhook_deliveries', function (Blueprint $table) { + $table->id(); + $table->timestamps(); + $table->smallInteger('key')->unsigned(); + $table->string('title', 100); + $table->unique(['key', 'title']); + }); + } + + // webhook_webhook_trigger + if (!Schema::hasTable('webhook_webhook_trigger')) { + try { + Schema::create( + 'webhook_webhook_trigger', + static function (Blueprint $table): void { + $table->increments('id'); + $table->integer('webhook_id', false, true); + $table->bigInteger('webhook_trigger_id', false, true); + $table->foreign('webhook_id')->references('id')->on('webhooks')->onDelete('cascade'); + $table->foreign('webhook_trigger_id','link_to_trigger')->references('id')->on('webhook_triggers')->onDelete('cascade'); + + // unique combi: + $table->unique(['webhook_id', 'webhook_trigger_id']); + } + ); + } catch (QueryException $e) { + app('log')->error(sprintf(self::TABLE_ERROR, 'webhook_webhook_trigger', $e->getMessage())); + app('log')->error(self::TABLE_ALREADY_EXISTS); + } + } + + + // webhook_webhook_response + if (!Schema::hasTable('webhook_webhook_response')) { + try { + Schema::create( + 'webhook_webhook_response', + static function (Blueprint $table): void { + $table->increments('id'); + $table->integer('webhook_id', false, true); + $table->bigInteger('webhook_response_id', false, true); + $table->foreign('webhook_id')->references('id')->on('webhooks')->onDelete('cascade'); + $table->foreign('webhook_response_id','link_to_response')->references('id')->on('webhook_responses')->onDelete('cascade'); + + // unique combi: + $table->unique(['webhook_id', 'webhook_response_id']); + } + ); + } catch (QueryException $e) { + app('log')->error(sprintf(self::TABLE_ERROR, 'webhook_webhook_response', $e->getMessage())); + app('log')->error(self::TABLE_ALREADY_EXISTS); + } + } + + // webhook_webhook_delivery + if (!Schema::hasTable('webhook_webhook_delivery')) { + try { + Schema::create( + 'webhook_webhook_delivery', + static function (Blueprint $table): void { + $table->increments('id'); + $table->integer('webhook_id', false, true); + $table->bigInteger('webhook_delivery_id', false, true); + $table->foreign('webhook_id')->references('id')->on('webhooks')->onDelete('cascade'); + $table->foreign('webhook_delivery_id','link_to_delivery')->references('id')->on('webhook_deliveries')->onDelete('cascade'); + + // unique combi: + $table->unique(['webhook_id', 'webhook_delivery_id']); + } + ); + } catch (QueryException $e) { + app('log')->error(sprintf(self::TABLE_ERROR, 'webhook_webhook_delivery', $e->getMessage())); + app('log')->error(self::TABLE_ALREADY_EXISTS); + } + } + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('webhook_webhook_delivery'); + Schema::dropIfExists('webhook_webhook_trigger'); + Schema::dropIfExists('webhook_webhook_response'); + + Schema::dropIfExists('webhook_triggers'); + Schema::dropIfExists('webhook_responses'); + Schema::dropIfExists('webhook_deliveries'); + } +}; diff --git a/database/seeders/AccountTypeSeeder.php b/database/seeders/AccountTypeSeeder.php index 0b9dda0723..ab34b8b772 100644 --- a/database/seeders/AccountTypeSeeder.php +++ b/database/seeders/AccountTypeSeeder.php @@ -35,25 +35,10 @@ class AccountTypeSeeder extends Seeder { public function run(): void { - $types = [ - AccountTypeEnum::DEFAULT->value, - AccountTypeEnum::CASH->value, - AccountTypeEnum::ASSET->value, - AccountTypeEnum::EXPENSE->value, - AccountTypeEnum::REVENUE->value, - AccountTypeEnum::INITIAL_BALANCE->value, - AccountTypeEnum::BENEFICIARY->value, - AccountTypeEnum::IMPORT->value, - AccountTypeEnum::LOAN->value, - AccountTypeEnum::RECONCILIATION->value, - AccountTypeEnum::DEBT->value, - AccountTypeEnum::MORTGAGE->value, - AccountTypeEnum::LIABILITY_CREDIT->value, - ]; - foreach ($types as $type) { - if (null === AccountType::where('type', $type)->first()) { + foreach(AccountTypeEnum::cases() as $type) { + if (null === AccountType::where('type', $type->value)->first()) { try { - AccountType::create(['type' => $type]); + AccountType::create(['type' => $type->value]); } catch (PDOException $e) { // @ignoreException } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index bdce19f553..42305fd851 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -43,5 +43,6 @@ class DatabaseSeeder extends Seeder $this->call(ConfigSeeder::class); $this->call(UserRoleSeeder::class); $this->call(ExchangeRateSeeder::class); + $this->call(WebhookDataSeeder::class); } } diff --git a/database/seeders/TransactionTypeSeeder.php b/database/seeders/TransactionTypeSeeder.php index 2a7d813164..b4ed1c1ef3 100644 --- a/database/seeders/TransactionTypeSeeder.php +++ b/database/seeders/TransactionTypeSeeder.php @@ -35,24 +35,17 @@ class TransactionTypeSeeder extends Seeder { public function run(): void { - $types = [ - TransactionTypeEnum::WITHDRAWAL->value, - TransactionTypeEnum::DEPOSIT->value, - TransactionTypeEnum::TRANSFER->value, - TransactionTypeEnum::OPENING_BALANCE->value, - TransactionTypeEnum::RECONCILIATION->value, - TransactionTypeEnum::INVALID->value, - TransactionTypeEnum::LIABILITY_CREDIT->value, - ]; - - foreach ($types as $type) { - if (null === TransactionType::where('type', $type)->first()) { + /** @var TransactionTypeEnum $type */ + foreach (TransactionTypeEnum::cases() as $type) { + if (null === TransactionType::where('type', $type->value)->first()) { try { - TransactionType::create(['type' => $type]); + TransactionType::create(['type' => $type->value]); } catch (PDOException $e) { // @ignoreException } } } + + } } diff --git a/database/seeders/UserRoleSeeder.php b/database/seeders/UserRoleSeeder.php index c779b91812..e9f1a08515 100644 --- a/database/seeders/UserRoleSeeder.php +++ b/database/seeders/UserRoleSeeder.php @@ -39,16 +39,11 @@ class UserRoleSeeder extends Seeder */ public function run(): void { - $roles = []; + /** @var UserRoleEnum $role */ foreach (UserRoleEnum::cases() as $role) { - $roles[] = $role->value; - } - - /** @var string $role */ - foreach ($roles as $role) { - if (null === UserRole::where('title', $role)->first()) { + if (null === UserRole::where('title', $role->value)->first()) { try { - UserRole::create(['title' => $role]); + UserRole::create(['title' => $role->value]); } catch (PDOException $e) { // @ignoreException } diff --git a/database/seeders/WebhookDataSeeder.php b/database/seeders/WebhookDataSeeder.php new file mode 100644 index 0000000000..75b46820a7 --- /dev/null +++ b/database/seeders/WebhookDataSeeder.php @@ -0,0 +1,48 @@ +value)->where('title', $trigger->name)->first()) { + try { + WebhookTriggerModel::create(['key' => $trigger->value, 'title' => $trigger->name]); + } catch (\PDOException $e) { + // @ignoreException + } + } + } + foreach (WebhookResponse::cases() as $response) { + if (null === WebhookResponseModel::where('key', $response->value)->where('title', $response->name)->first()) { + try { + WebhookResponseModel::create(['key' => $response->value, 'title' => $response->name]); + } catch (\PDOException $e) { + // @ignoreException + } + } + } + foreach (WebhookDelivery::cases() as $delivery) { + if (null === WebhookDeliveryModel::where('key', $delivery->value)->where('title', $delivery->name)->first()) { + try { + WebhookDeliveryModel::create(['key' => $delivery->value, 'title' => $delivery->name]); + } catch (\PDOException $e) { + // @ignoreException + } + } + } + } +}