Source: services/entities-cli/select.js

'use strict'

const anLog = require('an-log')('lassi-cli')
const { addConditions, grab } = require('./_helpers')

// sera redéfini par chaque commande pour avoir le bon préfixe
let log = (...args) => anLog('entities-cli select', ...args)
const defaultLimit = 100

/**
 * Affiche les entités demandées
 * @param {string} entityName Le nom de l'entité, mettre help pour avoir la syntaxe des arguments
 * @param {string} [fields=''] Liste des champs à afficher (séparateur virgule)
 * @param {string} [wheres=''] Liste de conditions (array en json)
 * @param {string} [options=''] Liste de conditions (array en json)
 * @param {errorCallback} done
 */
function select (entityName, fields, wheres, options, done) {
  /**
   * Affiche une entité
   * @private
   * @param entity
   * @param next
   */
  function printOne (entity, next) {
    if (fields) {
      // en ligne
      log(fieldList.reduce((acc, field) => acc + entity[field] + '\t| ', ''))
    } else {
      // le json
      log('\n' + JSON.stringify(entity, null, 2))
    }
    next()
  }

  log = (...args) => anLog('entities-cli select', ...args)
  if (!arguments.length) throw new Error('Erreur interne, aucun arguments de commande')
  if (arguments.length === 2) {
    done = fields
    fields = ''
    wheres = ''
    options = ''
  } else if (arguments.length === 3) {
    done = wheres
    wheres = ''
    options = ''
  } else if (arguments.length === 4) {
    done = options
    options = ''
  }
  if (typeof done !== 'function') throw new Error('Erreur interne, pas de callback de commande')
  if (typeof entityName !== 'string') return done(new Error('Il faut passer un nom d’entity (ou "help") en 1er argument'))

  const opts = {}
  options.split(',').forEach(elt => {
    const opt = elt.trim()
    if (opt) opts[opt] = true
  })

  const fieldList = fields ? fields.split(',').map(field => field.trim()) : []

  let query
  let Entity
  try {
    try {
      Entity = lassi.service(entityName)
    } catch (error) {
      return done(new Error(`Aucune entity nommée ${entityName} (utiliser la commande "allServices" pour voir services et entités)`))
    }
    query = addConditions(Entity, wheres)

    // Ligne de titres sommaire
    let titles = ''
    if (fields) {
      titles = fieldList.reduce((acc, field) => acc + field + '\t| ', '')
      log(titles)
    }

    const groupCb = (start, nb) => {
      if (opts.quiet) return
      log(`\n\n(fin select de ${start} à ${start + nb})`)
      if (nb === defaultLimit) log(titles)
    }

    grab(
      query,
      defaultLimit,
      printOne,
      { groupCb },
      done
    )
  } catch (error) {
    done(error)
  }
}
select.help = function selectHelp () {
  log = (...args) => anLog('entities-cli select', 'usage', ...args)
  log(`
La commande select demande 1 à 3 arguments :
#1 : le nom de l’entité cherchée
#2 : (facultatif) la liste des champs à afficher, mettre une chaine vide pour les afficher tous
#3 : (facultatif) une chaine json présentant un tableau de conditions
       dont chaque élément est un tableau [champ, condition, valeur]
       condition doit être parmi : = > < >= <= <> in notIn isNull isNotNull
       Pour les conditions in|notIn, valeur doit être une liste (séparateur virgule)
#4 : (facultatif) une chaine présentant la liste des options (séparateur virgule)
       options: quiet => ne pas répéter la ligne de titre`)
}

module.exports = select