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')));
return [
'title' => 'between:1,512',
'title' => 'required|between:1,512|uniqueObjectForUser:webhooks,title',
'active' => [new IsBoolean],
'trigger' => sprintf('required|in:%s', $triggers),
'response' => sprintf('required|in:%s', $responses),

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -82,7 +82,7 @@ class Webhook extends Model
// delivery
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
= [

View File

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

View File

@@ -22,7 +22,9 @@ declare(strict_types=1);
namespace FireflyIII\Services\Webhook;
use Exception;
use FireflyIII\Helpers\Webhook\SignatureGeneratorInterface;
use FireflyIII\Models\WebhookAttempt;
use FireflyIII\Models\WebhookMessage;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
@@ -68,12 +70,17 @@ class StandardWebhookSender implements WebhookSenderInterface
try {
$json = json_encode($this->message->message, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
// TODO throw Firefly Exception
// $attempt = new WebhookAttempt;
// $attempt->webhookMessage()->associate($this->message);
// $attempt->status_code = 0;
// $attempt->logs = sprintf('Json error: %s', $e->getMessage());
// $attempt->save();
Log::error('Did not send message because of a JSON error.');
Log::error($e->getMessage());
Log::error($e->getTraceAsString());
$attempt = new WebhookAttempt;
$attempt->webhookMessage()->associate($this->message);
$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;
}
@@ -89,7 +96,6 @@ class StandardWebhookSender implements WebhookSenderInterface
],
];
$client = new Client;
//$logs = $this->message->logs ?? [];
try {
$res = $client->request('POST', $this->message->webhook->url, $options);
$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());
$this->message->errored = true;
$this->message->sent = false;
$this->message->save();
return;
}
$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 request body size: %d bytes', strlen($json)));
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(),
'active' => $webhook->active,
'title' => $webhook->title,
'secret' => $webhook->secret,
'trigger' => $this->getEnum($webhook->trigger),
'response' => $this->getEnum($webhook->response),
'delivery' => $this->getEnum($webhook->delivery),

View File

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