admin/controllers/user/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 md5 = require('md5')
const adminUserModule = require('../../modules/user').default
const schemaModule = require('./schema').default
const commonFunction = require('../../../common/function').default

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

const userTableAction = async (req) => {
    req.body.id = commonFunction.getValidID(req.body.id)

    const baseTableUsed = global.configColumns.users
    const customTableUsed = global.configColumns.custom_users

    const [results] = await Promise.all([
        commonFunction.tableFunction(req, baseTableUsed, customTableUsed),
    ])
    return results
}

const userMaxBidMailTrigger = async (req) => {
    req.body.filters = {
        id: {
            value: req.body.id,
            type: 'array',
            field: 'u.id',
        },
    }
    let [records] = await Promise.all([adminUserModule.fetchBuyersAll(req, 1)])

    await commonFunction.asyncForEach(records, async (user) => {
        await Promise.all([
            commonFunction.eventTriggerFuction(
                {
                    username: `${user.first_name || ''} ${user.last_name || ''}`,
                    maxbid: req.body.max_bid,
                },
                user.email,
                '',
                'maxbid_limit_accepted',
                1,
                0,
                0,
            ),
        ])
    })

    return false
}

module.exports = {
    /**
     * Get All Users
     *
     * @memberOf adminside.user
     * @param {adminUserModule.fetchBuyersAll} modules
     */
    allbuyers: async (req, res) => {
        req.body.action = typeof req.body.action === 'undefined' ? 'open' : req.body.action
        let records = []
        let totalRecords = []
        let activelots = []
        try {
            ;[records, totalRecords, activelots] = await Promise.all([
                adminUserModule.fetchBuyersAll(req, 1),
                adminUserModule.fetchBuyersAll(req, 0),
            ])
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            let responseData = { records, totalRecords, activelots }
            responseData = await commonFunction.getdynamicinnercontents(req, responseData)
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData,
            })
        }
    },
    /**
     * All bidding buyers
     *
     * @memberOf adminside.user
     * @param {adminUserModule.fetchUsersbyID} modules
     */
    allbiddingbuyers: async (req, res) => {
        req.body.action = typeof req.body.action === 'undefined' ? 'open' : req.body.action
        let records = []
        try {
            ;[records] = await Promise.all([adminUserModule.fetchBiddingBuyersAll(req)])
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            const responseData = { records }
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData,
            })
        }
    },

    /**
     * Get Singer User
     *
     * @memberOf adminside.user
     * @param {adminUserModule.fetchUsersbyID} modules
     */
    getSingleUser: async (req, res) => {
        let record = {}
        try {
            const id = typeof req.body.id === 'undefined' ? '' : req.body.id
            const [records] = await Promise.all([adminUserModule.fetchUsersbyID(id)])
            record = records[0]
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            const responseData = { record }
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData,
            })
        }
    },
    /**
     * User Action
     *
     * @memberOf adminside.user
     * @param {adminUserModule.checkEmailExisting} modules
     * @param {adminUserModule.userOperation} modules
     * @param {adminUserModule.manualInsertUsernotify} modules
     */
    userAction: async (req, res) => {
        try {
            req.body.id =
                typeof req.body.id === 'undefined' || req.body.id === 0 || req.body.id === ''
                    ? null
                    : req.body.id
            // req.body.email =
            //     typeof req.body.email !== 'undefined' ? req.body.email.toLowerCase() : ''
            req.body.emailexists = false
            if (req.body.id) {
                const resultuser = await Promise.all([
                    adminUserModule.checkEmailExisting(req.body.email),
                ])

                if (resultuser[0].length > 0 && typeof req.body.email !== 'undefined') {
                    if (
                        resultuser[0][0].id === req.body.id &&
                        resultuser[0][0].email === req.body.email
                    ) {
                        await Promise.all([userTableAction(req)])
                    } else {
                        req.body.emailexists = true
                    }
                } else {
                    await Promise.all([userTableAction(req)])
                }
                if (req.body.maxbid_limit_request) {
                    await userMaxBidMailTrigger(req)
                }
            } else {
                const resultuser = await Promise.all([
                    adminUserModule.checkEmailExisting(req.body.email),
                ])
                if (resultuser[0].length > 0) {
                    req.body.emailexists = true
                } else {
                    if (!req.body.password) {
                        req.body.password = Math.random().toString(36).slice(2)
                    }
                    req.body.password_salt = '12345'
                    req.body.password_hash = md5(md5(req.body.password) + req.body.password_salt)
                    const usermail = req.body.email.toLowerCase()
                    const firstname = req.body.first_name
                    const lastname = req.body.last_name
                    const loginurl2 = `${global.react_url.front_end}/login`

                    const results = await Promise.all([userTableAction(req)])
                    await Promise.all([
                        adminUserModule.manualInsertUsernotify(results[0][0].insertId),
                    ])

                    await Promise.all([
                        commonFunction.eventTriggerFuction(
                            {
                                username: `${firstname || ''} ${lastname || ''}`,
                                password: req.body.password,
                                loginurl: loginurl2,
                            },
                            usermail,
                            '',
                            'buyer_register_admin',
                            1,
                            0,
                            results[0][0].insertId,
                        ),
                    ])
                }
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            if (req.body.emailexists) {
                jsonResponse(res, 'error', {
                    responseType: 2,
                    message: 'Registration Failed! Email Already Exists.',
                })
            } else {
                const responseData = {}
                jsonResponse(res, 'success', {
                    responseType: 1,
                    message: req.body.id ? 'Successfully updated!' : 'Successfully registered!',
                    responseData,
                })
            }
        }
    },
    /**
     * Change status of the User
     *
     * @memberOf adminside.user
     * @param {adminUserModule.userStatusUpdate} modules
     */
    changeStatus: async (req, res) => {
        try {
            if (req.body.action && req.body.user_id.length > 0) {
                await adminUserModule.userStatusUpdate(req.body.action, req.body.user_id)

                if (req.body.additionalUpdate) {
                    req.body.id = req.body.user_id
                    await Promise.all([userTableAction(req)])
                }
                if (
                    req.body.action === 'active' ||
                    req.body.action === 'rejected' ||
                    req.body.action === 'deactivate'
                ) {
                    const results3 = await Promise.all([
                        adminUserModule.commonselectparenttable(
                            'id,status,first_name,last_name,CONCAT(IFNULL(first_name,"")," ",IFNULL(last_name,"")) AS username,email,phone',
                            req.body.user_id,
                            'id',
                            global.configColumns.users,
                        ),
                    ])
                    let userStatusEmail = 'user_account_status'
                    let userStatus = 'Activated'
                    if (req.body.action === 'active') {
                        userStatusEmail = 'user_account_status'
                        userStatus = 'Activated'
                    } else if (req.body.action === 'deactivate') {
                        userStatusEmail = 'user_account_status'
                        userStatus = 'Deactivated'
                    } else if (req.body.action === 'rejected') {
                        userStatusEmail = 'user_account_reject_status'
                        userStatus = 'Rejected'
                    }
                    req.body.reject_notes = req.body.reject_notes ? req.body.reject_notes : ''
                    await Promise.all([
                        commonFunction.eventTriggerFuction(
                            {
                                username: results3[0][0].username,
                                status: userStatus,
                                content: req.body.reject_notes,
                            },
                            results3[0][0].email,
                            '',
                            userStatusEmail,
                            1,
                            0,
                            results3[0][0].id,
                        ),
                    ])
                }
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            const responseData = {}
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Status successfully changed',
                responseData,
            })
        }
    },
    /**
     * Add User
     *
     * @memberOf adminside.user
     * @param {adminUserModule.createuserlist} modules
     */
    userAdd: async (req, res) => {
        try {
            const userlist = await Promise.all([
                adminUserModule.createuserlist(req, req.body, global.configColumns.users),
            ])
            if (global.configColumns.custom_users.enabled) {
                req.body.user_id = userlist[0].insertId
                await Promise.all([
                    adminUserModule.createuserlist(
                        req,
                        req.body,
                        global.configColumns.custom_users,
                    ),
                ])
            }
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
            })
        } catch (e) {
            errorResponse(e, res)
        }
    },
    /**
     * Add Update
     *
     * @memberOf adminside.user
     * @param {adminUserModule.updatealltypeofproduct} modules
     * @param {adminUserModule.updatealltypeofuser} modules
     */
    userUpdate: async (req, res) => {
        try {
            await Promise.all([
                adminUserModule.updatealltypeofproduct(
                    req,
                    req.body,
                    req.body.id,
                    'id',
                    global.configColumns.users,
                ),
            ])

            if (global.configColumns.custom_users.enabled) {
                await Promise.all([
                    adminUserModule.updatealltypeofuser(
                        req,
                        req.body,
                        req.body.id,
                        'user_id',
                        global.configColumns.custom_users,
                    ),
                ])
            }

            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
            })
        } catch (e) {
            errorResponse(e, res)
        }
    },
    /**
     * List all Users
     *
     * @memberOf adminside.user
     * @param {adminUserModule.commonselectparenttable} modules
     */
    userListing: async (req, res) => {
        try {
            const usersobj = {}
            const [baseuserlist] = await Promise.all([
                adminUserModule.commonselectparenttable(
                    '*',
                    req.body.id,
                    'id',
                    global.configColumns.users,
                ),
            ])
            usersobj.user_list = baseuserlist
            if (global.configColumns.custom_users.enabled) {
                const [baseuserlistcus] = await Promise.all([
                    adminUserModule.commonselectparenttable(
                        '*',
                        req.body.id,
                        'user_id',
                        global.configColumns.custom_users,
                    ),
                ])
                usersobj.usercus_list = baseuserlistcus
            }
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                usersobj,
            })
        } catch (e) {
            errorResponse(e, res)
        }
    },
    /**
     * Get single action user
     *
     * @memberOf adminside.user
     * @param {commonFunction.getValidID} modules
     * @param {commonFunction.fetchTableFunction} modules
     */
    getSingleActionUser: async (req, res) => {
        let record = {}
        try {
            const id = typeof req.body.id === 'undefined' ? '' : req.body.id
            req.body.id = commonFunction.getValidID(req.body.id)
            const baseTableUsed = global.configColumns.users
            const customTableUsed = global.configColumns.custom_users

            const [records] = await Promise.all([
                commonFunction.fetchTableFunction(req, baseTableUsed, customTableUsed),
            ])
            record = records[0]
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            const responseData = { record }
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData,
            })
        }
    },
}