fluke/devops-service/db/mongo/connectors/statictic.rb
2015-09-17 13:15:19 +03:00

82 lines
2.4 KiB
Ruby

module Connectors
class Statistic < Base
def initialize(db)
self.collection = db.collection('statistic')
end
def insert_statistic(user, path, method, body, response_code)
collection.insert(user: user, path: path, method: method, body: body, response_code: response_code, date: Time.now)
end
# supported options:
# user
# response_code (format: 200)
# method
# path_equal
# path_contains
# date_from (format: 2014-12-01 09:18:40 UTC)
# date_till (format: 2014-12-01 09:18:40 UTC)
# limit: default 20. Zero value is equal to no limit.
# sort_field: default 'date'. Could also be in [user, path, method, body, response_code, date].
# sort_order: default 'asc'. Could also be 'desc'
def search_statistic(filters={})
limit = filters[:limit] || 20
sort_field = filters[:sort_field] || 'date'
sort_order = mongo_sort_order(filters[:sort_order] || 'asc')
query = {}
query.deep_merge!( user_equal(filters[:user])) if filters[:user]
query.deep_merge!( method_equal(filters[:method])) if filters[:method]
query.deep_merge!( response_code_equal(filters[:response_code])) if filters[:response_code]
query.deep_merge!( path_equal(filters[:path_equal])) if filters[:path_equal]
query.deep_merge!( path_contains(filters[:path_contains])) if filters[:path_contains]
query.deep_merge!( date_from(filters[:date_from])) if filters[:date_from]
query.deep_merge!( date_till(filters[:date_till])) if filters[:date_till]
collection.
find(query, fields: {"_id" => false}).
limit(limit.to_i).
sort(sort_field => sort_order).
to_a
end
private
def mongo_sort_order(order)
raise "Wrong sort order" unless %w(asc desc).include?(order)
order == 'asc' ? 1 : -1
end
def user_equal(user)
{user: user}
end
def method_equal(method)
{method: method}
end
def path_contains(path)
{path: Regexp.new(path, 'i')}
end
def path_equal(path)
{path: path}
end
def response_code_equal(response_code)
{response_code: response_code.to_i}
end
def date_from(date)
{date: {'$gte' => Time.parse(date)}}
end
def date_till(date)
{date: {'$lte' => Time.parse(date)}}
end
end
end