satyacode
Background
Back to js-datatype-intermediate

05-mumbai-local-pass.js

JavaScript
1/**
2 * 🚂 Mumbai Local Train Pass Generator
3 *
4 * Aaj se tu Mumbai local ka digital pass system bana raha hai! Passenger
5 * ka data milega aur tujhe ek formatted pass string generate karni hai.
6 * Pass mein sab details honi chahiye ek specific format mein.
7 *
8 * Rules:
9 *   - passenger object mein required fields: name, from, to, classType
10 *   - classType must be "first" ya "second" (case-insensitive check)
11 *   - Pass ID generate karo:
12 *     classType ka first char uppercase + from ke pehle 3 letters uppercase
13 *     + to ke pehle 3 letters uppercase
14 *     Example: "first", "dadar", "andheri" => "F" + "DAD" + "AND" = "FDADAND"
15 *   - Output format using template literal:
16 *     Line 1: "MUMBAI LOCAL PASS"
17 *     Line 2: "---"
18 *     Line 3: "Name: <NAME IN UPPERCASE>"
19 *     Line 4: "From: <From in Title Case>"
20 *     Line 5: "To: <To in Title Case>"
21 *     Line 6: "Class: <FIRST or SECOND>"
22 *     Line 7: "Pass ID: <PASSID>"
23 *   - Title Case = first letter uppercase, rest lowercase
24 *   - Lines are separated by \n (newline)
25 *   - Hint: Use template literals, slice(), toUpperCase(), toLowerCase(),
26 *     charAt(), typeof
27 *
28 * Validation:
29 *   - Agar passenger object nahi hai ya null hai, return "INVALID PASS"
30 *   - Agar koi required field (name, from, to, classType) missing hai
31 *     ya empty string hai, return "INVALID PASS"
32 *   - Agar classType "first" ya "second" nahi hai, return "INVALID PASS"
33 *
34 * @param {{ name: string, from: string, to: string, classType: string }} passenger
35 * @returns {string} Formatted pass or "INVALID PASS"
36 *
37 * @example
38 *   generateLocalPass({ name: "rahul sharma", from: "dadar", to: "andheri", classType: "first" })
39 *   // => "MUMBAI LOCAL PASS\n---\nName: RAHUL SHARMA\nFrom: Dadar\nTo: Andheri\nClass: FIRST\nPass ID: FDADAND"
40 *
41 *   generateLocalPass(null)
42 *   // => "INVALID PASS"
43 */
44export function generateLocalPass(passenger) {
45  if(typeof passenger !== "object" || passenger === null){
46    return "INVALID PASS"
47  }
48  let fieldRequired = ["name", "from", "to", "classType"]
49
50
51 const hasInvalidField = fieldRequired.some(field => {
52    return (
53      !(field in passenger) ||               
54      typeof passenger[field] !== "string" ||  
55      passenger[field].trim() === ""           
56    );
57  });
58
59  if (hasInvalidField) {
60    return "INVALID PASS";
61  }
62
63  if(passenger.classType.toLowerCase() !== "first" && passenger.classType.toLowerCase() !== "second"){
64    return "INVALID PASS"
65  }
66
67  let passId = passenger.classType.charAt(0).toUpperCase() + passenger.from.slice(0,3).toUpperCase() + passenger.to.slice(0,3).toUpperCase()
68
69  function convertTitleCase(name){
70    return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase()
71  }
72
73  return `MUMBAI LOCAL PASS\n---\nName: ${passenger.name.toUpperCase()}\nFrom: ${convertTitleCase(passenger.from)}\nTo: ${convertTitleCase(passenger.to)}\nClass: ${passenger.classType.toUpperCase()}\nPass ID: ${passId}`
74}
75