Skip to content

Instantly share code, notes, and snippets.

@light-flight
Created March 28, 2025 13:12
Show Gist options
  • Save light-flight/6c6abb2ff45b2f56774bef6e210b3565 to your computer and use it in GitHub Desktop.
Save light-flight/6c6abb2ff45b2f56774bef6e210b3565 to your computer and use it in GitHub Desktop.
Dry transactions
class CreateAction < BaseTransaction
Contract = Dry::Validation::Contract.build do
params do
required(:mark_task_discussion_done).maybe(:bool)
required(:task_message).hash do
required(:user_id).filled(:integer)
required(:task_discussion_id).filled(:integer)
required(:body).filled(:string)
optional(:add_answer_attachments).maybe(:bool)
optional(:attachments).maybe(:array?)
end
end
end
step :validate_params
step :create_task_message
step :done_task_discussion
private
def validate_params(params)
result = Contract.call(params)
return Success(result.to_h) if result.success?
Failure(result.errors.to_h) # rubocop:disable Rails/DeprecatedActiveModelErrorsMethods
end
def create_task_message(params)
result = ::TaskMessages::Create.call(params[:task_message])
Success(
{
task_discussion: result.success.task_discussion,
mark_as_done: params[:mark_task_discussion_done]
}
)
end
def done_task_discussion(task_discussion:, mark_as_done:)
return Success() unless mark_as_done
::TaskDiscussions::Done.call(task_discussion)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment