lib/ukemi/moderator.rb in ukemi-0.1.0 vs lib/ukemi/moderator.rb in ukemi-0.2.0

- old
+ new

@@ -1,9 +1,10 @@ # frozen_string_literal: true require "parallel" require "time" +require "date" module Ukemi class Moderator def lookup(data) records = Parallel.map(Ukemi.services) do |klass| @@ -15,30 +16,59 @@ rescue ::PassiveTotal::Error, ::VirusTotal::Error, ::SecurityTrails::Error, PassiveCIRCL::Error nil end end.flatten.compact + format records + end + + def format(records) memo = Hash.new { |h, k| h[k] = [] } + records.each do |record| memo[record.data] << { - firtst_seen: record.first_seen, + first_seen: record.first_seen, last_seen: record.last_seen, source: record.source, } end + # Merge first seen last seen and make the sources a list. + formatted = memo.map do |key, sources| + first_seens = sources.map { |record| convert_to_unixtime record.dig(:first_seen) }.compact + last_seens = sources.map { |record| convert_to_unixtime record.dig(:last_seen) }.compact + [ + key, + { + first_seen: convert_to_date(first_seens.min), + last_seen: convert_to_date(last_seens.max), + sources: sources + } + ] + end.to_h - memo.sort_by do |_key, array| - last_seens = array.map do |record| - parse_to_unixtime record.dig(:last_seen) + # Sorting + ordering_key = Ukemi.configuration.ordering_key.to_sym + sort_order = Ukemi.configuration.sort_order + formatted.sort_by do |_key, hash| + value = hash.dig(ordering_key) + if sort_order == "DESC" + value ? -convert_to_unixtime(value) : -1 + else + value ? convert_to_unixtime(value) : Float::MAX.to_i end - -last_seens.max end.to_h end - def parse_to_unixtime(date) - return -1 unless date + def convert_to_unixtime(date) + return nil unless date Time.parse(date).to_i + end + + def convert_to_date(time) + return nil unless time + + Time.at(time).to_date.to_s end class << self def lookup(data) new.lookup data