Skip to content

Instantly share code, notes, and snippets.

def accept_invitation
Wf.new
.chain(user: :user) { AcceptInvitation.new(invitation).call }
.chain {|outflow| render json: { user: outflow.user } }
.on_dam do |error_pool|
render json: { errors: error_pool.full_messages }, status: 422
end
end
# User model
class User < ActiveRecord::Base
has_many :invitations
end
# Invitation Model
class Invitation < ActiveRecord::Base
belongs_to :inviter, class_name: 'User'
def accept
self.accepted = true
end
class AcceptInvitation
include Waterfall
include ActiveModel::Validations
CENTS_PAID_FOR_AFFILIATION = 100
validate :ensure_invitation_not_accepted
def initialize(invitation)
@invitation = invitation
class CreateUserFromInvitation
include Waterfall
def initialize(invitation)
@invitation = invitation
end
def call
chain { build_user }
when_falsy { user.save }
class CreditUser
include Waterfall
def initialize(user:, cents:)
@user, @cents = user, cents
end
def call
# credit logic goes here and dams on error
end
# test utility for the script
def assert(actual, expected)
if actual == expected
puts "ok #{expected}"
else
puts "ko, you expected: #{expected} but got #{actual}"
end
end
# first implementation, more functional programming friendly, pure method
class ParamsSlicer
def initialize(params, *whitelist)
@params = params
@nested_whitelist = whitelist.extract_options!
@whitelist = whitelist
end
def call
params.slice(*whitelist).tap do |result|
nested_whitelist.each do |k, v|
@apneadiving
apneadiving / example.md
Last active March 1, 2018 15:05
Date range operations
range1 = ::Scheduling::DateRange.new(1.day.ago..Time.now)
range2 = ::Scheduling::DateRange.new(2.days.ago..Time.now)

range1.exclusion(range2) => []
range2.exclusion(range1) => [::Scheduling::DateRange.new(2.days.ago..1.day.ago)]
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem 'twilio-ruby'
gem 'dotenv'
gem 'waterfall'
@apneadiving
apneadiving / initial_implementation.rb
Last active December 12, 2019 12:55
refactoring post
class ApplyProductStateOrder
def initialize(status_change_order)
@status_change_order = status_change_order
end
def call
ActiveRecord::Base.transaction do
state_change = update_product
status_change_order.update_timestamps(state_change)