From 12e10e3afb1a3e75cbe2f5372047355cb7f3945f Mon Sep 17 00:00:00 2001 From: Artemiy Solopov Date: Sat, 22 Nov 2025 01:46:57 +0200 Subject: [PATCH] Service model callbacks --- app/services/application_service.rb | 36 +++++++++++++++++++++++++++++ app/services/tasks/create.rb | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/app/services/application_service.rb b/app/services/application_service.rb index e8e2e2c..dfd0ffe 100644 --- a/app/services/application_service.rb +++ b/app/services/application_service.rb @@ -4,6 +4,38 @@ class ApplicationService include ActiveModel::Model include ActiveModel::Attributes + define_model_callbacks :perform + define_model_callbacks :success, only: [:after] + define_model_callbacks :failure, only: [:after] + + @prepend_methods = Module.new do + def perform(...) + status = run_callbacks :perform do + super(...) + end + + if status + run_callbacks :success + else + run_callbacks :failure + end + + status + end + end + + def self.inherited(subclass) + super + subclass.prepend @prepend_methods + end + + before_perform do + if invalid? + logger.debug 'Validation failed' + throw :abort + end + end + def perform # Override this end @@ -13,4 +45,8 @@ class ApplicationService def save(model) model.save.tap { @errors = model.errors } end + + def logger + @logger ||= ActiveSupport::TaggedLogging.new(Rails.logger).tagged(self.class.name) + end end diff --git a/app/services/tasks/create.rb b/app/services/tasks/create.rb index e464d27..42f6bf5 100644 --- a/app/services/tasks/create.rb +++ b/app/services/tasks/create.rb @@ -7,7 +7,7 @@ module Tasks attribute :description, :string attribute :status_id, :integer - validates :project_id, :title, presence: true + validates :project_id, :title, :status_id, presence: true delegate :model_name, to: Task