Fix some final webhook code.

This commit is contained in:
James Cole
2021-01-15 21:01:53 +01:00
parent b4f929b325
commit 99f8ed7760
13 changed files with 37 additions and 25 deletions

View File

@@ -73,7 +73,7 @@ class CreateRequest extends FormRequest
$deliveries = implode(',', array_values(config('firefly.webhooks.deliveries'))); $deliveries = implode(',', array_values(config('firefly.webhooks.deliveries')));
return [ return [
'title' => 'between:1,512', 'title' => 'required|between:1,512|uniqueObjectForUser:webhooks,title',
'active' => [new IsBoolean], 'active' => [new IsBoolean],
'trigger' => sprintf('required|in:%s', $triggers), 'trigger' => sprintf('required|in:%s', $triggers),
'response' => sprintf('required|in:%s', $responses), 'response' => sprintf('required|in:%s', $responses),

View File

@@ -57,6 +57,7 @@ class UpdateRequest extends FormRequest
$return['trigger'] = $triggers[$return['trigger']] ?? 0; $return['trigger'] = $triggers[$return['trigger']] ?? 0;
$return['response'] = $responses[$return['response']] ?? 0; $return['response'] = $responses[$return['response']] ?? 0;
$return['delivery'] = $deliveries[$return['delivery']] ?? 0; $return['delivery'] = $deliveries[$return['delivery']] ?? 0;
$return['secret'] = null !== $this->get('secret');
return $return; return $return;
} }
@@ -74,7 +75,7 @@ class UpdateRequest extends FormRequest
$webhook = $this->route()->parameter('webhook'); $webhook = $this->route()->parameter('webhook');
return [ return [
'title' => 'between:1,512', 'title' => sprintf('between:1,512|uniqueObjectForUser:webhooks,title,%d', $webhook->id),
'active' => [new IsBoolean], 'active' => [new IsBoolean],
'trigger' => sprintf('required|in:%s', $triggers), 'trigger' => sprintf('required|in:%s', $triggers),
'response' => sprintf('required|in:%s', $responses), 'response' => sprintf('required|in:%s', $responses),

View File

@@ -53,6 +53,7 @@ class StandardMessageGenerator implements MessageGeneratorInterface
*/ */
public function generateMessages(): void public function generateMessages(): void
{ {
Log::debug(__METHOD__);
// get the webhooks: // get the webhooks:
$this->webhooks = $this->getWebhooks(); $this->webhooks = $this->getWebhooks();
@@ -105,6 +106,7 @@ class StandardMessageGenerator implements MessageGeneratorInterface
foreach ($this->webhooks as $webhook) { foreach ($this->webhooks as $webhook) {
$this->runWebhook($webhook); $this->runWebhook($webhook);
} }
Log::debug('Done with StandardMessageGenerator::run');
} }
/** /**

View File

@@ -86,7 +86,7 @@ class StoredGroupEventHandler
*/ */
public function triggerWebhooks(StoredTransactionGroup $storedGroupEvent): void public function triggerWebhooks(StoredTransactionGroup $storedGroupEvent): void
{ {
Log::debug('StoredTransactionGroup:triggerWebhooks'); Log::debug(__METHOD__);
$group = $storedGroupEvent->transactionGroup; $group = $storedGroupEvent->transactionGroup;
$user = $group->user; $user = $group->user;
/** @var MessageGeneratorInterface $engine */ /** @var MessageGeneratorInterface $engine */

View File

@@ -37,7 +37,7 @@ class WebhookEventHandler
*/ */
public function sendWebhookMessages(): void public function sendWebhookMessages(): void
{ {
// kick offf the job! // kick off the job!
$messages = WebhookMessage $messages = WebhookMessage
::where('webhook_messages.sent', 0) ::where('webhook_messages.sent', 0)
->where('webhook_messages.errored', 0) ->where('webhook_messages.errored', 0)

View File

@@ -30,7 +30,7 @@ use JsonException;
*/ */
class Sha3SignatureGenerator implements SignatureGeneratorInterface class Sha3SignatureGenerator implements SignatureGeneratorInterface
{ {
private int $version = 0; private int $version = 1;
/** /**
* @inheritDoc * @inheritDoc

View File

@@ -110,6 +110,7 @@ class HomeController extends Controller
*/ */
public function index(AccountRepositoryInterface $repository) public function index(AccountRepositoryInterface $repository)
{ {
var_dump(\Str::random(24));
$types = config('firefly.accountTypesByIdentifier.asset'); $types = config('firefly.accountTypesByIdentifier.asset');
$count = $repository->count($types); $count = $repository->count($types);
Log::channel('audit')->info('User visits homepage.'); Log::channel('audit')->info('User visits homepage.');

View File

@@ -23,7 +23,7 @@ class SendWebhookMessage implements ShouldQueue
/** /**
* Create a new job instance. * Create a new job instance.
* *
* @return void * @param WebhookMessage $message
*/ */
public function __construct(WebhookMessage $message) public function __construct(WebhookMessage $message)
{ {

View File

@@ -82,7 +82,7 @@ class Webhook extends Model
// delivery // delivery
public const DELIVERY_JSON = 300; public const DELIVERY_JSON = 300;
protected $fillable = ['active', 'trigger', 'response', 'delivery', 'user_id', 'url']; protected $fillable = ['active', 'trigger', 'response', 'delivery', 'user_id', 'url', 'title', 'secret'];
protected $casts protected $casts
= [ = [

View File

@@ -25,6 +25,7 @@ namespace FireflyIII\Repositories\Webhook;
use FireflyIII\Models\Webhook; use FireflyIII\Models\Webhook;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Str;
/** /**
* Class WebhookRepository * Class WebhookRepository
@@ -54,6 +55,7 @@ class WebhookRepository implements WebhookRepositoryInterface
*/ */
public function store(array $data): Webhook public function store(array $data): Webhook
{ {
$secret = $random = Str::random(24);
$fullData = [ $fullData = [
'user_id' => $this->user->id, 'user_id' => $this->user->id,
'active' => $data['active'] ?? false, 'active' => $data['active'] ?? false,
@@ -61,6 +63,7 @@ class WebhookRepository implements WebhookRepositoryInterface
'trigger' => $data['trigger'], 'trigger' => $data['trigger'],
'response' => $data['response'], 'response' => $data['response'],
'delivery' => $data['delivery'], 'delivery' => $data['delivery'],
'secret' => $secret,
'url' => $data['url'], 'url' => $data['url'],
]; ];
@@ -77,6 +80,12 @@ class WebhookRepository implements WebhookRepositoryInterface
$webhook->response = $data['response'] ?? $webhook->response; $webhook->response = $data['response'] ?? $webhook->response;
$webhook->delivery = $data['delivery'] ?? $webhook->delivery; $webhook->delivery = $data['delivery'] ?? $webhook->delivery;
$webhook->url = $data['url'] ?? $webhook->url; $webhook->url = $data['url'] ?? $webhook->url;
if (array_key_exists('secret', $data) && null !== $data['secret']) {
$secret = $random = Str::random(24);
$webhook->secret = $secret;
}
$webhook->save(); $webhook->save();
return $webhook; return $webhook;

View File

@@ -22,7 +22,9 @@ declare(strict_types=1);
namespace FireflyIII\Services\Webhook; namespace FireflyIII\Services\Webhook;
use Exception;
use FireflyIII\Helpers\Webhook\SignatureGeneratorInterface; use FireflyIII\Helpers\Webhook\SignatureGeneratorInterface;
use FireflyIII\Models\WebhookAttempt;
use FireflyIII\Models\WebhookMessage; use FireflyIII\Models\WebhookMessage;
use GuzzleHttp\Client; use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException; use GuzzleHttp\Exception\ClientException;
@@ -68,12 +70,17 @@ class StandardWebhookSender implements WebhookSenderInterface
try { try {
$json = json_encode($this->message->message, JSON_THROW_ON_ERROR); $json = json_encode($this->message->message, JSON_THROW_ON_ERROR);
} catch (JsonException $e) { } catch (JsonException $e) {
// TODO throw Firefly Exception Log::error('Did not send message because of a JSON error.');
// $attempt = new WebhookAttempt; Log::error($e->getMessage());
// $attempt->webhookMessage()->associate($this->message); Log::error($e->getTraceAsString());
// $attempt->status_code = 0; $attempt = new WebhookAttempt;
// $attempt->logs = sprintf('Json error: %s', $e->getMessage()); $attempt->webhookMessage()->associate($this->message);
// $attempt->save(); $attempt->status_code = 0;
$attempt->logs = sprintf('Json error: %s', $e->getMessage());
$attempt->save();
$this->message->errored = true;
$this->message->sent = false;
$this->message->save();
return; return;
} }
@@ -89,7 +96,6 @@ class StandardWebhookSender implements WebhookSenderInterface
], ],
]; ];
$client = new Client; $client = new Client;
//$logs = $this->message->logs ?? [];
try { try {
$res = $client->request('POST', $this->message->webhook->url, $options); $res = $client->request('POST', $this->message->webhook->url, $options);
$this->message->sent = true; $this->message->sent = true;
@@ -99,22 +105,13 @@ class StandardWebhookSender implements WebhookSenderInterface
//$logs[] = sprintf('%s: %s', date('Y-m-d H:i:s'), $e->getMessage()); //$logs[] = sprintf('%s: %s', date('Y-m-d H:i:s'), $e->getMessage());
$this->message->errored = true; $this->message->errored = true;
$this->message->sent = false; $this->message->sent = false;
$this->message->save();
return;
} }
$this->message->save(); $this->message->save();
// $attempt = new WebhookAttempt;
// $attempt->webhookMessage()->associate($this->message);
// $attempt->status_code = $res->getStatusCode();
// $attempt->logs = '';
// $attempt->response = (string)$res->getBody();
// $attempt->save();
Log::debug(sprintf('Webhook message #%d was sent. Status code %d', $this->message->id, $res->getStatusCode())); Log::debug(sprintf('Webhook message #%d was sent. Status code %d', $this->message->id, $res->getStatusCode()));
Log::debug(sprintf('Webhook request body size: %d bytes', strlen($json))); Log::debug(sprintf('Webhook request body size: %d bytes', strlen($json)));
Log::debug(sprintf('Response body: %s', $res->getBody())); Log::debug(sprintf('Response body: %s', $res->getBody()));
//$sender
//$this->sendMessageV0($this->message);
} }
} }

View File

@@ -55,6 +55,7 @@ class WebhookTransformer extends AbstractTransformer
'updated_at' => $webhook->updated_at->toAtomString(), 'updated_at' => $webhook->updated_at->toAtomString(),
'active' => $webhook->active, 'active' => $webhook->active,
'title' => $webhook->title, 'title' => $webhook->title,
'secret' => $webhook->secret,
'trigger' => $this->getEnum($webhook->trigger), 'trigger' => $this->getEnum($webhook->trigger),
'response' => $this->getEnum($webhook->response), 'response' => $this->getEnum($webhook->response),
'delivery' => $this->getEnum($webhook->delivery), 'delivery' => $this->getEnum($webhook->delivery),

View File

@@ -655,6 +655,7 @@ class FireflyValidator extends Validator
->where('id', '!=', $existingId) ->where('id', '!=', $existingId)
->where('url', $url)->count(); ->where('url', $url)->count();
} }
return false; return false;
} }