| Current Path : /var/node/inatote/Inatote-Backend/users/ |
| 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
}
}