From 9fedbbc63c9a3bea780cc84c1473dc4e1e735ece Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Fri, 23 Sep 2022 05:47:57 +0300 Subject: [PATCH] Update validate.js --- scripts/db/validate.js | 51 +++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/scripts/db/validate.js b/scripts/db/validate.js index ae9359be..17c52e1a 100644 --- a/scripts/db/validate.js +++ b/scripts/db/validate.js @@ -1,3 +1,4 @@ +const { transliterate } = require('transliteration') const { logger, file, csv } = require('../core') const { program } = require('commander') const schemes = require('./schemes') @@ -70,11 +71,13 @@ async function main() { if (!schemes[filename]) return handleError(`Error: "${filename}" scheme is missing`) const rows = files[filename] + const rowsCopy = JSON.parse(JSON.stringify(rows)) let fileErrors = [] if (filename === 'channels') { - fileErrors = fileErrors.concat(findDuplicatesById(rows)) - for (const [i, row] of rows.entries()) { + fileErrors = fileErrors.concat(findDuplicatesById(rowsCopy)) + for (const [i, row] of rowsCopy.entries()) { + fileErrors = fileErrors.concat(validateChannelId(row, i)) fileErrors = fileErrors.concat(validateChannelBroadcastArea(row, i)) fileErrors = fileErrors.concat(validateChannelSubdivision(row, i)) fileErrors = fileErrors.concat(validateChannelCategories(row, i)) @@ -83,19 +86,19 @@ async function main() { fileErrors = fileErrors.concat(validateChannelCountry(row, i)) } } else if (filename === 'blocklist') { - for (const [i, row] of rows.entries()) { - fileErrors = fileErrors.concat(validateChannelId(row, i)) + for (const [i, row] of rowsCopy.entries()) { + fileErrors = fileErrors.concat(validateChannel(row, i)) } } else if (filename === 'countries') { - for (const [i, row] of rows.entries()) { + for (const [i, row] of rowsCopy.entries()) { fileErrors = fileErrors.concat(validateCountryLanguage(row, i)) } } else if (filename === 'subdivisions') { - for (const [i, row] of rows.entries()) { + for (const [i, row] of rowsCopy.entries()) { fileErrors = fileErrors.concat(validateSubdivisionCountry(row, i)) } } else if (filename === 'regions') { - for (const [i, row] of rows.entries()) { + for (const [i, row] of rowsCopy.entries()) { fileErrors = fileErrors.concat(validateRegionCountries(row, i)) } } @@ -127,13 +130,13 @@ main() function findDuplicatesById(rows) { rows = rows.map(row => { - row.id = row.id.toLowerCase() + row.normId = row.id.toLowerCase() return row }) const errors = [] - const schema = Joi.array().unique((a, b) => a.id === b.id) + const schema = Joi.array().unique((a, b) => a.normId === b.normId) const { error } = schema.validate(rows, { abortEarly: false }) if (error) { error.details.forEach(detail => { @@ -169,6 +172,34 @@ function findDuplicatesById(rows) { // return errors // } +function validateChannelId(row, i) { + const errors = [] + + let name = normalize(row.name) + let code = row.country + let expected = `${name}.${code}`.toLowerCase() + + if (expected !== row.normId) { + errors.push({ + line: i + 2, + message: `"${row.id}" must be derived from the channel name "${row.name}" and the country code "${row.country}"` + }) + } + + function normalize(name) { + let translit = transliterate(name) + + return translit + .replace(/^@/i, 'At') + .replace(/^&/i, 'And') + .replace(/\+/gi, 'Plus') + .replace(/\s\-/gi, ' Minus') + .replace(/[^a-z\d]+/gi, '') + } + + return errors +} + function validateChannelCategories(row, i) { const errors = [] row.categories.forEach(category => { @@ -252,7 +283,7 @@ function validateChannelLanguages(row, i) { return errors } -function validateChannelId(row, i) { +function validateChannel(row, i) { const errors = [] if (!db.channels[row.channel]) { errors.push({