lib/acfs/model/persistence.rb in acfs-0.16.0 vs lib/acfs/model/persistence.rb in acfs-0.17.0
- old
+ new
@@ -4,52 +4,83 @@
# Allow to track the persistence state of a model.
#
module Persistence
extend ActiveSupport::Concern
+ # @api public
+ #
# Check if the model is persisted. A model is persisted if
# it is saved after beeing created or when it was not changed
# since it was loaded.
#
- # user = User.new name: "John"
- # user.persisted? # => false
- # user.save
- # user.persisted? # => true
+ # @example Newly created resource:
+ # user = User.new name: "John"
+ # user.persisted? # => false
+ # user.save
+ # user.persisted? # => true
#
- # user2 = User.find 5
- # user2.persisted? # => true
- # user2.name = 'Amy'
- # user2.persisted? # => false
- # user2.save
- # user2.persisted? # => true
+ # @example Modified resource:
+ # user2 = User.find 5
+ # user2.persisted? # => true
+ # user2.name = 'Amy'
+ # user2.persisted? # => false
+ # user2.save
+ # user2.persisted? # => true
#
+ # @return [ Boolean ] True if resource has no changes and is not newly created, false otherwise.
+ #
def persisted?
!new? && !changed?
end
+ # @api public
+ #
# Return true if model is a new record and was not saved yet.
#
+ # @return [ Boolean ] True if resource is newly created, false otherwise.
+ #
def new?
read_attribute(:id).nil?
end
alias :new_record? :new?
- # Save the resource.
+ # @api public
#
- # It will PATCH to the service to update the resource or send
+ # Saves the resource.
+ #
+ # It will PUT to the service to update the resource or send
# a POST to create a new one if the resource is new.
#
- # `#save` return true of operation was successful, otherwise false.
+ # Saving a resource is a synchronous operation.
#
+ # @return [ Boolean ] True if save operation was successful, false otherwise.
+ # @see #save! See #save! for available options.
+ #
def save(*args)
save! *args
true
rescue Acfs::Error
false
end
- def save!(opts = {}) # :nodoc:
+ # @api public
+ #
+ # Saves the resource. Raises an error if something happens.
+ #
+ # Saving a resource is a synchronous operation.
+ #
+ # @param [ Hash ] opts Hash with additional options.
+ # @option opts [ Hash ] :data Data to send to remote service. Default will be resource attributes.
+ #
+ # @raise [ Acfs::InvalidResource ]
+ # If remote services respond with 422 response. Will fill errors with data from response
+ # @raise [ Acfs::ErroneousResponse ]
+ # If remote service respond with not successful response.
+ #
+ # @see #save
+ #
+ def save!(opts = {})
#raise ::Acfs::InvalidResource errors: errors.to_a unless valid?
opts[:data] = attributes unless opts[:data]
operation (new? ? :create : :update), opts do |data|
@@ -57,21 +88,49 @@
end
end
module ClassMethods
+ # @api public
+ #
# Create a new resource sending given data. If resource cannot be
# created an error will be thrown.
#
+ # Saving a resource is a synchronous operation.
+ #
+ # @param [ Hash{ Symbol, String => Object }] data Data to send in create request.
+ # @return [ self ] Newly resource object.
+ #
+ # @raise [ Acfs::InvalidResource ]
+ # If remote services respond with 422 response. Will fill errors with data from response
+ # @raise [ Acfs::ErroneousResponse ]
+ # If remote service respond with not successful response.
+ #
+ # @see Acfs::Model::Persistence#save! Available options. `:data` will be overridden with provided data hash.
+ # @see #create
+ #
def create!(data, opts = {})
new.tap do |model|
model.save! opts.merge data: data
end
end
+ # @api public
+ #
# Create a new resource sending given data. If resource cannot be
# create model will be returned and error hash contains response
# errors if available.
+ #
+ # Saving a resource is a synchronous operation.
+ #
+ # @param [ Hash{ Symbol, String => Object }] data Data to send in create request.
+ # @return [ self ] Newly resource object.
+ #
+ # @raise [ Acfs::ErroneousResponse ]
+ # If remote service respond with not successful response.
+ #
+ # @see Acfs::Model::Persistence#save! Available options. `:data` will be overridden with provided data hash.
+ # @see #create!
#
def create(data, opts = {})
model = new
model.save! opts.merge data: data
model