Your IP : 216.73.216.91


Current Path : /var/node/inatote/Inatote-Backend/users/
Upload File :
Current File : /var/node/inatote/Inatote-Backend/users/user.js

import requiredParam from '../helpers/required-param.js'
import { InvalidPropertyError } from '../helpers/errors.js'
import isValidEmail from '../helpers/is-valid-email.js'
import upperFirst from '../helpers/upper-first.js'

export default function makeUser(
    userInfo = requiredParam('userInfo')
) {
    const validuser = validate(userInfo)
    const normaluser = normalize(validuser)

    return Object.freeze(normaluser)

    function validate({
        firstName = requiredParam('firstName'),
        lastName = requiredParam('lastName'),
        emailAddress = requiredParam('emailAddress'),
        userType = requiredParam('userType'),
        mobileNumber = requiredParam('mobileNumber'),
        password = requiredParam('password'),
        // smsCode = requiredParam("smsCode"),
        // emailCode = requiredParam("emailCode"),
        // imageURL = requiredParam('imageURL'),
        // address = requiredParam('address'),
        ...otherInfo
    } = {}) {
        validateName('first', firstName)
        validateName('last', lastName)
        validateEmail(emailAddress)
        validateType(userType);
        validateMobileNumber(mobileNumber)
        validatePassword(password)
        // validateImageUrl(imageURL);
        // validateAddress(address)

        var d = { firstName, lastName, emailAddress, userType,mobileNumber, password, ...otherInfo }
        return d
    }

    function validateType(type) {
        if (!(type == "Admin" || type == "Vendor" || type == "Rider" || type == "Client")) {
            throw new InvalidPropertyError(
                `Invalid user type.`
            )
        }
    }

    function validateImageUrl(url) {
        if (url.length < 1) {
            throw new InvalidPropertyError("Image is required")
        }
    }

    function validateMobileNumber(mobileNumber) {
        if (!mobileNumber.startsWith("+92") && !mobileNumber.length > 9) {
            throw new InvalidPropertyError("Mobile number is required")
        }
    }

    // function validateAddress(address){
    //     let keys = Object.keys(address[0])
    //     if(typeof address !== "object"){
    //         throw new InvalidPropertyError(
    //             `Address must be in form of array`
    //         )
    //     }
    //     else if (!keys.includes("street")){
    //         throw new InvalidPropertyError(
    //             `Street is required in address`
    //         )
    //     }
    //     else if (!keys.includes("city")){
    //         throw new InvalidPropertyError(
    //             `City is required in address`
    //         )
    //     }
    //     else if (!keys.includes("country")){
    //         throw new InvalidPropertyError(
    //             `Country is required in address`
    //         )
    //     }
    //     else if (!keys.includes("state")){
    //         throw new InvalidPropertyError(
    //             `state is required in address`
    //         )
    //     }
    //     else if (!keys.includes("location")){
    //         throw new InvalidPropertyError(
    //             `location is required in address`
    //         )
    //     }


    // }

    function validateSubType(type) {
        if (!(type == "SubAdmin" || type == "SubVendor" || type == "Default")) {
            throw new InvalidPropertyError(
                `Invalid user sub type.`
            )
        }
    }

    function validateName(label, name) {
        if (name.length < 2) {
            throw new InvalidPropertyError(
                `A user's ${label} name must be at least 2 characters long.`
            )
        }
    }


    function validatePassword(password) {
        if (password.length < 8) {
            throw new InvalidPropertyError(
                `A user's password must be at least 8 characters long.`
            )
        }
    }

    function validateEmail(emailAddress) {
        if (!isValidEmail(emailAddress)) {
            throw new InvalidPropertyError('Invalid user email address.')
        }
    }

    function normalize({ emailAddress, firstName, lastName, ...otherInfo }) {
        let obj = {
            ...otherInfo,
            firstName: upperFirst(firstName),
            lastName: upperFirst(lastName),
            emailAddress: emailAddress.toLowerCase(),
        }
        if (!Object.keys(obj).includes("isEnabled")) {
            obj["isEnabled"] = true
        }
        return obj
    }
}