Advertisement
greedydev

Untitled

Nov 7th, 2022
1,043
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. /* eslint-disable no-console */
  4. const mock_1 = require("./mock");
  5. function lab() {
  6.     const refactorUser = (user) => {
  7.         const refactoredUser = {
  8.             gender: user.gender.charAt(0).toUpperCase() + user.gender.slice(1),
  9.             title: user.name.title,
  10.             full_name: `${user.name.first} ${user.name.last}`,
  11.             city: user.location.city,
  12.             state: user.location.state,
  13.             country: user.location.country,
  14.             postcode: user.location.postcode,
  15.             coordinates: user.location.coordinates,
  16.             timezone: user.location.timezone,
  17.             email: user.email,
  18.             id: user.id.name !== '' ? `${user.id.name}${user.id.value}` : undefined,
  19.             dob: new Date(user.dob.date),
  20.             age: user.dob.age,
  21.             phone: user.phone,
  22.             picture_large: user.picture.large,
  23.             picture_thumbnail: user.picture.thumbnail,
  24.         };
  25.         return refactoredUser;
  26.     };
  27.     const getRandomCourse = () => {
  28.         const courses = ['Mathematics', 'Physics', 'English', 'Computer Science', 'Dancing', 'Chess', 'Biology',
  29.             'Chemistry', 'Law', 'Art', 'Medicine', 'Statistics'];
  30.         const randomIndex = Math.floor(Math.random() * courses.length);
  31.         return courses[randomIndex];
  32.     };
  33.     const mergeUsers = (users, additionalInfo) => {
  34.         const res = [];
  35.         additionalInfo.forEach((additionalUser) => {
  36.             var _a, _b, _c;
  37.             if (users.find((user) => user.full_name === additionalUser.full_name) === undefined) {
  38.                 const userToAdd = {
  39.                     gender: additionalUser.gender.charAt(0).toUpperCase()
  40.                         + additionalUser.gender.slice(1),
  41.                     title: additionalUser.title,
  42.                     full_name: additionalUser.full_name,
  43.                     city: additionalUser.city,
  44.                     state: additionalUser.state,
  45.                     country: additionalUser.country,
  46.                     postcode: Number(additionalUser.postcode),
  47.                     coordinates: additionalUser.coordinates,
  48.                     timezone: additionalUser.timezone,
  49.                     email: additionalUser.email,
  50.                     dob: additionalUser.b_day === undefined
  51.                         ? undefined : new Date(additionalUser.b_day),
  52.                     age: additionalUser.age,
  53.                     phone: additionalUser.phone,
  54.                     picture_large: additionalUser.picture_large,
  55.                     picture_thumbnail: additionalUser.picture_thumbnail,
  56.                     id: additionalUser.id,
  57.                     favorite: additionalUser.favorite,
  58.                     course: (_a = additionalUser.course) !== null && _a !== void 0 ? _a : getRandomCourse(),
  59.                     bg_color: (_b = additionalUser.bg_color) !== null && _b !== void 0 ? _b : '#ffffff',
  60.                     note: (_c = additionalUser.note) !== null && _c !== void 0 ? _c : null,
  61.                 };
  62.                 res.push(userToAdd);
  63.             }
  64.         });
  65.         users.forEach((user) => {
  66.             var _a, _b, _c, _d;
  67.             const details = additionalInfo
  68.                 .find((userDetails) => user.full_name === userDetails.full_name);
  69.             if (details !== undefined) {
  70.                 const userDetails = {
  71.                     favorite: (_a = details.favorite) !== null && _a !== void 0 ? _a : false,
  72.                     course: (_b = details.course) !== null && _b !== void 0 ? _b : getRandomCourse(),
  73.                     bg_color: (_c = details.bg_color) !== null && _c !== void 0 ? _c : '#ffffff',
  74.                     note: (_d = details.note) !== null && _d !== void 0 ? _d : null,
  75.                 };
  76.                 res.push(Object.assign(Object.assign({}, user), userDetails));
  77.             }
  78.             else {
  79.                 const userDetails = {
  80.                     favorite: false,
  81.                     course: getRandomCourse(),
  82.                     bg_color: '#ffffff',
  83.                     note: null,
  84.                 };
  85.                 res.push(Object.assign(Object.assign({}, user), userDetails));
  86.             }
  87.         });
  88.         return res;
  89.     };
  90.     const isCapitalized = (str) => {
  91.         if (str.length === 0) {
  92.             return true;
  93.         }
  94.         return str.charAt(0) === str.charAt(0).toUpperCase();
  95.     };
  96.     const validateUser = (user) => {
  97.         var _a, _b, _c, _d, _e, _f;
  98.         if (!isCapitalized((_a = user.full_name) !== null && _a !== void 0 ? _a : '')) {
  99.             return false;
  100.         }
  101.         if (!isCapitalized((_b = user.gender) !== null && _b !== void 0 ? _b : '')) {
  102.             return false;
  103.         }
  104.         if (!isCapitalized((_c = user.note) !== null && _c !== void 0 ? _c : '')) {
  105.             return false;
  106.         }
  107.         if (!isCapitalized((_d = user.state) !== null && _d !== void 0 ? _d : '')) {
  108.             return false;
  109.         }
  110.         if (!isCapitalized((_e = user.city) !== null && _e !== void 0 ? _e : '')) {
  111.             return false;
  112.         }
  113.         if (!isCapitalized((_f = user.country) !== null && _f !== void 0 ? _f : '')) {
  114.             return false;
  115.         }
  116.         const phoneRegex = /\+?\d{1,4}?[-.\s]?\(?\d{1,3}?\)?[-.\s]?\d{1,4}[-.\s]?\d{1,4}[-.\s]?\d{1,9}/;
  117.         if (!phoneRegex.test((user.phone)) && user.phone !== undefined) {
  118.             return false;
  119.         }
  120.         const emailRegex = /^((?!\.)[\w-_.]*[^.])(@\w+)(\.\w+(\.\w+)?[^.\W])$/;
  121.         if (!emailRegex.test(user.email) && user.email !== undefined) {
  122.             return false;
  123.         }
  124.         return true;
  125.     };
  126.     let Gender;
  127.     (function (Gender) {
  128.         Gender["MALE"] = "Male";
  129.         Gender["FEMALE"] = "Female";
  130.     })(Gender || (Gender = {}));
  131.     class Filter {
  132.         constructor(country, age, gender, favorite) {
  133.             this.country = country;
  134.             this.age = age;
  135.             this.gender = gender;
  136.             this.favorite = favorite;
  137.         }
  138.         filter(users) {
  139.             let res = users;
  140.             if (this.country) {
  141.                 res = res.filter((user) => user.country === this.country);
  142.             }
  143.             if (this.age) {
  144.                 res = res.filter((user) => user.age >= this.age.min && user.age <= this.age.max);
  145.             }
  146.             if (this.gender) {
  147.                 res = res.filter((user) => user.gender === this.gender.valueOf());
  148.             }
  149.             if (this.favorite) {
  150.                 res = res.filter((user) => user.favorite === this.favorite);
  151.             }
  152.             return res;
  153.         }
  154.     }
  155.     let SortBy;
  156.     (function (SortBy) {
  157.         SortBy["NAME"] = "full_name";
  158.         SortBy["AGE"] = "age";
  159.         SortBy["DOB"] = "dob";
  160.         SortBy["COUNTRY"] = "country";
  161.     })(SortBy || (SortBy = {}));
  162.     class Sorter {
  163.         constructor(sortBy) {
  164.             this.sortBy = sortBy;
  165.         }
  166.         sort(users, ascending = true) {
  167.             return users.sort((lhs, rhs) => {
  168.                 if (lhs[this.sortBy.valueOf()] < rhs[this.sortBy.valueOf()]) {
  169.                     return ascending ? -1 : 1;
  170.                 }
  171.                 if (lhs[this.sortBy.valueOf()] > rhs[this.sortBy.valueOf()]) {
  172.                     return ascending ? 1 : -1;
  173.                 }
  174.                 return 0;
  175.             });
  176.         }
  177.     }
  178.     const search = (users, query) => users.filter((user) => {
  179.         if (user.full_name.toLowerCase().search(String(query).toLowerCase()) !== -1) {
  180.             return true;
  181.         }
  182.         if (user.note !== null) {
  183.             if (user.note.toLowerCase().search(String(query).toLowerCase()) !== -1) {
  184.                 return true;
  185.             }
  186.         }
  187.         if (!Number.isNaN(Number(query))) {
  188.             if (user.age === undefined || user.age === null) {
  189.                 return false;
  190.             }
  191.             return user.age === Number(query);
  192.         }
  193.         return false;
  194.     });
  195.     // eslint-disable-next-line max-len
  196.     const calculatePct = (partial, full) => `${((partial.length / full.length) * 100).toFixed(2)}%`;
  197.     console.log('--- Merged data from the mock ---');
  198.     const users = mergeUsers(mock_1.randomUserMock.map((user) => refactorUser(user)), mock_1.additionalUsers);
  199.     console.log(users);
  200.     console.log('--- User validation results ---');
  201.     console.log(users.map((user) => `${user.full_name} -- ${validateUser(user)}`));
  202.     console.log('--- Sorted by date of birth ---');
  203.     const sorter = new Sorter(SortBy.DOB);
  204.     const sorted = sorter.sort(users).map((user) => `${user.full_name} -- ${user.dob}`);
  205.     console.log(sorted);
  206.     console.log('--- Filter test | Country: Germany | Gender: Female ---');
  207.     const germanyFilter = new Filter('Germany', undefined, Gender.FEMALE);
  208.     const germanyUsers = germanyFilter.filter(users);
  209.     console.log(germanyUsers);
  210.     console.log('--- Search test | Query: 39 ---');
  211.     const searchRes1 = search(users, 39);
  212.     console.log(searchRes1);
  213.     console.log(`Found users are ${calculatePct(searchRes1, users)} of total number`);
  214.     console.log('--- Search test | Query: b ---');
  215.     const searchRes2 = search(users, 'b');
  216.     console.log(searchRes2);
  217.     console.log(`Found users are ${calculatePct(searchRes2, users)} of total number`);
  218. }
  219. exports.default = lab;
  220.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement