# frozen_string_literal: truerequire'genesis_ruby/errors/request_error'moduleGenesisRubymoduleApimoduleMixinsmoduleRequests# Request Class attribute validations# Reads the pre-set `validation_<attribute>` and perform validation on the fieldsmoduleAttributeValidation# rubocop:disable Metrics/ModuleLengthprotected# Perform validationdefvalidatevalidate_required_fieldsrequired_fieldsvalidate_field_valuesfield_valuesvalidate_field_value_dependenciesfield_value_dependenciesend# Required Fields Accessordefrequired_fields@required_fields||=[]end# Required Fields Accessordefrequired_fields=(value)raiseRequestError,'Invalid value given for Required Fields! Allowed: Array.'unlessvalue.is_a?Array@required_fields=valueend# Field Values Accessordeffield_values@field_values||={}end# Field Values Accessordeffield_values=(value)raiseRequestError,'Invalid value given for Field Values! Allowed: Hash.'unlessvalue.is_a?Hash@field_values=valueend# Field Value Dependencies Accessordeffield_value_dependencies@field_value_dependencies||={}end# Field Value Dependencies Accessordeffield_value_dependencies=(value)unlessvalue.is_a?HashraiseRequestError,'Invalid value given for Required Field Conditional! Allowed: Hash.'end@field_value_dependencies=valueendprivate# Validated Required fieldsdefvalidate_required_fields(required_fields)required_fields.eachdo|field_name|ifnull_or_empty_field?(field_name)raiseParameterError,"Empty (nil) for required parameter: #{field_name}"endendend# Validate Required Field Valuesdefvalidate_field_values(field_values)field_values.eachdo|field_name,field_value|# Allow optional attributes by bypassing null or empty field valuesnextifnull_or_empty_field?field_name# Validate against Array set of valuesnextifallowed_arrayfield_name,field_value# Validate against a valueallowed_valuefield_name,field_valueendend# Validate Required Field Conditional# Validates if given fielddefvalidate_field_value_dependencies(required_field_conditional)# rubocop:disable Metrics/MethodLengthrequired_field_conditional.eachdo|field_name,value_dependencies|# Allow optional attributesnextifnull_or_empty_field?field_nameunlessvalue_dependencies.is_a?(Hash)||value_dependencies.is_a?(Array)raiseRequestError,'Invalid value given for Required Field Conditional Dependencies! Allowed: Hash.'endifvalue_dependencies.is_a?Arraygroup_field_dependenciesfield_name,value_dependenciesnextendloop_field_value_dependenciesfield_name,value_dependenciesendend# Validate if the given field_name is null or emptydefnull_or_empty_field?(field_name)field_value=__send__field_name.to_symreturnfalseif[Integer,Float,TrueClass,FalseClass,DateTime].any?{|type|field_value.is_a?type}field_value.nil?||field_value.empty?end# Validates Field accessor against allowed valuesdefallowed_array(field_name,allowed_values)returnnilunlessallowed_values.is_a?Arrayunlessallowed_values.include?(__send__(field_name))raiseParameterError,format('Parameter %{field} is set to %{field_value}, but expected to be one of (%{allowed})',field: field_name,field_value: __send__(field_name),allowed: allowed_values.join(', '))endtrueend# Validates Field accessor against allowed valuedefallowed_value(field_name,allowed_value)returnnilif__send__(field_name)==allowed_valueraiseParameterError,format('Required parameter %{field_name} is set to %{field_value}, but expected to be %{allowed_value}',field_name: field_name,field_value: __send__(field_name),allowed_value: allowed_value)end# Validate if given dependencies based on the field value satisfy the requestdefloop_field_value_dependencies(field_name,value_dependencies)value_dependencies.eachdo|value_depend,dependencies|nextif__send__(field_name).to_s!=value_depend.to_sgroup_field_dependenciesfield_name,dependenciesifdependencies.is_a?Arraygroup_field_value_dependenciesfield_name,dependenciesifdependencies.is_a?Hashendend# Validates Group field dependencies# Check if all of the given array of attributes are set (not null or empty fields)defgroup_field_dependencies(field_name,fields)fields.eachdo|field|nextunlessnull_or_empty_field?fieldraiseParameterError,format('%{field_name} is depending on: %{field}, which is empty (null)!',field_name: field_name,field: field)endend# Validates Group of attributes against given allowed valuesdefgroup_field_value_dependencies(field_name,dependencies)# rubocop:disable Metrics/MethodLengthdependencies.eachdo|field_depend,allowed_values|nextifnull_or_empty_field?field_dependnextifallowed_values.include?__send__(field_depend)raiseParameterError,format('%{field} with value %{field_value} is depending on: %{field_depend}, which is '\'expected to be one of (%{allowed})! Please refer the official documentation for %{trx_type} type.',field: field_name,field_value: __send__(field_name),field_depend: field_depend,allowed: allowed_values.join(', '),trx_type: self.class.name)endendendendendendend