admin/modules/user.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  # ||
|| # ---------------------------------------------------------------------- # ||
|| ########################################################################## ||
\* ============================================================================ */

const dateFormat = require('dateformat')
const md5 = require('md5')
const _ = require('underscore')
const moment = require('moment')
const commonSQL = require('../../common/sql').default
const commonProduct = require('../../common/products').default
const mysqclass = require('./mysqli').default
/**
 * @class class to handle user functions
 */
class adminUserModule {
    /**
     * Fetch All Buyers
     * @param {object} req request data
     * @param {string} count count for the pagination
     * @returns {object} sql response
     */
    static async fetchBuyersAll(req, count) {
        const mysql = {}
        const { action } = req.body
        const baseTableUsed = global.configColumns.users
        const customTableUsed = global.configColumns.custom_users

        let row = ''
        let where = ''
        let limitf = ''
        let order = ''
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
        if (typeof req.body.limit === 'undefined') {
            req.body.limit = global.configurations.variables.search_limit || 25
        }
        if (typeof req.body.page === 'undefined') {
            req.body.page = 1
        }

        order = `order by u.id desc`
        if (req.body.orderby || req.body.order) {
            const sortReturn = commonProduct.sortOrderData(req, where)
            if (sortReturn.order) {
                order = sortReturn.order
            }
            if (sortReturn.where) {
                where += sortReturn.where
            }
        }

        if (req.body.similars) {
            where += commonProduct.similarData(req)
        }
        if (req.body.filters) {
            where += commonProduct.filterData(req)
        }

        const generatedData = commonProduct.generateJoinWithColum(baseTableUsed, customTableUsed, [
            'id',
        ])

        mysql.customTableJoin = generatedData.customTableJoin
        mysql.columns = generatedData.rowstoFetch

        if (
            global.configColumns.third_payment_north &&
            global.configColumns.third_payment_north.enabled === 1
        ) {
            const additionalTable2 = global.configColumns.third_payment_north
            const customAdditionalTable2 = { enabled: 0 }

            const additionalGeneratedData2 = commonProduct.additionalTableJoin(
                additionalTable2,
                customAdditionalTable2,
                baseTableUsed,
                'left join',
                'user_id',
                'id',
            )

            mysql.customTableJoin = `${mysql.customTableJoin} ${additionalGeneratedData2.customTableJoin} `
            mysql.columns = mysql.columns.concat(additionalGeneratedData2.rowstoFetch)
        }

        row = count === 1 ? 'get_all_buyers_limit' : 'get_all_buyers'
        const limitrg = req.body.limit
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }

        const escapeData = []
        if (count === 1) {
            let pagen = (req.body.page - 1) * limitrg
            if (parseInt(pagen, 10) < 0) {
                pagen = 0
            }
            limitf = ` limit ${pagen},${limitrg}`
        }

