require "date" module Connectors class Report < Base include Helpers::ShowCommand, Helpers::UpdateCommand, Helpers::ListCommand def initialize(db) super(db) end def collection_name 'reports' end def save_report r r.created_at = Time.new collection.insert(r.to_mongo_hash) unless report_exists?(r.id) end def report_exists? id !collection.find({"_id" => id}, fields: ["_id" => true]).to_a.empty? end def reports options={} date = {} if options.has_key?("date_from") or options.has_key?("date_to") if options.has_key?("date_from") begin d = Date.parse(options["date_from"]) date["$gte"] = d.to_time rescue ArgumentError end end if options.has_key?("date_to") begin d = Date.parse(options["date_to"]) date["$lt"] = d.to_time rescue ArgumentError end end options.delete("date_from") options.delete("date_to") options["created_at"] = date unless date.empty? end sort = {created_at: -1} if options["sort"] val = options.delete("sort") sort = {created_at: (val == "desc" ? -1 : 1)} end collection.find(options).sort(sort).to_a.map {|bson| model_from_bson(bson)} end def add_report_subreports(jid, subreports) collection.update({"_id" => jid}, {"$push" => {"subreports" => {"$each" => subreports}}}) end def set_report_status(jid, status, job_result_code) set = {"status" => status, "updated_at" => Time.new} set["job_result_code"] = job_result_code unless job_result_code.nil? collection.update({"_id" => jid}, {"$set" => set}) DevopsLogger.logger.info("Report '#{jid}' status has been changed to '#{status}'") end def set_report_server_data id, chef_node_name, host collection.update({"_id" => id}, {"$set" => {"chef_node_name" => chef_node_name, "host" => host}}) end def create_indexes info = collection.index_information unless info["created_at_1"] collection.create_index({created_at: Mongo::ASCENDING}) DevopsLogger.logger.info("Index 'created_at_1' for reports collection has been created") end unless info["project_1_deploy_env_1_created_at_1"] collection.create_index({project: Mongo::ASCENDING, deploy_env: Mongo::ASCENDING, created_at: Mongo::ASCENDING}) DevopsLogger.logger.info("Index 'project_1_deploy_env_1_created_at_1' for reports collection has been created") end end private def model_from_bson(bson) Devops::Model::Report.new(bson) end end end