Allow budget store to have optional webhook using "fire_webhooks".

This commit is contained in:
James Cole
2025-09-14 08:55:29 +02:00
parent 9e6f9d16e4
commit c2d3f5da16
6 changed files with 46 additions and 20 deletions

View File

@@ -67,22 +67,24 @@ class StoreController extends Controller
*/ */
public function store(StoreRequest $request): JsonResponse public function store(StoreRequest $request): JsonResponse
{ {
$budget = $this->repository->store($request->getAll()); $data = $request->getAll();
$data['fire_webhooks'] = $data['fire_webhooks'] ?? true;
$budget = $this->repository->store($data);
$budget->refresh(); $budget->refresh();
$manager = $this->getManager(); $manager = $this->getManager();
// enrich // enrich
/** @var User $admin */ /** @var User $admin */
$admin = auth()->user(); $admin = auth()->user();
$enrichment = new BudgetEnrichment(); $enrichment = new BudgetEnrichment();
$enrichment->setUser($admin); $enrichment->setUser($admin);
$budget = $enrichment->enrichSingle($budget); $budget = $enrichment->enrichSingle($budget);
/** @var BudgetTransformer $transformer */ /** @var BudgetTransformer $transformer */
$transformer = app(BudgetTransformer::class); $transformer = app(BudgetTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($budget, $transformer, 'budgets'); $resource = new Item($budget, $transformer, 'budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -59,6 +59,9 @@ class StoreRequest extends FormRequest
'auto_budget_type' => ['auto_budget_type', 'convertString'], 'auto_budget_type' => ['auto_budget_type', 'convertString'],
'auto_budget_amount' => ['auto_budget_amount', 'convertString'], 'auto_budget_amount' => ['auto_budget_amount', 'convertString'],
'auto_budget_period' => ['auto_budget_period', 'convertString'], 'auto_budget_period' => ['auto_budget_period', 'convertString'],
// webhooks
'fire_webhooks' => ['fire_webhooks','boolean']
]; ];
return $this->getAllData($fields); return $this->getAllData($fields);
@@ -79,6 +82,9 @@ class StoreRequest extends FormRequest
'auto_budget_type' => 'in:reset,rollover,adjusted,none', 'auto_budget_type' => 'in:reset,rollover,adjusted,none',
'auto_budget_amount' => ['required_if:auto_budget_type,reset', 'required_if:auto_budget_type,rollover', 'required_if:auto_budget_type,adjusted', new IsValidPositiveAmount()], 'auto_budget_amount' => ['required_if:auto_budget_type,reset', 'required_if:auto_budget_type,rollover', 'required_if:auto_budget_type,adjusted', new IsValidPositiveAmount()],
'auto_budget_period' => 'in:daily,weekly,monthly,quarterly,half_year,yearly|required_if:auto_budget_type,reset|required_if:auto_budget_type,rollover|required_if:auto_budget_type,adjusted', 'auto_budget_period' => 'in:daily,weekly,monthly,quarterly,half_year,yearly|required_if:auto_budget_type,reset|required_if:auto_budget_type,rollover|required_if:auto_budget_type,adjusted',
// webhooks
'fire_webhooks' => [new IsBoolean()],
]; ];
} }

View File

@@ -183,6 +183,7 @@ class StoreRequest extends FormRequest
// basic fields for group: // basic fields for group:
'group_title' => 'min:1|max:1000|nullable', 'group_title' => 'min:1|max:1000|nullable',
'error_if_duplicate_hash' => [new IsBoolean()], 'error_if_duplicate_hash' => [new IsBoolean()],
'fire_webhooks' => [new IsBoolean()],
'apply_rules' => [new IsBoolean()], 'apply_rules' => [new IsBoolean()],
// location rules // location rules

View File

