- 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.
104 lines
3.2 KiB
Ruby
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
|
|
|
|
|