Files
dtic-DIIAA/adn/tools/db/core/ambito_db.rb
T
Ricardo Monla 160da47f96 [P2606] WebServer NGINX: plan actualizado, ficha nodo, HTTPS operativo
- P2606: Plan v1.1 EN EJECUCIÓN. Fases 1-3 completadas.
- Ficha nodo srvv-nginx-rm.md. P2606 en adn/07_proyectos.md.
- Incluye cambios acumulados de sesiones anteriores.
2026-03-28 12:18:42 -03:00

104 lines
3.2 KiB
Ruby

# 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