# frozen_string_literal: true # Dron::Base — Módulo base para todos los drones atómicos # ======================================================== # Proporciona funcionalidad común para evitar duplicación. # Se usa llamando directamente: Base.logger, Base.db_query, etc. # # Uso: # require_relative 'base' # class Dron::Ejecutor # class << self # def accion # Base.logger.info("...") # Base.db_query("SELECT ...") # end # end # end require_relative '../../core/logger' require_relative '../../db/core/bitacora_db' module Dron module Base module_function def logger @@logger ||= ADN::Logger.new end def db_query(sql, params = []) BitacorasDB::BitacoraDB.with_connection { |db| db.execute(sql, params).to_a } rescue PG::Error => e logger.error("💥 PG Error: #{e.message}") raise rescue StandardError => e logger.error("💥 Error: #{e.message}") raise end def db_exec(sql, params = []) BitacorasDB::BitacoraDB.with_connection { |db| db.execute(sql, params) } rescue PG::Error => e logger.error("💥 PG Error: #{e.message}") raise rescue StandardError => e logger.error("💥 Error: #{e.message}") raise end def formato_duracion(segundos) minutos = (segundos / 60).to_i secs = (segundos % 60).to_i minutos > 0 ? "#{minutos}min #{secs}s" : "#{secs}s" end def blank?(str) str.nil? || str.to_s.strip.empty? end def slice_safe(str, max = 50) return '' if str.nil? str.to_s.length > max ? "#{str.to_s[0...max]}..." : str.to_s end end end