# frozen_string_literal: true require_relative 'query' require_relative 'where_clause' module ErpIntegration module Fulfil module QueryMethods attr_accessor :selected_fields, :where_clauses # Fulfil only returns an ID by default when one would query their API. However, # the ID is seldom the only value one will need. The `select` method allows # selecting multiple fields at once. # # @example # $ ErpIntegration::SalesOrder.select(:id, :name, 'product.name') # # => # # When one calls the `all` method, it will fetch all the resources from Fulfil # and it will return all the given fields (if available). # # @example # $ ErpIntegration::SalesOrder.select(:id, :name, 'product.name').all # # => # # Both a list of Strings, Symbols or a combination of these can be passed # to the `select` method. def select(*fields) clone.select!(*fields) end def select!(*fields) self.selected_fields = (selected_fields || []).concat(fields) self end # Fulfil has a very powerful query syntax. However, that query syntax is rather # complicated and it's really specific to Fulfil. # # The `where` method introduces a well-known interface (e.g. ActiveRecord::Relation) # to query resources in Fulfil. # # @example # $ ErpIntegration::SalesOrder.where(id: 100).all # # => ] /> # # If one adds the `comparison_operator` key to the arguments, it will use # that comparison operator to build the query to Fulfil. # # All the other `where_` methods use this technique to provide logic for all # the different comparison operators. def where(*args) clone.where!(*args) end def where!(args) comparison_operator = args.delete(:comparison_operator) args.each_pair do |key, value| self.where_clauses = (where_clauses || []) << WhereClause.new( key: key, value: value, comparison_operator: comparison_operator ) end self end def where_ilike(args) where(args.merge(comparison_operator: 'ilike')) end def where_in(args) where(args.merge(comparison_operator: 'in')) end def where_less_than(args) where(args.merge(comparison_operator: '<')) end def where_less_or_equal_to(args) where(args.merge(comparison_operator: '<=')) end def where_like(args) where(args.merge(comparison_operator: 'like')) end def where_more_than(args) where(args.merge(comparison_operator: '>')) end def where_more_or_equal_to(args) where(args.merge(comparison_operator: '>=')) end def where_not(args) where(args.merge(comparison_operator: '!=')) end def where_not_in(args) where(args.merge(comparison_operator: 'not in')) end end end end