<commit_before>module Noosfero
  module API
    module APIHelpers
      PRIVATE_TOKEN_PARAM = :private_token
  
      def logger
        @logger ||= Logger.new(File.join(Rails.root, 'log', "#{ENV['RAILS_ENV']}_api.log"))
      end
  
      def current_user
        private_token = params[PRIVATE_TOKEN_PARAM].to_s if params
        @current_user ||= User.find_by_private_token(private_token)
        @current_user = nil if !@current_user.nil? && @current_user.private_token_expired?
        @current_user
      end
  
      def current_person
        current_user.person unless current_user.nil?
      end
  
      def logout
        @current_user = nil
      end
  
      def environment
        @environment
      end
  
      def limit
        limit = params[:limit].to_i
        limit = default_limit if limit <= 0
        limit
      end
  
      def period(from_date, until_date)
        return nil if from_date.nil? && until_date.nil?
  
        begin_period = from_date.nil? ? Time.at(0).to_datetime : from_date
        end_period = until_date.nil? ? DateTime.now : until_date
  
        begin_period..end_period
      end
  
      def parse_content_type(content_type)
        return nil if content_type.blank?
        content_type.split(',').map do |content_type|
          content_type.camelcase
        end
      end
  
      def find_article(articles, id)
        article = articles.find(id)
        article.display_to?(current_user.person) ? article : forbidden!
      end
  
      def make_conditions_with_parameter(params = {})
        conditions = {}
        from_date = DateTime.parse(params[:from]) if params[:from]
        until_date = DateTime.parse(params[:until]) if params[:until]
  
        conditions[:type] = parse_content_type(params[:content_type]) unless params[:content_type].nil?
  
        conditions[:created_at] = period(from_date, until_date) if from_date || until_date
  
        conditions
      end
  
  
      def select_filtered_collection_of(object, method, params)
        conditions = make_conditions_with_parameter(params)
                 
        if params[:reference_id]
          objects = object.send(method).send("#{params.key?(:oldest) ? 'older_than' : 'newer_than'}", params[:reference_id]).where(conditions).limit(limit).order("created_at DESC")
        else
          objects = object.send(method).where(conditions).limit(limit).order("created_at DESC")
        end
        objects
      end
  
      def authenticate!
        unauthorized! unless current_user
      end
  
      # Checks the occurrences of uniqueness of attributes, each attribute must be present in the params hash
      # or a Bad Request error is invoked.
      #
      # Parameters:
      #   keys (unique) - A hash consisting of keys that must be unique
      def unique_attributes!(obj, keys)
        keys.each do |key|
          cant_be_saved_request!(key) if obj.send("find_by_#{key.to_s}", params[key])
        end
      end
  
      def attributes_for_keys(keys)
        attrs = {}
        keys.each do |key|
          attrs[key] = params[key] if params[key].present? or (params.has_key?(key) and params[key] == false)
        end
        attrs
      end
      
      ##########################################
      #              error helpers             #
      ##########################################
  
      def forbidden!
        render_api_error!('403 Forbidden', 403)
      end
  
      def cant_be_saved_request!(attribute)
        message = _("(Invalid request) #{attribute} can't be saved")
        render_api_error!(message, 400)
      end
  
      def bad_request!(attribute)
        message = _("(Bad request) #{attribute} not given")
        render_api_error!(message, 400)
      end
  
      def something_wrong!
        message = _("Something wrong happened")
        render_api_error!(message, 400)
      end
  
      def unauthorized!
        render_api_error!(_('Unauthorized'), 401)
      end
  
      def not_allowed!
        render_api_error!(_('Method Not Allowed'), 405)
      end
  
      def render_api_error!(message, status)
        error!({'message' => message, :code => status}, status)
      end
  
      def render_api_errors!(messages)
        render_api_error!(messages.join(','), 400)
      end
      protected
  
      def start_log
        logger.info "Started #{request.path} #{request.params.except('password')}"
      end
      def end_log
        logger.info "Completed #{request.path}"
      end
  
      def setup_multitenancy
        Noosfero::MultiTenancy.setup!(request.host)
      end
  
      def detect_stuff_by_domain
        @domain = Domain.find_by_name(request.host)
        if @domain.nil?
          @environment = Environment.default
          if @environment.nil? && Rails.env.development?
            # This should only happen in development ...
            @environment = Environment.create!(:name => "Noosfero", :is_default => true)
          end
        else
          @environment = @domain.environment
        end
      end
  
      private
  <commit_msg>API: adding more parameters as filter in conditions<commit_after>module Noosfero
  module API
    module APIHelpers
      PRIVATE_TOKEN_PARAM = :private_token
      ALLOWED_PARAMETERS = ['parent_id', 'from', 'until', 'content_type'] 
  
      def logger
        @logger ||= Logger.new(File.join(Rails.root, 'log', "#{ENV['RAILS_ENV']}_api.log"))
      end
  
      def current_user
        private_token = params[PRIVATE_TOKEN_PARAM].to_s if params
        @current_user ||= User.find_by_private_token(private_token)
        @current_user = nil if !@current_user.nil? && @current_user.private_token_expired?
        @current_user
      end
  
      def current_person
        current_user.person unless current_user.nil?
      end
  
      def logout
        @current_user = nil
      end
  
      def environment
        @environment
      end
  
      def limit
        limit = params[:limit].to_i
        limit = default_limit if limit <= 0
        limit
      end
  
      def period(from_date, until_date)
        return nil if from_date.nil? && until_date.nil?
  
        begin_period = from_date.nil? ? Time.at(0).to_datetime : from_date
        end_period = until_date.nil? ? DateTime.now : until_date
  
        begin_period..end_period
      end
  
      def parse_content_type(content_type)
        return nil if content_type.blank?
        content_type.split(',').map do |content_type|
          content_type.camelcase
        end
      end
  
      def find_article(articles, id)
        article = articles.find(id)
        article.display_to?(current_user.person) ? article : forbidden!
      end

      def make_conditions_with_parameter(params = {})
        parsed_params = parser_params(params)
        conditions = {}
        from_date = DateTime.parse(parsed_params.delete('from')) if parsed_params['from']
        until_date = DateTime.parse(parsed_params.delete('until')) if parsed_params['until']
  
        conditions[:type] = parse_content_type(parsed_params.delete('content_type')) unless parsed_params['content_type'].nil?
  
        conditions[:created_at] = period(from_date, until_date) if from_date || until_date
        conditions.merge!(parsed_params)
  
        conditions
      end
  
  
      def select_filtered_collection_of(object, method, params)
        conditions = make_conditions_with_parameter(params)
                 
        if params[:reference_id]
          objects = object.send(method).send("#{params.key?(:oldest) ? 'older_than' : 'newer_than'}", params[:reference_id]).where(conditions).limit(limit).order("created_at DESC")
        else
          objects = object.send(method).where(conditions).limit(limit).order("created_at DESC")
        end
        objects
      end
  
      def authenticate!
        unauthorized! unless current_user
      end
  
      # Checks the occurrences of uniqueness of attributes, each attribute must be present in the params hash
      # or a Bad Request error is invoked.
      #
      # Parameters:
      #   keys (unique) - A hash consisting of keys that must be unique
      def unique_attributes!(obj, keys)
        keys.each do |key|
          cant_be_saved_request!(key) if obj.send("find_by_#{key.to_s}", params[key])
        end
      end
  
      def attributes_for_keys(keys)
        attrs = {}
        keys.each do |key|
          attrs[key] = params[key] if params[key].present? or (params.has_key?(key) and params[key] == false)
        end
        attrs
      end
      
      ##########################################
      #              error helpers             #
      ##########################################
  
      def forbidden!
        render_api_error!('403 Forbidden', 403)
      end
  
      def cant_be_saved_request!(attribute)
        message = _("(Invalid request) #{attribute} can't be saved")
        render_api_error!(message, 400)
      end
  
      def bad_request!(attribute)
        message = _("(Bad request) #{attribute} not given")
        render_api_error!(message, 400)
      end
  
      def something_wrong!
        message = _("Something wrong happened")
        render_api_error!(message, 400)
      end
  
      def unauthorized!
        render_api_error!(_('Unauthorized'), 401)
      end
  
      def not_allowed!
        render_api_error!(_('Method Not Allowed'), 405)
      end
  
      def render_api_error!(message, status)
        error!({'message' => message, :code => status}, status)
      end
  
      def render_api_errors!(messages)
        render_api_error!(messages.join(','), 400)
      end
      protected
  
      def start_log
        logger.info "Started #{request.path} #{request.params.except('password')}"
      end
      def end_log
        logger.info "Completed #{request.path}"
      end
  
      def setup_multitenancy
        Noosfero::MultiTenancy.setup!(request.host)
      end
  
      def detect_stuff_by_domain
        @domain = Domain.find_by_name(request.host)
        if @domain.nil?
          @environment = Environment.default
          if @environment.nil? && Rails.env.development?
            # This should only happen in development ...
            @environment = Environment.create!(:name => "Noosfero", :is_default => true)
          end
        else
          @environment = @domain.environment
        end
      end
  
      private

      def parser_params(params) 
        params.select{|k,v| ALLOWED_PARAMETERS.include?(k)}
      end
  
{'fraction_non_alphanumeric': 0.11058105142639062, 'fraction_numerical': 0.004961358648983875, 'mean_word_length': 2.3045397225725095, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1524531', 'n_tokens_mistral': 3076, 'n_tokens_neox': 3008, 'n_words': 666}