admin/controllers/language/index.js

/* ============================================================================ *\
|| ########################################################################## ||
|| # Auction Software Marketplace          Release: 0.6   Build 0.7         # ||
|| # ---------------------------------------------------------------------- # ||
|| # License # 35YAHCNR9344X6O666C123AB                                     # ||
|| # ---------------------------------------------------------------------- # ||
|| # Copyright ©2014–2021 Develop Scripts LLC. All Rights Reserved          # ||
|| # This file may not be redistributed in whole or significant part.       # ||
|| # ------------- AUCTION SOFTWARE IS NOT FREE SOFTWARE ------------------ # ||
|| # http://www.auctionsoftwaremarketplace.com|support@auctionsoftware.com  # ||
|| # ---------------------------------------------------------------------- # ||
|| ########################################################################## ||
\* ============================================================================ */

/* eslint-disable prefer-destructuring */
/* eslint-disable no-param-reassign */
const jwt = require('jsonwebtoken')
const _ = require('underscore')
const parse = require('csv-parse')

const adminlanguageModule = require('../../modules/language').default
const commonFunction = require('../../../common/function').default

const { jsonResponse } = require('../logger')

const globalLangugae = async (req, text) => {
    const phrase = []
    const resultsData2 = {}
    const languages = await Promise.all([await adminlanguageModule.getHomephraseslang(req)])
    const homephrase = await Promise.all([await adminlanguageModule.getHomephrases(req)])
    _.each(languages, (val) => {
        phrase[val.language] = []
    })
    if (homephrase.length > 0) {
        _.each(homephrase, (phraseexist) => {
            _.each(languages, (val) => {
                phrase[val.language][phraseexist.phrase] = phraseexist[val.language_slug]
            })
        })
    }

    resultsData2.all_languages = languages
    resultsData2.phrase = phrase
    return resultsData2
}

