# frozen_string_literal: true require 'pg' require 'json' module ADN module AmbitosDB module BaseOperations # Listar ámbitos def list_ambitos(activo: nil) query = "SELECT a.*, p.nombre as parent_nombre, (SELECT COUNT(*) FROM bitacoras.nodos WHERE ambito_id = a.id) as count_nodos FROM bitacoras.ambitos a LEFT JOIN bitacoras.ambitos p ON a.parent_id = p.id" params = [] unless activo.nil? query += " WHERE a.activo = $1" params << (activo ? 't' : 'f') end query += " ORDER BY a.parent_id NULLS FIRST, a.nombre ASC" res = execute(query, params) res.map do |r| r['activo'] = (r['activo'] == 't') if r.key?('activo') r end end # Obtener información de un ámbito def get_ambito(id_or_nombre) query = "SELECT a.*, p.nombre as parent_nombre, (SELECT COUNT(*) FROM bitacoras.nodos WHERE ambito_id = a.id) as count_nodos FROM bitacoras.ambitos a LEFT JOIN bitacoras.ambitos p ON a.parent_id = p.id WHERE a.id = $1 OR a.nombre = $2 LIMIT 1" id = id_or_nombre.to_i > 0 ? id_or_nombre.to_i : 0 res = execute(query, [id, id_or_nombre.to_s]) return nil if res.ntuples == 0 row = res[0] row['activo'] = (row['activo'] == 't') if row.key?('activo') row end # Crear un nuevo ámbito def create_ambito(nombre:, descripcion: nil, parent_id: nil, activo: true) query = "INSERT INTO bitacoras.ambitos (nombre, descripcion, parent_id, activo) VALUES ($1, $2, $3, $4) RETURNING *" params = [nombre, descripcion, parent_id, activo ? 't' : 'f'] res = execute(query, params) row = res[0] row['activo'] = (row['activo'] == 't') if row.key?('activo') row end # Actualizar ámbito def update_ambito(id, campos = {}) return nil if campos.empty? set_parts = [] params = [] campos.each_with_index do |(k, v), i| set_parts << "#{k} = $#{i + 1}" params << (v.is_a?(TrueClass) || v.is_a?(FalseClass) ? (v ? 't' : 'f') : v) end params << id query = "UPDATE bitacoras.ambitos SET #{set_parts.join(', ')}, updated_at = CURRENT_TIMESTAMP WHERE id = $#{params.length} RETURNING *" res = execute(query, params) return nil if res.ntuples == 0 row = res[0] row['activo'] = (row['activo'] == 't') if row.key?('activo') row end # Eliminar ámbito def delete_ambito(id) query = "DELETE FROM bitacoras.ambitos WHERE id = $1 RETURNING *" res = execute(query, [id.to_i]) res.ntuples > 0 end # Listar nodos de un ámbito def get_nodos_by_ambito(ambito_id) query = "SELECT * FROM bitacoras.nodos WHERE ambito_id = $1 ORDER BY nombre ASC" res = execute(query, [ambito_id.to_i]) res.map do |r| r['activo'] = (r['activo'] == 't') if r.key?('activo') r end end end end end