2020-06-08 01:41:12 +00:00
'use strict' ;
const config = require ( 'config' ) ;
const logger = require ( './logger' ) ( _ _filename ) ;
const argv = require ( './argv' ) ;
const knex = require ( './knex' ) ;
const whereOr = require ( './utils/where-or' ) ;
function curateEntity ( entity , includeParameters = false ) {
const curatedEntity = {
id : entity . id ,
name : entity . name ,
url : entity . url ,
description : entity . description ,
slug : entity . slug ,
2020-06-15 01:58:35 +00:00
type : entity . type ,
2020-06-08 01:41:12 +00:00
parameters : includeParameters ? entity . parameters : null ,
2020-06-15 01:58:35 +00:00
parent : entity . parent ,
children : ( entity . children || [ ] ) . map ( child => curateEntity ( child ) ) ,
2020-06-08 01:41:12 +00:00
} ;
return curatedEntity ;
}
async function curateEntities ( entities , includeParameters ) {
return Promise . all ( entities . map ( async entity => curateEntity ( entity , includeParameters ) ) ) ;
}
2020-06-15 01:58:35 +00:00
async function fetchSitesFromArgv ( ) {
2020-06-08 01:41:12 +00:00
const rawEntities = await knex . raw ( `
WITH RECURSIVE temp AS (
2020-06-15 01:58:35 +00:00
SELECT
id , parent _id , name , slug , type , url , description , parameters
FROM
entities
WHERE
slug = ANY ( ? ) AND entities . type = 1
UNION ALL
SELECT
entities . id , entities . parent _id , entities . name , entities . slug , entities . type , entities . url , entities . description , entities . parameters
FROM
entities
INNER JOIN
temp ON temp . id = entities . parent _id
)
SELECT
entities . * , row _to _json ( parents ) as parent , json _agg ( temp ) as children
FROM
temp
LEFT JOIN
entities ON entities . id = temp . parent _id
LEFT JOIN
entities AS parents ON parents . id = entities . parent _id
WHERE
temp . type = 2
GROUP BY
temp . parent _id , entities . id , entities . name , parents . id
UNION ALL
SELECT
entities . * , row _to _json ( parents ) as parent , json _build _array ( row _to _json ( children ) )
FROM
entities AS children
LEFT JOIN
entities ON entities . id = children . parent _id
LEFT JOIN
entities AS parents ON parents . id = entities . parent _id
WHERE
children . slug = ANY ( ? ) AND children . type = 2
GROUP BY
entities . id , parents . id , children . id ;
` , [argv.networks || [], argv.sites || []]);
2020-06-08 01:41:12 +00:00
const curatedEntities = await curateEntities ( rawEntities . rows , true ) ;
logger . info ( ` Found ${ curatedEntities . length } entities in database ` ) ;
2020-06-15 01:58:35 +00:00
console . log ( rawEntities . rows ) ;
2020-06-08 01:41:12 +00:00
return curatedEntities ;
}
2020-06-15 01:58:35 +00:00
async function fetchSitesFromConfig ( ) {
2020-06-08 01:41:12 +00:00
const rawSites = await knex ( 'entities' )
. select ( 'entities.*' )
. leftJoin ( 'entities as entities_parents' , 'entities_parents.id' , 'entities.id' )
. where ( ( builder ) => {
if ( config . include ) {
builder . whereIn ( 'entities.slug' , config . include ) ;
}
} )
. whereNot ( ( builder ) => {
builder . whereIn ( 'entities.slug' , config . exclude || [ ] ) ;
} ) ;
2020-06-15 01:58:35 +00:00
const curatedSites = await curateEntities ( rawSites , true ) ;
logger . info ( ` Found ${ curatedSites . length } entities in database ` ) ;
2020-06-08 01:41:12 +00:00
return curatedSites ;
}
async function fetchIncludedEntities ( ) {
if ( argv . networks || argv . sites ) {
2020-06-15 01:58:35 +00:00
return fetchSitesFromArgv ( ) ;
2020-06-08 01:41:12 +00:00
}
2020-06-15 01:58:35 +00:00
return fetchSitesFromConfig ( ) ;
2020-06-08 01:41:12 +00:00
}
async function fetchSites ( queryObject ) {
const sites = await knex ( 'sites' )
. where ( builder => whereOr ( queryObject , 'sites' , builder ) )
. select (
'sites.*' ,
'networks.name as network_name' , 'networks.slug as network_slug' , 'networks.url as network_url' , 'networks.description as network_description' , 'networks.parameters as network_parameters' ,
)
. leftJoin ( 'networks' , 'sites.network_id' , 'networks.id' )
. limit ( 100 ) ;
2020-06-15 01:58:35 +00:00
return curateEntities ( sites ) ;
2020-06-08 01:41:12 +00:00
}
async function fetchSitesFromReleases ( ) {
const sites = await knex ( 'releases' )
. select ( 'site_id' , '' )
. leftJoin ( 'sites' , 'sites.id' , 'releases.site_id' )
. groupBy ( 'sites.id' )
. limit ( 100 ) ;
2020-06-15 01:58:35 +00:00
return curateEntities ( sites ) ;
2020-06-08 01:41:12 +00:00
}
module . exports = {
curateEntity ,
curateEntities ,
fetchIncludedEntities ,
fetchSites ,
2020-06-15 01:58:35 +00:00
fetchSitesFromConfig ,
fetchSitesFromArgv ,
2020-06-08 01:41:12 +00:00
fetchSitesFromReleases ,
} ;