module.exports = {
    /**
     * get Language
     *
     * @memberOf adminside.language
     * @param {adminlanguageModule.getAllGroups} modules
     * @param {adminlanguageModule.getAllPhrases} modules
     * @param {adminlanguageModule.getAllPhrasesLang} modules
     */
    getLanguage: async (req, res) => {
        const resultsData = {}
        try {
            const latestlang = await globalLangugae(req, 'language')
            req.body.all_languages = latestlang.all_languages
            const [grops, phrases, phraseslanguage, phraseslanguageLength] = await Promise.all([
                adminlanguageModule.getAllGroups(req),
                adminlanguageModule.getAllPhrases(req),
                adminlanguageModule.getAllPhrasesLang(req, 0),
                adminlanguageModule.getAllPhrasesLang(req, 1),
            ])

            resultsData.languages = latestlang.all_languages[0]
            resultsData.grops = grops
            resultsData.phrases = phrases
            resultsData.phraseslanguage = phraseslanguage
            resultsData.phraseslanguageLength = phraseslanguageLength
            resultsData.used_language = 'used_language'
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData: resultsData,
            })
        }
    },
    /**
     * add Phrase
     *
     * @memberOf adminside.language
     * @param {adminlanguageModule.checkPhrase} modules
     * @param {adminlanguageModule.updatePhrase} modules
     * @param {adminlanguageModule.addPhrase} modules
     */
    addPhrase: async (req, res) => {
        const resultsData = {}
        try {
            const sellang = req.body.sellang
            const [checkPhrase] = await Promise.all([adminlanguageModule.checkPhrase(req)])
            if (checkPhrase.length > 0) {
                if (req.body.id) {
                    await adminlanguageModule.updatePhrase(req)
                } else {
                    resultsData.phrase_exist = 1
                }
            } else {
                await adminlanguageModule.addPhrase(req)
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            jsonResponse(res, resultsData.phrase_exist ? 'error' : 'success', {
                responseType: 1,
                message: resultsData.phrase_exist
                    ? 'Variable already exists'
                    : 'Successfully added',
                responseData: resultsData,
            })
        }
    },
    /**
     * add Language Group
     *
     * @memberOf adminside.language
     * @param {adminlanguageModule.checkGroups} modules
     * @param {adminlanguageModule.addGroups} modules
     */
    addLangGroup: async (req, res) => {
        const resultsData = {}
        try {
            const [checkGroup] = await Promise.all([adminlanguageModule.checkGroups(req)])
            if (checkGroup.length > 0) {
                resultsData.group = 1
            } else {
                await adminlanguageModule.addGroups(req)
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Successfully added',
                responseData: resultsData,
            })
        }
    },
    /**
     * Phrase Search
     *
     * @memberOf adminside.language
     * @param {adminlanguageModule.phraseSearch} modules
     */
    phraseSearch: async (req, res) => {
        const resultsData = {}
        try {
            const latestlang = await globalLangugae(req, 'language')
            req.body.all_languages = latestlang.all_languages
            const [phraseslanguage, phraseslanguageLength, activelots] = await Promise.all([
                adminlanguageModule.phraseSearch(req, 0),
                adminlanguageModule.phraseSearch(req, 1),
            ])
            resultsData.phraseslanguage = phraseslanguage
            resultsData.phraseslanguageLength = phraseslanguageLength
            resultsData.activelots = activelots
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData: resultsData,
            })
        }
    },
    /**
     * Phrase Search Text
     *
     * @memberOf adminside.language
     * @param {adminlanguageModule.getAllPhrasesLang} modules
     * @param {commonFunction.getdynamicinnercontents} modules
     */
    phraseSearchText: async (req, res) => {
        let resultsData = {}
        try {
            const latestlang = await globalLangugae(req, 'language')
            req.body.all_languages = latestlang.all_languages
            const [phraseslanguage, phraseslanguageLength, activelots] = await Promise.all([
                adminlanguageModule.getAllPhrasesLang(req, 0),
                adminlanguageModule.getAllPhrasesLang(req, 1),
            ])
            resultsData.records = phraseslanguage
            resultsData.totalRecords = [phraseslanguageLength]
            resultsData.activelots = activelots
            resultsData = await commonFunction.getdynamicinnercontents(req, resultsData)
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData: resultsData,
            })
        }
    },
    /**
     * Phrase Search Text
     *
     * @memberOf adminside.language
     * @param {adminlanguageModule.getAllPhrasesLang} modules
     * @param {commonFunction.getdynamicinnercontents} modules
     */
    getAllGroup: async (req, res) => {
        let resultsData = {}
        try {
            const [group, groupLength, activelots] = await Promise.all([
                adminlanguageModule.getAllGroups(req, 0),
                adminlanguageModule.getAllGroups(req, 1),
            ])
            resultsData.records = group
            resultsData.totalRecords = [groupLength]
            resultsData.activelots = activelots
            resultsData = await commonFunction.getdynamicinnercontents(req, resultsData)
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData: resultsData,
            })
        }
    },
    /**
     * update phrase
     *
     * @memberOf adminside.language
     * @param {adminlanguageModule.updatesinglePhrase} modules
     */
    updatePhrase: async (req, res) => {
        const resultsData = {}
        try {
            await Promise.all([await adminlanguageModule.updatesinglePhrase(req)])
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Successfully changed',
                responseData: resultsData,
            })
        }
    },
    /**
     * getHomePhrase
     *
     * @memberOf adminside.language
     * @param {adminlanguageModule.getHomephrases} modules
     */
    getHomePhrase: async (req, res) => {
        const resultsData = {}
        try {
            await Promise.all([await adminlanguageModule.getHomephrases(req)])
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData: resultsData,
            })
        }
    },
    /**
     * getHomePhraseLoad
     *
     * @memberOf adminside.language
     * @param {globalLangugae} modules
     */
    getHomePhraseLoad: async (req, res) => {
        const resultsData = {}
        try {
            const latestlang = await globalLangugae(req, 'language')
            resultsData.all_languages = latestlang.all_languages
            resultsData.phrase = latestlang.phrase
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Successfully changed',
                responseData: resultsData,
            })
        }
    },
    /**
     * languagephrase_import
     *
     * @memberOf adminside.language
     * @param {adminlanguageModule.checkPhrase} modules
     * @param {adminlanguageModule.updatePhrase} modules
     * @param {adminlanguageModule.updateLanguagePhrase} modules
     */
    languagephrase_import: async (req, res) => {
        const fs = require('fs')

        const languageColumn = req.body.activeLang
        const rs = fs.createReadStream(`./public/uploads/temp/${req.body.uploadFiles[0]}`)
        const parser = parse(
            {
                columns: true,
            },
            async (err, data) => {
                const validCols = ['group_id', 'phrase', languageColumn]
                const lang = []
                if (parser.options.columns.length === validCols.length) {
                    if (
                        parser.options.columns[2] &&
                        parser.options.columns[2].name === validCols[2]
                    ) {
                        const counts = data.length
                        for (let i = 0; i < counts; i += 1) {
                            lang.phrase = data[i].phrase
                            lang.words = data[i][languageColumn]
                            lang.group_id = data[i].group_id
                            lang.lang_column = languageColumn
                            const [checkPhrase] = await Promise.all([
                                adminlanguageModule.checkPhrase(req, lang),
                            ])
                            if (checkPhrase.length > 0) {
                                await adminlanguageModule.updatePhrase(req, lang)
                            } else {
                                await adminlanguageModule.updateLanguagePhrase(req, lang)
                            }

                            if (counts === i + 1) {
                                jsonResponse(res, 'success', {
                                    responseType: 1,
                                    message: 'Status successfully added',
                                    responseData: [],
                                })
                            }
                        }
                    } else {
                        jsonResponse(res, 'error', {
                            responseType: 3,
                            message: 'Language selected is not added on CSV',
                        })
                    }
                } else {
                    jsonResponse(res, 'error', {
                        responseType: 3,
                        message:
                            'Only three columns are permitted in CSV. They are group_id,phrase and Language name in small letter preceeded by for_',
                    })
                }
            },
        )
        await rs.pipe(parser)
    },
}