-
Notifications
You must be signed in to change notification settings - Fork 1
/
phone-number-validator.js
117 lines (97 loc) · 4.18 KB
/
phone-number-validator.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/**
* A phone number utilities validator module based on google phone number lib!
* @module phone-number-validator
* @private
*/
var InputValidator = require('./input-validator');
var getLogger = require('../logging/logger-options-parser').getLoggerFromOptions;
var PNExtractor = require('../extractors/phone-number-extractor');
var libPhoneNumber = require('google-libphonenumber');
var phoneUtil = libPhoneNumber.PhoneNumberUtil.getInstance();
var PhoneNumberType = libPhoneNumber.PhoneNumberType;
/**
* @private
* @type {logFunction}
*/
var loggingFunc = require('../logging/logger-message-formatter').getLoggerMessageFunc('phone-number-validator');
/**
* Phone number validator utility class
* @private
* @param logger non optional (or facaded) logger
* @returns {{isValid: isValid, isMobile: isMobile}}
* @constructor
*/
function PNValidator(logger) {
var pnExtractor = PNExtractor.createInstance({logger: logger});
return {
/**
* Check if the phone number is valid
* @param phoneNumber - phone number to test
* @param regionCode - (optional)region code of phone number
* @returns {Boolean} - true or false or throws error.
*/
isValid: function isValid(phoneNumber, regionCode) {
var formatLEIsValid = loggingFunc('is-valid');
logger.info(formatLEIsValid('Starting phoneNumber: ' + phoneNumber + ' regionCode: ' + regionCode));
if (!InputValidator.isValidInput(phoneNumber, false)) {
var err = new TypeError('Phone number: ' + phoneNumber + ' is not a valid input type (string).');
logger.error(formatLEIsValid(err.message));
throw err;
} else if (InputValidator.isShortNumber(phoneNumber)) {
//TODO this should be removed once there is a db of small numbers that could be used for validation
var toShortErr = new TypeError('Phone number: ' + phoneNumber + ' is a too short number to be validated.');
logger.error(formatLEIsValid(toShortErr.message));
throw toShortErr;
} else {
var gPhoneNum = pnExtractor.getGooglePhoneNumber(phoneNumber, regionCode);
var isPhoneNumberValid = phoneUtil.isValidNumber(gPhoneNum);
logger.info(formatLEIsValid('Result is ' + isPhoneNumberValid));
return isPhoneNumberValid;
}
},
/**
* S silent version of is valid that does not throw
* @param phoneNumber - phone number to test
* @param regionCode - (optional)region code of phone number
* @returns {Boolean} - true or false or throws error.
*/
isValidSilent :function isValidSilent(phoneNumber, regionCode) {
try {
return this.isValid(phoneNumber, regionCode);
} catch (e) {
return false;
}
},
/**
* This function checks if the number is a mobile number
* @function
* @param phoneNumber {string} - phone number to test
* @param [regionCode] {string} - (optional)region code of phone number
* @returns {Boolean} - true or false or throws error.
*/
isMobile: function isMobile(phoneNumber, regionCode) {
var formatLEIsMobile = loggingFunc('is-mobile');
logger.debug(formatLEIsMobile('Checking phone number validity.'));
if (this.isValid(phoneNumber, regionCode) !== true) {
logger.debug(formatLEIsMobile('phoneNumber is not valid.'));
var errMsg = 'PhoneNumber:' + phoneNumber + ' regionCode:' + regionCode + ' is not valid so mobile check cannot be performed.';
logger.error(formatLEIsMobile(errMsg));
throw (new Error(errMsg));
} else {
logger.debug(formatLEIsMobile('phoneNumber is valid.'));
var pnType = pnExtractor.getType(phoneNumber, regionCode);
var isPhoneNumMobile = (pnType === PhoneNumberType.MOBILE || pnType === PhoneNumberType.FIXED_LINE_OR_MOBILE);
logger.debug(formatLEIsMobile('Result if phone is mobile: .' + isPhoneNumMobile));
return isPhoneNumMobile;
}
}
};
}
/**
* This function returns another instance of Phone Number validator
* @param options that can contain a logger
* @returns {PNValidator} new PNValidator object instance
*/
module.exports.createInstance = function createInstance(options) {
return new PNValidator(getLogger(options));
};