podemos-info/census

View on GitHub
app/commands/procedures/undo_procedure.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module Procedures
  # A command to undo the last process of a procedure.
  class UndoProcedure < Rectify::Command
    # Public: Initializes the command.
    #
    # form - A form object with the params.
    # admin - The person that is undoing the procedure
    def initialize(form:, admin:)
      @form = form
      @admin = admin
    end

    # Executes the command. Broadcasts these events:
    #
    # - :ok when everything is valid.
    # - :invalid if the given information wasn't valid.
    # - :error if there is any problem updating the procedure.
    #
    # Returns nothing.
    def call
      return broadcast(:invalid) unless form&.valid? && admin && procedure&.undoable_by?(admin)

      result = undo_procedure

      broadcast result, procedure: procedure

      ProceduresChannel.notify_status(procedure) if result == :ok
    end

    private

    attr_accessor :form, :admin
    delegate :procedure, :lock_version, to: :form

    def undo_procedure
      procedure.undo
      procedure.processed_by = procedure.undo_version.processed_by
      procedure.processed_at = procedure.undo_version.processed_at
      procedure.lock_version = lock_version
      procedure.comment = procedure.undo_version.comment
      procedure.save ? :ok : :error
    rescue ActiveRecord::StaleObjectError
      procedure.reload
      :conflict
    end
  end
end