From a539cfe4f2ccbd5b4999ad99171bd4b12750ed56 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 3 Dec 2020 06:54:42 +0100 Subject: [PATCH] Webhooks have titles now. --- .../Controllers/Webhook/CreateController.php | 2 -- .../V1/Controllers/Webhook/EditController.php | 2 -- app/Api/V1/Requests/Webhook/CreateRequest.php | 15 +++++++-------- app/Api/V1/Requests/Webhook/UpdateRequest.php | 17 ++++++++--------- .../Webhook/WebhookMessageGenerator.php | 2 +- .../Events/UpdatedGroupEventHandler.php | 18 +++++++++++++++++- app/Handlers/Events/WebhookEventHandler.php | 3 ++- app/Models/WebhookMessage.php | 4 ++++ app/Repositories/Webhook/WebhookRepository.php | 3 ++- app/Transformers/WebhookTransformer.php | 1 + .../2020_11_12_070604_changes_for_v550.php | 14 ++++++++------ 11 files changed, 50 insertions(+), 31 deletions(-) diff --git a/app/Api/V1/Controllers/Webhook/CreateController.php b/app/Api/V1/Controllers/Webhook/CreateController.php index 293fc9f8b8..d6413563fc 100644 --- a/app/Api/V1/Controllers/Webhook/CreateController.php +++ b/app/Api/V1/Controllers/Webhook/CreateController.php @@ -66,8 +66,6 @@ class CreateController extends Controller { $data = $request->getData(); $webhook = $this->repository->store($data); - - $manager = $this->getManager(); /** @var WebhookTransformer $transformer */ $transformer = app(WebhookTransformer::class); diff --git a/app/Api/V1/Controllers/Webhook/EditController.php b/app/Api/V1/Controllers/Webhook/EditController.php index 611bd8b3ac..1347bea3a8 100644 --- a/app/Api/V1/Controllers/Webhook/EditController.php +++ b/app/Api/V1/Controllers/Webhook/EditController.php @@ -68,8 +68,6 @@ class EditController extends Controller { $data = $request->getData(); $webhook = $this->repository->update($webhook, $data); - - $manager = $this->getManager(); /** @var WebhookTransformer $transformer */ $transformer = app(WebhookTransformer::class); diff --git a/app/Api/V1/Requests/Webhook/CreateRequest.php b/app/Api/V1/Requests/Webhook/CreateRequest.php index 4f9ff745ce..5699b7626a 100644 --- a/app/Api/V1/Requests/Webhook/CreateRequest.php +++ b/app/Api/V1/Requests/Webhook/CreateRequest.php @@ -43,6 +43,7 @@ class CreateRequest extends FormRequest $deliveries = array_flip(config('firefly.webhooks.deliveries')); $fields = [ + 'title' => ['title', 'string'], 'active' => ['active', 'boolean'], 'trigger' => ['trigger', 'string'], 'response' => ['response', 'string'], @@ -51,15 +52,12 @@ class CreateRequest extends FormRequest ]; // this is the way. - $return = $this->getAllData($fields); + $return = $this->getAllData($fields); + $return['trigger'] = $triggers[$return['trigger']] ?? 0; + $return['response'] = $responses[$return['response']] ?? 0; + $return['delivery'] = $deliveries[$return['delivery']] ?? 0; - return [ - 'active' => $return['active'], - 'trigger' => $triggers[$return['trigger']] ?? 0, - 'response' => $responses[$return['response']] ?? 0, - 'delivery' => $deliveries[$return['delivery']] ?? 0, - 'url' => $return['url'], - ]; + return $return; } /** @@ -74,6 +72,7 @@ class CreateRequest extends FormRequest $deliveries = implode(',', array_values(config('firefly.webhooks.deliveries'))); return [ + 'title' => 'between:1,512', 'active' => [new IsBoolean], 'trigger' => sprintf('required|in:%s', $triggers), 'response' => sprintf('required|in:%s', $responses), diff --git a/app/Api/V1/Requests/Webhook/UpdateRequest.php b/app/Api/V1/Requests/Webhook/UpdateRequest.php index 039d7d6074..280a0da031 100644 --- a/app/Api/V1/Requests/Webhook/UpdateRequest.php +++ b/app/Api/V1/Requests/Webhook/UpdateRequest.php @@ -43,6 +43,7 @@ class UpdateRequest extends FormRequest $deliveries = array_flip(config('firefly.webhooks.deliveries')); $fields = [ + 'title' => ['title', 'string'], 'active' => ['active', 'boolean'], 'trigger' => ['trigger', 'string'], 'response' => ['response', 'string'], @@ -51,15 +52,12 @@ class UpdateRequest extends FormRequest ]; // this is the way. - $return = $this->getAllData($fields); + $return = $this->getAllData($fields); + $return['trigger'] = $triggers[$return['trigger']] ?? 0; + $return['response'] = $responses[$return['response']] ?? 0; + $return['delivery'] = $deliveries[$return['delivery']] ?? 0; - return [ - 'active' => $return['active'], - 'trigger' => $triggers[$return['trigger']] ?? 0, - 'response' => $responses[$return['response']] ?? 0, - 'delivery' => $deliveries[$return['delivery']] ?? 0, - 'url' => $return['url'], - ]; + return $return; } /** @@ -72,9 +70,10 @@ class UpdateRequest extends FormRequest $triggers = implode(',', array_values(config('firefly.webhooks.triggers'))); $responses = implode(',', array_values(config('firefly.webhooks.responses'))); $deliveries = implode(',', array_values(config('firefly.webhooks.deliveries'))); - $webhook = $this->route()->parameter('webhook'); + $webhook = $this->route()->parameter('webhook'); return [ + 'title' => 'between:1,512', 'active' => [new IsBoolean], 'trigger' => sprintf('required|in:%s', $triggers), 'response' => sprintf('required|in:%s', $responses), diff --git a/app/Generator/Webhook/WebhookMessageGenerator.php b/app/Generator/Webhook/WebhookMessageGenerator.php index 1f91fb64d7..e35eedc0a4 100644 --- a/app/Generator/Webhook/WebhookMessageGenerator.php +++ b/app/Generator/Webhook/WebhookMessageGenerator.php @@ -86,7 +86,7 @@ class WebhookMessageGenerator */ private function getWebhooks(): Collection { - return $this->user->webhooks()->where('trigger', $this->trigger)->get(['webhooks.*']); + return $this->user->webhooks()->where('active', 1)->where('trigger', $this->trigger)->get(['webhooks.*']); } private function run(): void diff --git a/app/Handlers/Events/UpdatedGroupEventHandler.php b/app/Handlers/Events/UpdatedGroupEventHandler.php index 4d13bc672c..4201ae25c7 100644 --- a/app/Handlers/Events/UpdatedGroupEventHandler.php +++ b/app/Handlers/Events/UpdatedGroupEventHandler.php @@ -23,13 +23,15 @@ declare(strict_types=1); namespace FireflyIII\Handlers\Events; use FireflyIII\Events\UpdatedTransactionGroup; +use FireflyIII\Generator\Webhook\WebhookMessageGenerator; use FireflyIII\Models\Account; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; +use FireflyIII\Models\Webhook; use FireflyIII\Repositories\Rule\RuleRepositoryInterface; -use FireflyIII\TransactionRules\Engine\RuleEngine; use FireflyIII\TransactionRules\Engine\RuleEngineInterface; +use Illuminate\Support\Collection; use Log; /** @@ -112,4 +114,18 @@ class UpdatedGroupEventHandler $newRuleEngine->fire(); } + /** + * @param UpdatedTransactionGroup $updatedGroupEvent + */ + public function triggerWebhooks(UpdatedTransactionGroup $updatedGroupEvent): void + { + Log::debug('UpdatedGroupEventHandler:triggerWebhooks'); + $group = $updatedGroupEvent->transactionGroup; + $user = $group->user; + $engine = new WebhookMessageGenerator; + $engine->setUser($user); + $engine->setTransactionGroups(new Collection([$group])); + $engine->setTrigger(Webhook::TRIGGER_UPDATE_TRANSACTION); + $engine->generateMessages(); + } } diff --git a/app/Handlers/Events/WebhookEventHandler.php b/app/Handlers/Events/WebhookEventHandler.php index 699c875346..e3ac77f257 100644 --- a/app/Handlers/Events/WebhookEventHandler.php +++ b/app/Handlers/Events/WebhookEventHandler.php @@ -92,7 +92,7 @@ class WebhookEventHandler $client = new Client; $logs = $message->logs ?? []; try { - $res = $client->request('GET', $message->webhook->url, $options); + $res = $client->request('POST', $message->webhook->url, $options); $message->sent = true; } catch (ClientException|Exception $e) { Log::error($e->getMessage()); @@ -106,6 +106,7 @@ class WebhookEventHandler $message->save(); Log::debug(sprintf('Webhook message #%d was sent. Status code %d', $message->id, $res->getStatusCode())); + Log::debug(sprintf('Webhook request body size: %d bytes', strlen($json))); Log::debug(sprintf('Response body: %s', $res->getBody())); } diff --git a/app/Models/WebhookMessage.php b/app/Models/WebhookMessage.php index a1113f2bfb..be501b2e53 100644 --- a/app/Models/WebhookMessage.php +++ b/app/Models/WebhookMessage.php @@ -51,6 +51,10 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * @method static \Illuminate\Database\Eloquent\Builder|WebhookMessage whereUuid($value) * @method static \Illuminate\Database\Eloquent\Builder|WebhookMessage whereWebhookId($value) * @mixin \Eloquent + * @property int $attempts + * @property array|null $logs + * @method static \Illuminate\Database\Eloquent\Builder|WebhookMessage whereAttempts($value) + * @method static \Illuminate\Database\Eloquent\Builder|WebhookMessage whereLogs($value) */ class WebhookMessage extends Model { diff --git a/app/Repositories/Webhook/WebhookRepository.php b/app/Repositories/Webhook/WebhookRepository.php index aa2272796b..555e8f1c38 100644 --- a/app/Repositories/Webhook/WebhookRepository.php +++ b/app/Repositories/Webhook/WebhookRepository.php @@ -55,7 +55,8 @@ class WebhookRepository implements WebhookRepositoryInterface { $fullData = [ 'user_id' => $this->user->id, - 'active' => $data['active'], + 'active' => $data['active'] ?? false, + 'title' => $data['title'] ?? null, 'trigger' => $data['trigger'], 'response' => $data['response'], 'delivery' => $data['delivery'], diff --git a/app/Transformers/WebhookTransformer.php b/app/Transformers/WebhookTransformer.php index 6a9ebfe07b..8626f85d85 100644 --- a/app/Transformers/WebhookTransformer.php +++ b/app/Transformers/WebhookTransformer.php @@ -53,6 +53,7 @@ class WebhookTransformer extends AbstractTransformer 'created_at' => $webhook->created_at->toAtomString(), 'updated_at' => $webhook->updated_at->toAtomString(), 'active' => $webhook->active, + 'title' => $webhook->title, 'trigger' => $this->getEnum($webhook->trigger), 'response' => $this->getEnum($webhook->response), 'delivery' => $this->getEnum($webhook->delivery), diff --git a/database/migrations/2020_11_12_070604_changes_for_v550.php b/database/migrations/2020_11_12_070604_changes_for_v550.php index 4746cbb740..12905abc62 100644 --- a/database/migrations/2020_11_12_070604_changes_for_v550.php +++ b/database/migrations/2020_11_12_070604_changes_for_v550.php @@ -96,7 +96,7 @@ class ChangesForV550 extends Migration Schema::table( 'budget_transaction_journal', function (Blueprint $table) { $table->integer('budget_limit_id', false, true)->nullable()->default(null)->after('budget_id'); - $table->foreign('budget_limit_id','budget_id_foreign')->references('id')->on('budget_limits')->onDelete('set null'); + $table->foreign('budget_limit_id', 'budget_id_foreign')->references('id')->on('budget_limits')->onDelete('set null'); } ); @@ -118,13 +118,15 @@ class ChangesForV550 extends Migration $table->timestamps(); $table->softDeletes(); $table->integer('user_id', false, true); + $table->string('title', 512)->index(); $table->boolean('active')->default(true); - $table->unsignedSmallInteger('trigger',false); + $table->unsignedSmallInteger('trigger', false); $table->unsignedSmallInteger('response', false); - $table->unsignedSmallInteger('delivery',false); - $table->string('url',512)->index(); + $table->unsignedSmallInteger('delivery', false); + $table->string('url', 512)->index(); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); - $table->unique(['user_id','trigger','response','delivery','url']); + $table->unique(['user_id', 'trigger', 'response', 'delivery', 'url']); + $table->unique(['user_id', 'title']); } ); @@ -139,7 +141,7 @@ class ChangesForV550 extends Migration $table->boolean('sent')->default(false); $table->boolean('errored')->default(false); $table->unsignedTinyInteger('attempts')->default(0); - $table->string('uuid',64); + $table->string('uuid', 64); $table->longText('message'); $table->longText('logs')->nullable(); $table->foreign('webhook_id')->references('id')->on('webhooks')->onDelete('cascade');