u-mongoose-expressapi
Version:
Common functions for Express and Mongoose API
165 lines (150 loc) • 4.76 kB
JavaScript
const { Response } = require('./responseHandler');
const moment = require('moment-timezone');
exports.removeUndefined = data => {
for (let key in data) {
if (
data[key] === undefined ||
data[key] === null ||
data[key] === '' ||
data[key] === 'null' ||
data[key] === 'undefined'
) {
delete data[key];
}
}
};
exports.IsArray = (data, res) => {
if (!data || !Array.isArray(data) || data.length === 0) {
return Response(res, 400, 'Not Found Ids');
}
};
exports.capitalizeFirstLetter = name => {
return name.charAt(0).toUpperCase() + name.slice(1);
};
//send array and check all is same
exports.isAllSameinArray = (dataArray, name) => {
if (dataArray.length === 0) return false; // or true, based on how you want to treat an empty array
const firstElementName = name ?? dataArray[0];
return dataArray.every(item => item === firstElementName);
};
// handleNumberValues(req.body, numberProperties);
// const numberProperties = [
// 'hotelCost',
// 'sellingPrice',
// ];
exports.handleNumberValues = (fields, properties) => {
properties.forEach(property => {
if (fields[property]) {
fields[property] = Number(fields[property]);
}
});
};
// exampleCamelCaseString to 'Example Camel Case String'
exports.capitalizeCamelSpace = name => {
const capitalized = name.charAt(0).toUpperCase() + name.slice(1);
return capitalized.replace(/([A-Z])/g, ' $1').trim();
};
// only integer allowed
exports.onlyIntegerAllowed = number => {
if (number !== undefined && /^\d+$/.test(number)) {
return (number = Number(number));
} else {
return { error: 'Missing or contains non-numeric characters' };
}
};
exports.parseDate = dateString => {
if (!dateString) return null; // handle null or undefined
let parsedDate = moment(dateString, moment.ISO_8601, true);
// Add ISO 8601 format and more date formats as needed
if (!parsedDate.isValid()) {
const formats = [
'DD-MM-YYYY',
'DD/MM/YYYY',
'D/M/YYYY',
'DD/M/YYYY',
'D/MM/YYYY',
'DD-M-YYYY',
'D-MM-YYYY',
'D-M-YYYY',
'D-MMM-YY', // Added to handle dates like '5-Nov-22'
'DD-MMM-YY', // Handles two-digit day, abbreviated month, two-digit year
'D-MMM-YYYY' // Single-digit day, abbreviated month, four-digit year
];
parsedDate = moment.utc(dateString, formats, true);
}
if (!parsedDate.isValid() && /\bGMT[+-]\d{4}\b/.test(dateString)) {
const timeZoneDate = moment.tz(
dateString,
'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ',
'Asia/Karachi'
);
if (timeZoneDate.isValid()) {
return timeZoneDate.toDate();
}
}
if (parsedDate.isValid()) {
return parsedDate.toDate();
} else {
console.log('Invalid Date Format:', dateString);
return null;
}
};
exports.extractArrayItems = data =>
Object.fromEntries(Object.entries(data).map(([key, value]) => [key, value[0]]));
exports.consoled = (data, ...any) => {
console.log(JSON.stringify(data, null, 2)); // Log the formatted JSON data
any.forEach(arg => console.log(arg)); // Log each additional argument
};
// let input = " Hello world! This is a test. ";
// "Hello world! This is a test."
exports.trimNameLower = name => {
if (typeof name !== 'string') {
throw new Error('Invalid type, expected string');
}
// Log the original name for debugging
console.log('Original name:', JSON.stringify(name));
const trimmedName = name
.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
.replace(/\s+/g, ' ')
.toLowerCase();
// Log the trimmed name for debugging
console.log('Trimmed name:', JSON.stringify(trimmedName));
return trimmedName;
};
//fields ['destination', 'duration', 'type', 'category'];
//data: {destination:{},duration:{},type:{},category:{}}
exports.parseJsonFields = (data, fields) => {
const parsedData = {};
for (const field of fields) {
if (typeof data[field] !== 'string') {
return { error: `Field '${field}' must be a properly defined JSON string.` };
}
try {
parsedData[field] = JSON.parse(data[field]);
} catch (error) {
return { error: `Error parsing '${field}': ${error.message}` };
}
}
return parsedData;
};
// const data = pick(req.body, [
// 'title',
// 'description',
// 'date'
// ]);
exports.pickObj = (obj, keys) => {
return keys.reduce((acc, key) => {
if (obj && Object.prototype.hasOwnProperty.call(obj, key)) {
acc[key] = obj[key];
}
return acc;
}, {});
};
// const oneValueAllowed = (value) => {
// if (value.processing) {
// return { ...value, confirmed: undefined };
// } else if (value.confirmed) {
// return { ...value, processing: undefined };
// }
// return value;
// };