        mysql.order = order
        mysql.where = where
        mysql.limitf = limitf
        mysql.dateNow = dateNow

        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Fetch Bidding buyers All
     * @param {object} req request data
     * @returns {object} sql response
     */
    static async fetchBiddingBuyersAll(req) {
        const mysql = {}

        let row = ''
        let where = ''
        let order = ''
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')

        order = `order by u.id desc`
        if (req.body.orderby || req.body.order) {
            const sortReturn = commonProduct.sortOrderData(req, where)
            if (sortReturn.order) {
                order = sortReturn.order
            }
            if (sortReturn.where) {
                where += sortReturn.where
            }
        }

        if (req.body.similars) {
            where += commonProduct.similarData(req)
        }
        if (req.body.filters) {
            where += commonProduct.filterData(req)
        }

        mysql.columns = ['id', 'email', 'first_name', 'last_name']

        row = 'get_all_bidding_buyers'
        const escapeData = []

        mysql.order = order
        mysql.where = where
        mysql.dateNow = dateNow

        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Fetch Single User
     * @param {number} pid User ID which details has to be fetched
     * @returns {object} sql response
     */
    static async fetchUsersbyID(pid) {
        const mysql = {}
        const escapeData = [pid]
        const strQuery = await mysqclass.mysqli(mysql, 'get_single_user_buyer')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Check Email Exists
     * @param {string} nameID Email which has to be checked for unique
     * @returns {object} sql response
     */
    static async checkEmailExisting(nameID) {
        const mysql = {}
        const escapeData = [nameID]
        const strQuery = await mysqclass.mysqli(mysql, 'check_email_exists')
        const data = await global.mysql.query(strQuery, escapeData)
        return data
    }

    /**
     * User Operation to update or insert
     * @param {object} req req object
     * @returns {object} sql response
     */
    static async userOperation(req) {
        const mysql = {}
        const postData = req.body
        const acceptedObjects = [
            'first_name',
            'last_name',
            'address1',
            'status',
            'email',
            'password_hash',
            'password_salt',
            'phone',
            'city',
            'state',
            'zip',
        ]
        let escapeData = []
        let row = ''
        if (req.body.id) {
            const defaultKeys = ['updated_at']
            const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
            const valueInsert = commonSQL.updateSQLFunction(
                postData,
                acceptedObjects,
                defaultKeys,
                defaultValues,
            )
            mysql.keys = valueInsert.keys
            escapeData = valueInsert.escapeData
            row = 'update_on_users'
            mysql.user_id = req.body.id
        } else {
            req.body.password_salt = '12345'
            req.body.password_hash = md5(md5(req.body.password) + req.body.password_salt)
            const defaultKeys = ['created_at']
            const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
            const valueInsert = commonSQL.InsertSQLFunction(
                postData,
                acceptedObjects,
                defaultKeys,
                defaultValues,
            )
            mysql.keys = valueInsert.keys
            escapeData = valueInsert.escapeData
            row = 'insert_into_users'
        }
        const strQuery = await mysqclass.mysqli(mysql, row)
        const data = await global.mysql.query(strQuery, escapeData)
        return data
    }

    /**
     * Manual insert notification
     * @param {number} uid user ID which notification has to be added
     * @returns {object} sql response
     */
    static async manualInsertUsernotify(uid) {
        const mysql = {}
        const escapeData = [uid]
        const strQuery = await mysqclass.mysqli(mysql, 'insert_into_notification')
        const data = await global.mysql.query(strQuery, escapeData)
        return data
    }

    /**
     * Update user status
     * @param {string} status status which has to be updated
     * @param {number} uid user ID where status to be updated
     * @returns {object} sql response
     */
    static async userStatusUpdate(status, pid) {
        const mysql = {}
        const escapeData = [status, pid]
        const strQuery = await mysqclass.mysqli(mysql, 'user_change_market_status')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        console.log('dataReturn', strQuery, escapeData)
        return dataReturn
    }

    /**
     * Create a user insert query
     * @param {object} req request data
     * @param {object} data request.body data
     * @param {string} baseTableUsed baseTable which the query has to be generated
     * @returns {object} sql response
     */
    static async createuserlist(req, data, baseTableUsed) {
        const mysqli = {}
        let escapeData = []
        const postData = data
        const acceptedObjects = baseTableUsed.array_columns
        const defaultKeys = ['created_at', 'updated_at']
        const defaultValues = [
            dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
            dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
        ]
        const valueInsert = commonSQL.InsertSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysqli.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysqli.values = valueInsert.values
        mysqli.tables = baseTableUsed.ext_name
        const strQuery = await mysqclass.mysqli(mysqli, 'insert_tables')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }

    /**
     * Update query for the users
     * @param {object} req request data
     * @param {object} data request.body data
     * @param {string} baseTableUsed baseTable which the query has to be generated
     * @returns {object} sql response
     */
    static async updatealltypeofuser(req, data, proid, typeoffield, baseTableUsed) {
        const mysqli = {}
        let escapeData = []
        const postData = data
        const postID = proid
        const fieldType = typeoffield
        const acceptedObjects = baseTableUsed.array_columns
        const defaultKeys = ['updated_at']
        const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
        const valueInsert = commonSQL.updateSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysqli.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysqli.values = ` ${fieldType}=${postID}`
        mysqli.tables = baseTableUsed.ext_name
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }

    /**
     * Select query to fetch all users
     * @param {object} data request.body data
     * @param {string} baseTableUsed baseTable which the query has to be generated
     * @returns {object} sql response
     */
    static async commonselectparenttable(data, proid, baseid, baseTableUsed) {
        const mysqli = {}
        const escapeData = [proid]
        mysqli.keys = data
        mysqli.values = `${baseid} IN (?)`
        mysqli.tables = baseTableUsed.ext_name
        mysqli.group_by = ''
        mysqli.order_by = ''
        mysqli.limit_by = ''
        const strQuery = await mysqclass.mysqli(mysqli, 'select_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Get particula table details
     * @param {object} data request.body data
     * @param {string} fieldType fieldType
     * @param {number} postID post ID
     * @param {string} baseTableUsed baseTable which the query has to be generated
     * @param {number} limit limt the table retrive records
     * @returns {object} sql response
     */
    static async getparticulartabledetails(data, fieldType, postID, baseTableUsed, limit) {
        const mysqli = {}
        const escapeData = []
        mysqli.keys = data
        mysqli.values = ` ${fieldType}="${postID}"`
        mysqli.tables = baseTableUsed
        mysqli.group_by = ''
        mysqli.order_by = ''
        if (limit > 0) {
            mysqli.limit_by = ` limit ${limit}`
        } else {
            mysqli.limit_by = ''
        }
        const strQuery = await mysqclass.mysqli(mysqli, 'select_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
}

module.exports.default = adminUserModule