All files / src/helpers dockerTargets.js

0% Statements 0/27
0% Branches 0/20
0% Functions 0/7
0% Lines 0/22

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88                                                                                                                                                                               
/**
 * Filtrage des containers Docker par les targets d'un groupe.
 *
 * Utilise par docker.js, logs.js, backups.js pour restreindre
 * la visibilite des containers aux membres d'un groupe.
 *
 * @module helpers/dockerTargets
 */
 
const { pool: db } = require('../db');
 
/**
 * Charge les docker targets d'un groupe pour un serveur.
 * @param {string} groupId
 * @param {string} serverId
 * @returns {Promise<Array<{target_type: string, match_method: string, selector: string}>>}
 */
async function loadGroupTargets(groupId, serverId) {
  const { rows } = await db.query(
    'SELECT target_type, match_method, selector FROM access_group_docker_targets WHERE group_id = $1 AND server_id = $2',
    [groupId, serverId],
  );
  return rows;
}
 
/**
 * Verifie si un nom de container/service matche les targets du groupe.
 * @param {string} containerName — Nom du container (ex: "coolcare_backend.1.abc123")
 * @param {Array} targets — Targets charges via loadGroupTargets
 * @param {Object} [labels] — Labels Docker du container (optionnel)
 * @returns {boolean}
 */
function matchesTargets(containerName, targets, labels = {}) {
  const serviceName = containerName.split('.')[0];
  return targets.some((t) => {
    if (t.match_method === 'name') {
      return containerName === t.selector || serviceName === t.selector;
    }
    if (t.match_method === 'label') {
      const [key, value] = t.selector.split('=');
      return labels[key] === value;
    }
    return false;
  });
}
 
/**
 * Filtre une liste de containers par les targets Docker du groupe.
 * En mode global (access null), retourne tout.
 * Si aucun target configure, retourne une liste vide.
 *
 * @param {Array} containers — Objets avec au minimum { name } ou { Names }
 * @param {object|null} access — req.access (contexte groupe)
 * @param {string} serverId — ID du serveur
 * @returns {Promise<Array>}
 */
async function filterByGroupTargets(containers, access, serverId) {
  if (!access) return containers;
 
  const targets = await loadGroupTargets(access.groupId, serverId);
  if (targets.length === 0) return [];
 
  return containers.filter((c) => {
    const name = c.name || c.Names || '';
    return matchesTargets(name, targets, c.labels || {});
  });
}
 
/**
 * Filtre une liste de noms de containers (strings) par les targets du groupe.
 * Utile pour les scans (logs, backups) qui retournent des noms simples.
 *
 * @param {string[]} names — Liste de noms de containers
 * @param {object|null} access — req.access
 * @param {string} serverId
 * @returns {Promise<string[]>}
 */
async function filterNamesByGroupTargets(names, access, serverId) {
  if (!access) return names;
 
  const targets = await loadGroupTargets(access.groupId, serverId);
  if (targets.length === 0) return [];
 
  return names.filter((name) => matchesTargets(name, targets));
}
 
module.exports = { filterByGroupTargets, filterNamesByGroupTargets, matchesTargets, loadGroupTargets };