Index: ReserveNGo-frontend/package-lock.json
===================================================================
--- ReserveNGo-frontend/package-lock.json	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/package-lock.json	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -102,4 +102,5 @@
       "dev": true,
       "license": "MIT",
+      "peer": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
@@ -654,4 +655,5 @@
       ],
       "license": "MIT",
+      "peer": true,
       "engines": {
         "node": ">=18"
@@ -677,4 +679,5 @@
       ],
       "license": "MIT",
+      "peer": true,
       "engines": {
         "node": ">=18"
@@ -1399,5 +1402,4 @@
       "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.5",
@@ -1433,5 +1435,4 @@
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@nodelib/fs.stat": "2.0.5",
@@ -1448,5 +1449,4 @@
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">= 8"
@@ -1459,5 +1459,4 @@
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@nodelib/fs.scandir": "2.1.5",
@@ -2129,5 +2128,4 @@
       "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@types/estree": "*",
@@ -2140,5 +2138,4 @@
       "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@types/eslint": "*",
@@ -2163,5 +2160,4 @@
       "integrity": "sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "undici-types": "~6.21.0"
@@ -2174,5 +2170,4 @@
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@typescript-eslint/types": "8.21.0",
@@ -2193,5 +2188,4 @@
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2208,5 +2202,4 @@
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@typescript-eslint/types": "8.21.0",
@@ -2261,5 +2254,4 @@
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@typescript-eslint/types": "8.21.0",
@@ -2280,5 +2272,4 @@
       "dev": true,
       "license": "Apache-2.0",
-      "peer": true,
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2711,5 +2702,4 @@
       "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@webassemblyjs/helper-numbers": "1.13.2",
@@ -2721,6 +2711,5 @@
       "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
       "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/@webassemblyjs/helper-api-error": {
@@ -2728,6 +2717,5 @@
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
       "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/@webassemblyjs/helper-buffer": {
@@ -2735,6 +2723,5 @@
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
       "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/@webassemblyjs/helper-numbers": {
@@ -2743,5 +2730,4 @@
       "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@webassemblyjs/floating-point-hex-parser": "1.13.2",
@@ -2754,6 +2740,5 @@
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
       "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/@webassemblyjs/helper-wasm-section": {
@@ -2762,5 +2747,4 @@
       "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
@@ -2775,5 +2759,4 @@
       "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@xtuc/ieee754": "^1.2.0"
@@ -2785,5 +2768,4 @@
       "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
       "license": "Apache-2.0",
-      "peer": true,
       "dependencies": {
         "@xtuc/long": "4.2.2"
@@ -2794,6 +2776,5 @@
       "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
       "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/@webassemblyjs/wasm-edit": {
@@ -2802,5 +2783,4 @@
       "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
@@ -2819,5 +2799,4 @@
       "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
@@ -2833,5 +2812,4 @@
       "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
@@ -2846,5 +2824,4 @@
       "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
@@ -2861,5 +2838,4 @@
       "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
@@ -2871,6 +2847,5 @@
       "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
       "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
-      "license": "BSD-3-Clause",
-      "peer": true
+      "license": "BSD-3-Clause"
     },
     "node_modules/@xtuc/long": {
@@ -2878,6 +2853,5 @@
       "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
       "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
-      "license": "Apache-2.0",
-      "peer": true
+      "license": "Apache-2.0"
     },
     "node_modules/abbrev": {
@@ -2896,4 +2870,5 @@
       "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
       "license": "MIT",
+      "peer": true,
       "bin": {
         "acorn": "bin/acorn"
@@ -2945,5 +2920,4 @@
       "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "ajv": "^8.0.0"
@@ -2963,5 +2937,4 @@
       "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.3",
@@ -2979,6 +2952,5 @@
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/ansi-regex": {
@@ -3101,4 +3073,5 @@
       ],
       "license": "MIT",
+      "peer": true,
       "dependencies": {
         "caniuse-lite": "^1.0.30001688",
@@ -3118,6 +3091,5 @@
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/bundle-name": {
@@ -3241,5 +3213,4 @@
       "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">=6.0"
@@ -3560,5 +3531,4 @@
       "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "graceful-fs": "^4.2.4",
@@ -3666,4 +3636,5 @@
       "dev": true,
       "license": "MIT",
+      "peer": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
@@ -3726,4 +3697,5 @@
       "dev": true,
       "license": "MIT",
+      "peer": true,
       "bin": {
         "eslint-config-prettier": "build/bin/cli.js"
@@ -3956,5 +3928,4 @@
       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">=0.8.x"
@@ -4017,5 +3988,4 @@
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@nodelib/fs.stat": "^2.0.2",
@@ -4035,5 +4005,4 @@
       "dev": true,
       "license": "ISC",
-      "peer": true,
       "dependencies": {
         "is-glob": "^4.0.1"
@@ -4071,6 +4040,5 @@
         }
       ],
-      "license": "BSD-3-Clause",
-      "peer": true
+      "license": "BSD-3-Clause"
     },
     "node_modules/fastq": {
@@ -4080,5 +4048,4 @@
       "dev": true,
       "license": "ISC",
-      "peer": true,
       "dependencies": {
         "reusify": "^1.0.4"
@@ -4292,6 +4259,5 @@
       "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
       "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
-      "license": "BSD-2-Clause",
-      "peer": true
+      "license": "BSD-2-Clause"
     },
     "node_modules/globals": {
@@ -4638,5 +4604,4 @@
       "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@types/node": "*",
@@ -4653,5 +4618,4 @@
       "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "has-flag": "^4.0.0"
@@ -4791,6 +4755,5 @@
       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
       "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/json-schema-traverse": {
@@ -4870,5 +4833,4 @@
       "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">=6.11.5"
@@ -4932,6 +4894,5 @@
       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
       "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/merge2": {
@@ -4941,5 +4902,4 @@
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">= 8"
@@ -5416,4 +5376,5 @@
       "dev": true,
       "license": "MIT",
+      "peer": true,
       "bin": {
         "prettier": "bin/prettier.cjs"
@@ -5491,6 +5452,5 @@
         }
       ],
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/randombytes": {
@@ -5499,5 +5459,4 @@
       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "safe-buffer": "^5.1.0"
@@ -5522,5 +5481,4 @@
       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">=0.10.0"
@@ -5543,5 +5501,4 @@
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "engines": {
         "iojs": ">=1.0.0",
@@ -5562,4 +5519,5 @@
       "dev": true,
       "license": "MIT",
+      "peer": true,
       "dependencies": {
         "@types/estree": "1.0.6"
@@ -5635,5 +5593,4 @@
       ],
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "queue-microtask": "^1.2.2"
@@ -5658,6 +5615,5 @@
         }
       ],
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/safer-buffer": {
@@ -5673,4 +5629,5 @@
       "integrity": "sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==",
       "license": "MIT",
+      "peer": true,
       "dependencies": {
         "chokidar": "^4.0.0",
@@ -5743,5 +5700,4 @@
       "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@types/json-schema": "^7.0.9",
@@ -5780,5 +5736,4 @@
       "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.3"
@@ -5792,6 +5747,5 @@
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/semver": {
@@ -5813,5 +5767,4 @@
       "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
       "license": "BSD-3-Clause",
-      "peer": true,
       "dependencies": {
         "randombytes": "^2.1.0"
@@ -5881,5 +5834,4 @@
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
       "license": "BSD-3-Clause",
-      "peer": true,
       "engines": {
         "node": ">=0.10.0"
@@ -5900,5 +5852,4 @@
       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "buffer-from": "^1.0.0",
@@ -6121,5 +6072,4 @@
       "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">=6"
@@ -6131,5 +6081,4 @@
       "integrity": "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==",
       "license": "BSD-2-Clause",
-      "peer": true,
       "dependencies": {
         "@jridgewell/source-map": "^0.3.3",
@@ -6150,5 +6099,4 @@
       "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@jridgewell/trace-mapping": "^0.3.25",
@@ -6184,6 +6132,5 @@
       "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
       "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/tinybench": {
@@ -6306,5 +6253,4 @@
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">=18.12"
@@ -6366,6 +6312,5 @@
       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
       "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/unicorn-magic": {
@@ -6445,4 +6390,5 @@
       "dev": true,
       "license": "MIT",
+      "peer": true,
       "dependencies": {
         "esbuild": "^0.24.2",
@@ -6635,4 +6581,5 @@
       "dev": true,
       "license": "MIT",
+      "peer": true,
       "dependencies": {
         "@vitest/expect": "3.0.3",
@@ -6707,4 +6654,5 @@
       "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
       "license": "MIT",
+      "peer": true,
       "dependencies": {
         "@vue/compiler-dom": "3.5.13",
@@ -6889,5 +6837,4 @@
       "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "glob-to-regexp": "^0.4.1",
@@ -6913,5 +6860,4 @@
       "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@types/eslint-scope": "^3.7.7",
@@ -6961,5 +6907,4 @@
       "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">=10.13.0"
@@ -6971,5 +6916,4 @@
       "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
       "license": "BSD-2-Clause",
-      "peer": true,
       "dependencies": {
         "esrecurse": "^4.3.0",
@@ -6985,5 +6929,4 @@
       "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
       "license": "BSD-2-Clause",
-      "peer": true,
       "engines": {
         "node": ">=4.0"
Index: ReserveNGo-frontend/src/Api_Classes/HttpClient.js
===================================================================
--- ReserveNGo-frontend/src/Api_Classes/HttpClient.js	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/Api_Classes/HttpClient.js	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -5,6 +5,11 @@
 
   async baseFetch(endpoint, { method = 'GET', headers = {}, body, queryParams } = {}) {
-    const url = new URL(endpoint, this.baseURL)
-
+    if (endpoint === undefined || endpoint === "" || endpoint === null) {
+     endpoint = this.baseURL
+    }
+    else {
+      endpoint = this.baseURL + "/" + endpoint;
+    }
+    const url = new URL(endpoint)
     if (queryParams) {
       Object.entries(queryParams).forEach(([k, v]) => url.searchParams.append(k, v))
Index: ReserveNGo-frontend/src/PiniaStores/UserStore.js
===================================================================
--- ReserveNGo-frontend/src/PiniaStores/UserStore.js	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/PiniaStores/UserStore.js	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -1,3 +1,4 @@
 import { defineStore } from 'pinia'
+import { config } from '@/constants/Api_config'
 
 export const userStore = defineStore('userStore', {
@@ -27,21 +28,5 @@
 
       if (this.data.logoUrl != null) {
-        fetch('http://localhost:8080' + this.data.logoUrl, {
-          headers: {
-            Authorization: this.getToken,
-          }
-        })
-          .then(response => response.blob())
-          .then(blob => {
-            const reader = new FileReader();
-            reader.onloadend = () => {
-              const base64data = reader.result;
-
-              this.setProfilePicturePathToLocalStorage(this.data.logoUrl, base64data)
-            };
-            reader.readAsDataURL(blob);
-          })
-          .catch(err => console.log("Error parsing the blob", err))
-
+       this.setProfilePicturePathToLocalStorage(this.data.logoUrl);
       }
 
@@ -51,5 +36,4 @@
     },
     removeProfilePictureFromLocaleStorage() {
-      this.data.profilePictureBase64Encoded = null;
       this.data.logoUrl = null;
       localStorage.setItem('userData', JSON.stringify(this.data));
@@ -71,7 +55,6 @@
       localStorage.setItem('userData', JSON.stringify(this.data));
     },
-    setProfilePicturePathToLocalStorage(profilePicturePath, base64Encoded) {
+    setProfilePicturePathToLocalStorage(profilePicturePath) {
       this.data.logoUrl = profilePicturePath;
-      this.data.profilePictureBase64Encoded = base64Encoded;
       localStorage.setItem('userData', JSON.stringify(this.data));
     },
Index: ReserveNGo-frontend/src/components/Project/Auth/login_.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Auth/login_.vue	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/components/Project/Auth/login_.vue	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -18,5 +18,4 @@
         password: '',
       },
-      url: 'http://localhost:8080/api/auth/login',
       userStore_: userStore(),
       router: useRouter(),
Index: ReserveNGo-frontend/src/components/Project/Customer/Profile_Page.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Customer/Profile_Page.vue	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/components/Project/Customer/Profile_Page.vue	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -8,4 +8,5 @@
 import PopUpAlertIcon from '@/components/Project/Utility/PopUpAlertIcon.vue'
 import PopUpWindow from '@/components/Project/Utility/PopUpWindow.vue'
+import { config } from '@/constants/Api_config.js'
 
 export default {
@@ -30,4 +31,5 @@
 
       isHoveringAlert: false,
+      config: config,
     }
   },
@@ -97,18 +99,6 @@
       try {
         const profileAvatarStringPath = await useUser.uploadAvatar(formData)
-
-        const response = await fetch('http://localhost:8080' + profileAvatarStringPath, {
-          headers: { Authorization: this.userStore_.getToken },
-        })
-        const blob = await response.blob()
-        const reader = new FileReader()
-        reader.onloadend = () => {
-          this.userStore_.setProfilePicturePathToLocalStorage(
-            profileAvatarStringPath,
-            reader.result,
-          )
-          this.showToast('Profile picture updated!', 'success')
-        }
-        reader.readAsDataURL(blob)
+        this.userStore_.setProfilePicturePathToLocalStorage(profileAvatarStringPath)
+        this.showToast('Profile picture updated!', 'success')
       } catch (err) {
         this.showToast(err.response || 'Profile picture upload failed.', 'error')
@@ -172,4 +162,12 @@
     })
   },
+  computed: {
+    avatarURL() {
+      if (this.userStore_.data.logoUrl === null) {
+        return blankProfile
+      }
+      return this.config.API_BASE_URL + this.userStore_.data.logoUrl
+    }
+  }
 }
 </script>
@@ -184,5 +182,5 @@
               <img
                 class="rounded-circle border me-3"
-                :src="this.userStore_.data.profilePictureBase64Encoded || blankProfile"
+                :src="avatarURL"
                 alt="Profile Picture"
                 width="100"
@@ -232,5 +230,5 @@
                   id="profilePictureModal"
                   class="rounded-circle border"
-                  :src="this.userStore_.data.profilePictureBase64Encoded || blankProfile"
+                  :src="avatarURL"
                   alt="Profile Picture"
                   width="100"
@@ -254,5 +252,5 @@
             <div class="d-flex justify-content-center">
               <button
-                v-if="!userStore_.data.profilePictureBase64Encoded"
+                v-if="!userStore_.data.logoUrl"
                 @click="updateProfilePicture"
                 :disabled="isProfileImageButtonDisabled || isUpdatingPicture"
@@ -263,5 +261,5 @@
               </button>
               <button
-                v-if="userStore_.data.profilePictureBase64Encoded"
+                v-if="userStore_.data.logoUrl"
                 @click="deleteProfilePicture"
                 :disabled="isUpdatingPicture"
Index: ReserveNGo-frontend/src/components/Project/Customer/RatingsForLocal.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Customer/RatingsForLocal.vue	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/components/Project/Customer/RatingsForLocal.vue	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -1,4 +1,5 @@
 <script>
 import { userStore } from '@/PiniaStores/UserStore.js'
+import { useCustomer } from '@/repository/Customer.ts'
 
 export default {
@@ -18,14 +19,6 @@
     rateLocal(rating){
       this.givenRating = rating;
-      fetch(`http://localhost:8080/api/customer/local/${this.localId}/rate`, {
-        method: 'PUT',
-        headers: {
-          Authorization: this.user.getToken,
-          'Content-Type': 'application/json'
-        },
-        body: JSON.stringify({
-          rating: this.givenRating,
-        })
-      })
+      useCustomer
+        .rateLocal(this.localId, this.givenRating)
         .then(() => {
           this.customerRating();
@@ -35,22 +28,12 @@
     },
     customerRating(){
-
-      fetch(`http://localhost:8080/api/customer/local/${this.localId}/rating`, {
-        method: 'GET',
-        headers:{
-          Authorization: this.user.getToken,
-        }
-      })
-        .then((res) => res.json())
+      useCustomer
+        .getRatingForLocal(this.localId)
         .then((data) => {this.rating = data.rating})
         .catch((error) => {console.log(error)})
     },
     removeRating(){
-      fetch(`http://localhost:8080/api/customer/local/${this.localId}/remove-rating`, {
-        method: 'DELETE',
-        headers: {
-          Authorization: this.user.getToken,
-        }
-      })
+      useCustomer
+        .removeRating(this.localId)
         .then(() => {
           this.rating = 0;
Index: ReserveNGo-frontend/src/components/Project/Nav_bar_new.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Nav_bar_new.vue	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/components/Project/Nav_bar_new.vue	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -2,4 +2,5 @@
 import { userStore } from '@/PiniaStores/UserStore.js'
 import logout_ from '@/components/Project/Auth/logout_.vue'
+import { useLocalManager } from '@/repository/LocalManager.ts'
 
 export default {
@@ -15,12 +16,6 @@
   methods: {
     fetchLocalForManager() {
-      fetch('http://localhost:8080/api/local-manager/my-local', {
-        method: 'GET',
-        headers: {
-          'Content-Type': 'application/json',
-          Authorization: this.user.getToken,
-        },
-      })
-        .then((res) => res.json())
+      useLocalManager
+        .getMyLocal()
         .then((data) => (this.managerLocalId = data.id))
         .catch((err) => console.log(err))
Index: ReserveNGo-frontend/src/components/Project/Restaurant/Locale_.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Restaurant/Locale_.vue	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/components/Project/Restaurant/Locale_.vue	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -6,5 +6,4 @@
 import WorkingHoursTable from '@/components/Project/Restaurant/working-hours-table.vue'
 import { useLocalManager } from '@/repository/LocalManager.ts'
-import { useUtility } from '@/repository/utility.ts'
 import PhotosGridSystem from '@/components/Project/Utility/PhotosGridSystem.vue'
 import ImageModalLocale from '@/components/Project/Utility/ImageModalLocale.vue'
@@ -12,13 +11,13 @@
 import { config } from '@/constants/Api_config.js'
 import ManagerFileInput from '@/components/Project/Utility/ManagerFileInput.vue'
-import HorizontalScroller from '@/components/Project/Utility/HorizontalScroller.vue'
 import AddEventModal from '@/components/Project/Event/EditEventModal.vue'
 import {useToasts} from '@/composables/useToast.js'
 import LoadingIcon from '@/components/Project/Utility/LoadingIcon.vue'
+import { useLocales } from '@/repository/Locale'
+import { useCustomer } from '@/repository/Customer.ts'
 
 export default {
   components: {
     LoadingIcon,
-    HorizontalScroller,
     events_carousel,
     WorkingHoursTable,
@@ -116,4 +115,7 @@
       return this.locale.localPhotos.map((path) => `${config.API_BASE_URL}${path}`)
     },
+    logoPicture(){
+      return this.locale.logo ? `${config.API_BASE_URL}${this.locale.logo}` : 'https://cdn.vuetifyjs.com/images/profiles/default-avatar.png'
+    }
   },
 
@@ -129,5 +131,5 @@
       useLocalManager
         .deletePhoto({ localPhotosUrls })
-        .then((response) => {
+        .then(() => {
           this.showToast("Successfully deleted a locale image")
         })
@@ -150,11 +152,8 @@
 
     fetchLocaleData() {
-      fetch(`http://localhost:8080/api/locals/${this.local_id}`)
-        .then((res) => res.json())
+      useLocales
+        .getSpecificLocale(this.local_id)
         .then((data) => {
           this.locale = data
-        /*  console.log('LOCALE', this.locale)*/
-          // Safety checks for nested objects
-         /* console.log('LOCALE DATA FOR PICTURES', this.locale)*/
           if (!this.locale.contact) {
             this.locale.contact = { phone: '', email: '' }
@@ -165,17 +164,11 @@
           // Use a separate property for display-transformed events
           this.eventsForCarousel = transformArray(this.locale.events, 2)
-          useUtility.fetchImageBase64(this.locale.logo).then((base64) => {
-            this.locale_logo_base64encoded = base64
-          })
         })
         .catch((err) => console.log('Error fetching locale data:', err))
     },
     addToFavourites() {
-      fetch(`http://localhost:8080/api/customer/favourite-locals/add/${this.locale.id}`, {
-        method: 'POST',
-        headers: {
-          Authorization: this.userStore.getToken,
-        },
-      }).catch((error) => console.log(error))
+      useCustomer
+        .addFavourite(this.locale.id)
+        .catch((error) => console.log(error))
     },
     uploadLogo(fileInput) {
@@ -190,8 +183,5 @@
       useLocalManager
         .uploadLogo(formData)
-        .then((imagePath) => {
-          useUtility.fetchImageBase64(imagePath).then((base64) => {
-            this.locale_logo_base64encoded = base64
-          })
+        .then(() => {
           this.$refs.uploadLogoInputRef.reset()
           this.showToast("Successfully uploaded the logo")
@@ -220,5 +210,5 @@
       useLocalManager
         .uploadImage(formData)
-        .then((response) => {
+        .then(() => {
           this.fetchLocaleData()
           this.$refs.uploadPhotoInputRef.reset()
@@ -256,5 +246,5 @@
 
       useLocalManager.saveDetailChanges(payload)
-        .then((res) => {
+        .then(() => {
           this.cachedLocale = null
           this.showToast("Successfully updated")
@@ -282,5 +272,6 @@
       console.log("TARGET EDIT EVENT", this.targetEditEvent)
       this.isEventModalVisible = true;
-    }
+    },
+
   },
 }
@@ -296,8 +287,5 @@
             <img
               id="logoLocalePicture"
-              :src="
-                locale_logo_base64encoded ||
-                'https://cdn.vuetifyjs.com/images/profiles/default-avatar.png'
-              "
+              :src="logoPicture"
               class="card-img-top object-fit-cover rounded"
               style="aspect-ratio: 1 / 1; object-fit: cover"
Index: ReserveNGo-frontend/src/components/Project/Restaurant/Locale_listing_container.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Restaurant/Locale_listing_container.vue	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/components/Project/Restaurant/Locale_listing_container.vue	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -3,4 +3,6 @@
 import { defineComponent } from 'vue'
 import { userStore } from '@/PiniaStores/UserStore.js'
+import { useLocales } from '@/repository/Locale'
+import { useCustomer } from '@/repository/Customer.ts'
 
 export default defineComponent({
@@ -30,12 +32,6 @@
     toggleFavourite(id) {
       const isFav = this.favourite_locals.includes(id)
-      const url = `http://localhost:8080/api/customer/favourite-locals/${isFav ? 'remove' : 'add'}/${id}`
-      fetch(url, {
-        method: 'POST',
-        headers: {
-          'Content-Type': 'application/json',
-          Authorization: this.userStore.getToken,
-        },
-      })
+      const action = isFav ? useCustomer.removeFavourite(id) : useCustomer.addFavourite(id)
+      Promise.resolve(action)
         .then(() => {
           if (isFav) {
@@ -50,17 +46,13 @@
 
   mounted() {
-    fetch('http://localhost:8080/api/locals')
-      .then(res => res.json())
-      .then(data => {this.locals = data.locals; console.log("The data of the locals will probobly be needed later so this console log stays", data);})
+    useLocales
+      .getLocals()
+      .then(data => { this.locals = data.locals; console.log("The data of the locals will probobly be needed later so this console log stays", data); })
       .catch(err => console.log("The locals are not being caught.", err))
 
     // Only fetch favourite locals if user is logged in and is a customer
     if (this.userStore && this.userStore.data && this.userStore.data.role === 'ROLE_CUSTOMER') {
-      fetch('http://localhost:8080/api/customer/favourite-locals', {
-        headers: {
-          Authorization: this.userStore.getToken,
-        },
-      })
-        .then(res => res.json())
+      useCustomer
+        .getFavouriteLocals()
         .then(data => (this.favourite_locals = data.map(local => local.id)))
         .catch(err => console.log(err))
Index: ReserveNGo-frontend/src/components/Project/Restaurant/home_.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Restaurant/home_.vue	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/components/Project/Restaurant/home_.vue	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -4,4 +4,5 @@
 import Events_carousel from '@/components/Project/Event/events_carousel.vue'
 import { transformArray } from '@/mixins/utilFunctions.js'
+import { useEvents } from '@/repository/Events.ts'
 
 export default {
@@ -23,5 +24,4 @@
     if (wrapper) {
       wrapper.addEventListener('scroll', this.handleScroll)
-      // Check initial scroll position
       this.handleScroll()
     }
@@ -54,8 +54,6 @@
 
   beforeMount() {
-    fetch('http://localhost:8080/api/events', {
-      method: 'GET',
-    })
-      .then(res => res.json())
+    useEvents
+      .listAll()
       .then(data => {
         this.allEvents = transformArray(data.events, 3)
Index: ReserveNGo-frontend/src/constants/Api_config.js
===================================================================
--- ReserveNGo-frontend/src/constants/Api_config.js	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/constants/Api_config.js	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -1,4 +1,39 @@
+// Build API base URL using .env values API_BASE_URL and API_LISTEN_PORT
+// Falls back to localhost:8080 if not provided
+const RAW_BASE = import.meta.env.API_BASE_URL || import.meta.env.VITE_API_BASE_URL || 'http://localhost'
+const RAW_PORT = import.meta.env.API_LISTEN_PORT || import.meta.env.VITE_API_LISTEN_PORT || '8080'
+
+function buildBaseUrl(hostLike, portLike) {
+  try {
+    // If hostLike already includes protocol, host, and maybe port/path
+    const u = new URL(hostLike)
+    // If port is not specified in hostLike, apply provided port
+    if (!u.port && portLike) {
+      u.port = String(portLike)
+    }
+    return u.origin
+  } catch (e) {
+    // hostLike might be just a hostname without protocol
+    const prefixed = hostLike.startsWith('http') ? hostLike : `http://${hostLike}`
+    try {
+      const u2 = new URL(prefixed)
+      if (!u2.port && portLike) {
+        u2.port = String(portLike)
+      }
+      return u2.origin
+    } catch (e2) {
+      // Fallback
+      return `http://localhost:${portLike || '8080'}`
+    }
+  }
+}
+
+const API_ORIGIN = buildBaseUrl(RAW_BASE, RAW_PORT)
+
+
+
 export const config = {
-  API_BASE_URL: import.meta.env.VITE_API_BASE_URL ? import.meta.env.VITE_API_BASE_URL : 'http://localhost:8080',
-};
-
+  API_BASE_URL: API_ORIGIN,
+  API_LISTEN_PORT: RAW_PORT,
+}
+console.log("API_ORIGIN",config)
Index: ReserveNGo-frontend/src/repository/Admin.ts
===================================================================
--- ReserveNGo-frontend/src/repository/Admin.ts	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/repository/Admin.ts	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -43,3 +43,3 @@
 }
 
-export const useAdmin = new Admin(BASE_API_URL + '/api/admin/', )
+export const useAdmin = new Admin(BASE_API_URL + '/api/admin', )
Index: ReserveNGo-frontend/src/repository/Authentication.ts
===================================================================
--- ReserveNGo-frontend/src/repository/Authentication.ts	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/repository/Authentication.ts	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -31,3 +31,3 @@
 }
 
-export const useAuth = new Authentication(BASE_API_URL + '/api/auth/')
+export const useAuth = new Authentication(BASE_API_URL + '/api/auth')
Index: ReserveNGo-frontend/src/repository/Customer.ts
===================================================================
--- ReserveNGo-frontend/src/repository/Customer.ts	(revision fe4000cb626d81b1f1398bb2351086312873e509)
+++ ReserveNGo-frontend/src/repository/Customer.ts	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -0,0 +1,36 @@
+import { config } from '@/constants/Api_config'
+import { HttpClient } from '@/Api_Classes/HttpClient'
+
+const BASE_API_URL = config.API_BASE_URL
+
+class CustomerRepository {
+  private readonly httpClient: HttpClient
+
+  constructor(baseUrl: string) {
+    this.httpClient = new HttpClient(baseUrl)
+  }
+
+  // FAVOURITES
+  getFavouriteLocals(): Promise<any[]> {
+    return this.httpClient.get('favourite-locals')
+  }
+  addFavourite(localId: number | string): Promise<any> {
+    return this.httpClient.post(`favourite-locals/add/${localId}`, {})
+  }
+  removeFavourite(localId: number | string): Promise<any> {
+    return this.httpClient.post(`favourite-locals/remove/${localId}`, {})
+  }
+
+  // RATINGS
+  getRatingForLocal(localId: number | string): Promise<any> {
+    return this.httpClient.get(`local/${localId}/rating`)
+  }
+  rateLocal(localId: number | string, rating: number): Promise<any> {
+    return this.httpClient.put(`local/${localId}/rate`, { rating })
+  }
+  removeRating(localId: number | string): Promise<any> {
+    return this.httpClient.delete(`local/${localId}/remove-rating`)
+  }
+}
+
+export const useCustomer = new CustomerRepository(BASE_API_URL + '/api/customer')
Index: ReserveNGo-frontend/src/repository/Events.ts
===================================================================
--- ReserveNGo-frontend/src/repository/Events.ts	(revision fe4000cb626d81b1f1398bb2351086312873e509)
+++ ReserveNGo-frontend/src/repository/Events.ts	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -0,0 +1,18 @@
+import { config } from '@/constants/Api_config'
+import { HttpClient } from '@/Api_Classes/HttpClient'
+
+const BASE_API_URL = config.API_BASE_URL
+
+class EventsRepository {
+  private readonly httpClient: HttpClient
+
+  constructor(baseUrl: string) {
+    this.httpClient = new HttpClient(baseUrl)
+  }
+
+  listAll(): Promise<any> {
+    return this.httpClient.get()
+  }
+}
+
+export const useEvents = new EventsRepository(BASE_API_URL + '/api/events')
Index: ReserveNGo-frontend/src/repository/LocalManager.ts
===================================================================
--- ReserveNGo-frontend/src/repository/LocalManager.ts	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/repository/LocalManager.ts	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -61,3 +61,3 @@
 }
 
-export const useLocalManager = new LocalManager(BASE_API_URL + '/api/local-manager/')
+export const useLocalManager = new LocalManager(BASE_API_URL + '/api/local-manager')
Index: ReserveNGo-frontend/src/repository/Locale.ts
===================================================================
--- ReserveNGo-frontend/src/repository/Locale.ts	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/repository/Locale.ts	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -24,3 +24,3 @@
 }
 
-export const useLocales = new Locale(BASE_API_URL + '/api/locals/', )
+export const useLocales = new Locale(BASE_API_URL + '/api/locals', )
Index: ReserveNGo-frontend/src/repository/user.ts
===================================================================
--- ReserveNGo-frontend/src/repository/user.ts	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/src/repository/user.ts	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -40,3 +40,3 @@
 }
 
-export const useUser = new UserManager(BASE_API_URL + '/api/user/')
+export const useUser = new UserManager(BASE_API_URL + '/api/user')
Index: ReserveNGo-frontend/vite.config.js
===================================================================
--- ReserveNGo-frontend/vite.config.js	(revision 479124f9e8d54c6981e2ceadcd914ac30c62f20d)
+++ ReserveNGo-frontend/vite.config.js	(revision fe4000cb626d81b1f1398bb2351086312873e509)
@@ -8,4 +8,6 @@
 export default defineConfig({
   plugins: [vue(), vueDevTools()],
+  // Allow using environment variables starting with API_ in addition to VITE_
+  envPrefix: ['VITE_', 'API_'],
   resolve: {
     alias: {