@@ -31,6 +31,7 @@ use FireflyIII\Models\Budget;
use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\BudgetLimit;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use FireflyIII\Support\Observers\RecalculatesAvailableBudgetsTrait; use FireflyIII\Support\Observers\RecalculatesAvailableBudgetsTrait;
use FireflyIII\Support\Singleton\PreferencesSingleton;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -45,23 +46,28 @@ class BudgetObserver
{ {
Log::debug(sprintf('Observe "created" of budget #%d ("%s").', $budget->id, $budget->name)); Log::debug(sprintf('Observe "created" of budget #%d ("%s").', $budget->id, $budget->name));
// fire event. // this is a lame trick to communicate with the observer.
$user = $budget->user; $singleton = PreferencesSingleton::getInstance();
/** @var MessageGeneratorInterface $engine */ if (true === $singleton->getPreference('fire_webhooks_budget_create')) {
$engine = app(MessageGeneratorInterface::class); // fire event.
$engine->setUser($user); $user = $budget->user;
$engine->setObjects(new Collection()->push($budget));
$engine->setTrigger(WebhookTrigger::STORE_BUDGET); /** @var MessageGeneratorInterface $engine */
$engine->generateMessages(); $engine = app(MessageGeneratorInterface::class);
Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__)); $engine->setUser($user);
event(new RequestedSendWebhookMessages()); $engine->setObjects(new Collection()->push($budget));
$engine->setTrigger(WebhookTrigger::STORE_BUDGET);
$engine->generateMessages();
Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__));
event(new RequestedSendWebhookMessages());
}
} }
public function updated(Budget $budget): void public function updated(Budget $budget): void
{ {
Log::debug(sprintf('Observe "updated" of budget #%d ("%s").', $budget->id, $budget->name)); Log::debug(sprintf('Observe "updated" of budget #%d ("%s").', $budget->id, $budget->name));
$user = $budget->user; $user = $budget->user;
/** @var MessageGeneratorInterface $engine */ /** @var MessageGeneratorInterface $engine */
$engine = app(MessageGeneratorInterface::class); $engine = app(MessageGeneratorInterface::class);
@@ -77,10 +83,10 @@ class BudgetObserver
{ {
Log::debug('Observe "deleting" of a budget.'); Log::debug('Observe "deleting" of a budget.');
$user = $budget->user; $user = $budget->user;
/** @var MessageGeneratorInterface $engine */ /** @var MessageGeneratorInterface $engine */
$engine = app(MessageGeneratorInterface::class); $engine = app(MessageGeneratorInterface::class);
$engine->setUser($user); $engine->setUser($user);
$engine->setObjects(new Collection()->push($budget)); $engine->setObjects(new Collection()->push($budget));
$engine->setTrigger(WebhookTrigger::DESTROY_BUDGET); $engine->setTrigger(WebhookTrigger::DESTROY_BUDGET);
@@ -88,7 +94,7 @@ class BudgetObserver
Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__)); Log::debug(sprintf('send event RequestedSendWebhookMessages from %s', __METHOD__));
event(new RequestedSendWebhookMessages()); event(new RequestedSendWebhookMessages());
$repository = app(AttachmentRepositoryInterface::class); $repository = app(AttachmentRepositoryInterface::class);
$repository->setUser($budget->user); $repository->setUser($budget->user);
/** @var Attachment $attachment */ /** @var Attachment $attachment */

View File

@@ -44,6 +44,7 @@ use FireflyIII\Support\Facades\Steam;
use FireflyIII\Support\Http\Api\ExchangeRateConverter; use FireflyIII\Support\Http\Api\ExchangeRateConverter;
use FireflyIII\Support\Repositories\UserGroup\UserGroupInterface; use FireflyIII\Support\Repositories\UserGroup\UserGroupInterface;
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
use FireflyIII\Support\Singleton\PreferencesSingleton;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
@@ -724,6 +725,10 @@ class BudgetRepository implements BudgetRepositoryInterface, UserGroupInterface
{ {
$order = $this->getMaxOrder(); $order = $this->getMaxOrder();
// this is a lame trick to communicate with the observer.
$singleton = PreferencesSingleton::getInstance();
$singleton->setPreference('fire_webhooks_budget_create', $data['fire_webhooks'] ?? true);
try { try {
$newBudget = Budget::create( $newBudget = Budget::create(
[ [

View File

@@ -258,6 +258,12 @@ trait ConvertsDataTypes
if ('yes' === $value) { if ('yes' === $value) {
return true; return true;
} }
if ('on' === $value) {
return true;
}
if ('y' === $value) {
return true;
}
if ('1' === $value) { if ('1' === $value) {
return true; return true;
} }