Dashboard  2
Lot's of data
Loading...
Searching...
No Matches
index.ts
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2024
3** area-rattrapage
4** File description:
5** index.js
6*/
7
8/**
9 * @file index.js
10 * @brief Main file of the app
11 */
12
13// the express library
14import express, { Express, Request, Response } from 'express';
15// The body-parser library (to parse the body contained in the requests)
16import body_parser from 'body-parser';
17// The cors library (to allow the app to accept requests from other origins)
18import cors from 'cors';
19
20import { BuildResponse as build_response } from './modules/build_response';
21import { SpeakOnCorrectStatus as speak_on_correct_status } from './modules/speak_on_correct_status';
22import { CONSTANTS as CONST } from './modules/constants';
23
24// The arg_parser module
25import { Args } from './arg_parser'; // Assuming args have a type defined in `arg_parser.ts`
26
27import DB from './modules/db';
28
29import { OAuth } from './modules/oauth';
30import { Login } from './modules/login';
31
32import { Widgets } from './modules/widgets';
33
34// Load environment variables
35const env = process.env;
36
37const db_host = env?.DB_HOST || 'localhost';
38const db_user = env?.DB_USER || 'root';
39const db_password = env?.DB_PASSWORD || '';
40const db_name = env?.DB_DATABASE || 'dashboard';
41const db_port = Number(env?.DB_PORT || "3306");
42
43const database = new DB(
44 db_host,
45 db_user,
46 db_password,
47 db_name,
48 db_port
49);
50
51// The app object representing the Express application
52const app: Express = express();
53
54var global_values: any = [];
55
56const corsOptions = {
57 origin: "*",
58 methods: "GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS",
59 allowedHeaders: "Content-Type,Authorization",
60};
61
62app.use(cors(corsOptions));
63
64// Middleware to parse JSON
65app.use(body_parser.json());
66
67// Default path
68app.get('/', (req: Request, res: Response): void => {
69 console.log(`endpoint: get: ${req.url}`);
70 build_response.build_and_send_response(res, speak_on_correct_status.success, "/", "Hello, World!", "success", "", false);
71});
72
73app.post('/', (req: Request, res: Response): void => {
74 console.log(`endpoint: post: ${req.url}`);
75 build_response.build_and_send_response(res, speak_on_correct_status.success, "/", "Hello, World!", "success", "", false);
76});
77
78app.put('/', (req: Request, res: Response): void => {
79 console.log(`endpoint: put: ${req.url}`);
80 build_response.build_and_send_response(res, speak_on_correct_status.success, "/", "Hello, World!", "success", "", false);
81});
82
83app.patch('/', (req: Request, res: Response): void => {
84 console.log(`endpoint: patch: ${req.url}`);
85 build_response.build_and_send_response(res, speak_on_correct_status.success, "/", "Hello, World!", "success", "", false);
86});
87
88app.delete('/', (req: Request, res: Response): void => {
89 console.log(`endpoint: delete: ${req.url}`);
90 build_response.build_and_send_response(res, speak_on_correct_status.success, "/", "Hello, World!", "success", "", false);
91});
92
93app.head('/', (req: Request, res: Response): void => {
94 console.log(`endpoint: head: ${req.url}`);
95 build_response.build_and_send_response(res, speak_on_correct_status.success, "/", "Hello, World!", "success", "", false);
96});
97
98app.options('/', (req: Request, res: Response): void => {
99 console.log(`endpoint: options: ${req.url}`);
100 build_response.build_and_send_response(res, speak_on_correct_status.success, "/", "Hello, World!", "success", "", false);
101});
102
103// Info route to return server address and port
104app.get('/info', (req: Request, res: Response): void => {
105 const title = "/info";
106 console.log(`endpoint: get: ${req.url}`);
107 const address = server?.address();
108 if (address && typeof address !== 'string') {
109 const host = address.address === '::' ? 'localhost' : address.address;
110 const port = address.port;
111
112 build_response.build_and_send_response(res, speak_on_correct_status.success, title, `The server is listening on host: ${host} at port: ${port}`, { host, port }, "", false);
113 } else {
114 build_response.build_and_send_response(res, speak_on_correct_status.internal_server_error, title, `Unable to retrieve server address`, "Error", "", true);
115 }
116});
117
118app.post('/shutdown', async (req, res) => {
119 var title = '/shutdown';
120 console.log(`endpoint: post: ${req.url}`);
121 const token = req.headers.authorization;
122 console.log(`token: ${token}`);
123 const data = await database.getContentFromTable('users', ['*'], `token = ${token}`);
124 // console.log(data);
125 if (data.length === 0) {
126 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
127 return;
128 }
129 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Shutting down the server', 'Success', '', false);
130 process.exit(CONST.SUCCESS);
131});
132
133
134app.get('/oauth/login/:provider', async (req, res) => {
135 var title = "sso login";
136 console.log(`endpoint: get: ${req.url}`);
137 const prov = req.params.provider;
138 console.log(`params: ${JSON.stringify(req.params)}`);
139 if (!prov) {
140 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing provider', 'Error', '', true);
141 return;
142 }
143 const provider = prov;
144 const data = await database.getContentFromTable('sso_oauth', ['*'], 'provider_name = "' + provider + '"');
145 if (data.length === 0) {
146 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid provider', 'Error', '', true);
147 return;
148 }
149 // console.log(data);
150 const authorisation_url = OAuth.generate_oauth_authorisation_url(data[0], env?.REDIRECT_URI || "", global_values);
151 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', authorisation_url, '', false);
152})
153
154app.post("/oauth/callback", async (req, res) => {
155 const title = "sso callback";
156 console.log(`endpoint: post: ${req.url}`);
157 const body = req.body
158
159 if (!body.code) {
160 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing code from the callback url', 'Error', '', true);
161 return;
162 }
163 console.log(body);
164 const splitted_body = body["code"].split("&");
165 console.log(splitted_body);
166 const splitted_state = splitted_body[1].split(":");
167 console.log(splitted_state);
168
169 let code = splitted_body[0];
170 let generated_uuid = splitted_state[0];
171 const got_provider = splitted_state[1];
172 code = code.replace("code=", "");
173 generated_uuid = generated_uuid.replace("state=", "");
174 // console.log(code);
175 // console.log(generated_uuid);
176
177 // console.log(`Global values before checking: ${JSON.stringify(global_values)}`);
178 if (code.length === 0 || generated_uuid.length === 0 || got_provider === 0) {
179 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing information from the callback url', 'Error', '', true);
180 return;
181 }
182 const uuid_exists = global_values.some((item: any) => item.state === generated_uuid);
183
184 if (uuid_exists === false) {
185 console.log("The uuid doesn't exist in the back.");
186 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'The state from the callback url is incorrect', 'Error', '', true);
187 return;
188 };
189
190 console.log(`Global values before removing the state: ${JSON.stringify(global_values)}`);
191 const index = global_values.findIndex((item: any) => item.state === generated_uuid);
192
193 if (index !== -1) {
194 global_values.splice(index, 1);
195 }
196 // console.log(`Global values after removing the state: ${global_values}`);
197
198 const provider_data = await database.getContentFromTable('sso_oauth', ['*'], `provider_name = '${got_provider}'`);
199
200 if (provider_data.length === 0) {
201 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'The given provider is not correct.', 'Error', '', true);
202 return;
203 }
204 // console.log(provider_data);
205 let provider_response;
206 try {
207 provider_response = await OAuth.exchange_code_for_token(code, provider_data[0], env?.REDIRECT_URI || "");
208 } catch (error) {
209 build_response.build_and_send_response(res, speak_on_correct_status.unauthorized, title, 'The code exchanger has failed.', 'Unauthorized', '', true);
210 return;
211 }
212 // console.log(provider_response);
213 if (provider_response["access_token"].length === 0) {
214 build_response.build_and_send_response(res, speak_on_correct_status.unauthorized, title, 'The access token was not retrieved correctly.', 'Unauthorized', '', true);
215 return;
216 }
217 try {
218 const token = await OAuth.handle_provider_response(provider_response, provider_data[0], database);
219 if (token === null) {
220 build_response.build_and_send_response(res, speak_on_correct_status.unauthorized, title, 'The token response handler has failed.', 'Unauthorized', '', true);
221 return;
222 }
223 build_response.build_and_send_response(res, speak_on_correct_status.success, title, '', { "token": token }, token, false);
224 } catch (error) {
225 build_response.build_and_send_response(res, speak_on_correct_status.unauthorized, title, 'The token response handler has failed.', 'Unauthorized', '', true);
226 return;
227 }
228})
229
230
231app.get("/user/about", async (req, res) => {
232 const title = `${req.url}`;
233 console.log(`endpoint: get: ${req.url}`);
234 let token = req.headers.authorization;
235 console.log(`token: ${token}`);
236 if (!token) {
237 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing token', 'Error', '', true);
238 return;
239 }
240 token = token.replace("Bearer ", "");
241 console.log(`Token without bearer: ${token}`);
242 const data = await database.getContentFromTable('users', ['*'], `token = '${token}'`);
243 // console.log(data);
244 if (!data || data.length === 0) {
245 console.log("No data");
246 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
247 return;
248 }
249 console.log("After data");
250 const final = {
251 id: Number(data[0].id),
252 username: String(data[0].name),
253 email: String(data[0].email),
254 };
255 // console.log(`Final: ${final}`);
256 // console.log(final);
257 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', final, '', false);
258});
259
260app.post('/login', async (req, res) => {
261 const title = `${req.url}`;
262 console.log(`endpoint: post: ${req.url}`);
263 const email = req.body.email;
264 const password = req.body.password;
265 console.log("email: ", email, "password: ", password);
266 console.log("getting user from the database if it exists");
267 const data = await database.getContentFromTable('users', ['*'], `email = '${email}'`);
268 if (data.length === 0) {
269 console.log("No user");
270 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid email or password', 'Error', '', true);
271 return;
272 }
273 console.log("user exists, loging them in");
274 const login_response = await Login.log_local_user_in(email, password, database);
275 if (login_response === null) {
276 console.log("login response is null");
277 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid email or password', 'Error', '', true);
278 return;
279 }
280 // console.log("login response: ", login_response);
281 const final = {
282 id: Number(data[0].id),
283 username: String(data[0].name),
284 email: String(data[0].email),
285 token: String(login_response),
286 };
287 // console.log(`final:`, final);
288 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', final, '', false);
289});
290
291app.post('/register', async (req, res) => {
292 const title = `${req.url}`;
293 console.log(`endpoint: post: ${req.url}`);
294 const email = req.body.email;
295 const password = req.body.password;
296 const username = req.body.username;
297
298 console.log("email: ", email, "password: ", password, "username: ", username);
299
300 console.log("Checking fields");
301
302 if (!email || !password || !username) {
303 console.log("Missing email, password or username");
304 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing email, password or username', 'Error', '', true);
305 return;
306 }
307
308 console.log("Checking if user already exists");
309
310 const response = await Login.register_user(username, email, password, database);
311 if (response === false) {
312 console.log("response is false");
313 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'The user has not been registered.', 'Error', '', true);
314 return;
315 }
316
317 console.log("User registered");
318
319 console.log("Checking if user exists");
320
321 const data = await database.getContentFromTable('users', ['*'], `email = '${email}'`);
322 if (data.length === 0) {
323 console.log("No user");
324 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid email or password', 'Error', '', true);
325 return;
326 }
327
328 console.log("User exists, logging them in");
329
330 const login_response = await Login.log_local_user_in(email, password, database);
331 if (login_response === null) {
332 console.log("login response is null");
333 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid email or password', 'Error', '', true);
334 return;
335 }
336
337 // console.log("login response: ", login_response);
338
339 const final = {
340 id: Number(data[0].id),
341 username: String(data[0].name),
342 email: String(data[0].email),
343 token: String(login_response),
344 };
345 // console.log(`final:`, final);
346 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', final, '', false);
347});
348
349app.get("/user/widgets", async (req, res) => {
350 const title = `${req.url}`;
351 console.log(`endpoint: get: ${req.url}`);
352 const token = req.headers.authorization;
353 console.log(`token: ${token}`);
354 const token_cleaned = token?.replace("Bearer ", "") || "";
355 console.log(`token cleaned: ${token_cleaned}`);
356 const data = await database.getContentFromTable('users', ['*'], `token = '${token_cleaned}'`);
357 // console.log(data);
358 if (data.length === 0) {
359 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
360 return;
361 }
362 const user_data = await Widgets.get_user_widgets(data[0], database);
363 // console.log("user_data: ", user_data);
364 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', user_data, '', false);
365});
366
367app.patch("/user/widget/:user_widget_id/:widget_type", async (req, res) => {
368 const title = `${req.url}`;
369 console.log(`endpoint: patch: ${req.url}`);
370 // Correctly extract widgetId
371 const widgetId = req.params.user_widget_id;
372 console.log(`widgetId: ${widgetId}`);
373 // Correctly extract widgetId
374 const widgetType = req.params.widget_type;
375 console.log(`widgetId: ${widgetType}`);
376
377 // Extract and clean token
378 const token = req.headers.authorization;
379 console.log(`token: ${token}`);
380 const token_cleaned = token?.replace("Bearer ", "") || "";
381 console.log(`token cleaned: ${token_cleaned}`);
382
383 // Validate user with token
384 const data = await database.getContentFromTable('users', ['*'], `token = '${token_cleaned}'`);
385 // console.log(data);
386 if (data.length === 0) {
387 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
388 return;
389 }
390
391 // Ensure widgetId is provided
392 if (!widgetId) {
393 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing widget id', 'Error', '', true);
394 return;
395 }
396
397 console.log("displaying body");
398 console.log("req.body: ", req.body);
399
400 // Extract optional location parameter
401 const location = req.body.location ?? null;
402
403 console.log("displaying body");
404 console.log("location: ", location);
405
406 // Process widget addition
407 const user_data = await Widgets.update_user_widget(data[0], widgetId, widgetType, location, database);
408 // console.log(user_data);
409
410 if (user_data === false) {
411 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'The widget has not been updated.', 'Error', '', true);
412 return;
413 }
414
415 // Send response
416 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', user_data, '', false);
417});
418
419app.post("/user/widget/:id/:location?", async (req, res) => {
420 const title = `${req.url}`;
421 console.log(`endpoint: post: ${req.url}`);
422
423 // Correctly extract widgetId
424 const widgetId = req.params.id;
425 console.log(`widgetId: ${widgetId}`);
426
427 // Extract and clean token
428 const token = req.headers.authorization;
429 console.log(`token: ${token}`);
430 const token_cleaned = token?.replace("Bearer ", "") || "";
431 console.log(`token cleaned: ${token_cleaned}`);
432
433 // Validate user with token
434 const data = await database.getContentFromTable('users', ['*'], `token = '${token_cleaned}'`);
435 // console.log(data);
436 if (data.length === 0) {
437 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
438 return;
439 }
440
441 // Ensure widgetId is provided
442 if (!widgetId) {
443 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing widget id', 'Error', '', true);
444 return;
445 }
446
447 // Extract optional location parameter
448 const location = req.params.location ?? null;
449
450 // Process widget addition
451 const user_data = await Widgets.add_user_widget(data[0], widgetId, location, database);
452 // console.log("user_data: ", user_data);
453
454 if (user_data === false) {
455 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'The widget has not been added.', 'Error', '', true);
456 return;
457 }
458
459 // Send response
460 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', user_data, '', false);
461});
462
463
464app.delete("/user/widget/:id", async (req, res) => {
465
466 const title = `${req.url}`;
467 console.log(`endpoint: delete: ${req.url}`);
468 const widgetId = req.params.id;
469 console.log(`widgetId: ${widgetId}`);
470 const token = req.headers.authorization;
471 console.log(`token: ${token}`);
472 const token_cleaned = token?.replace("Bearer ", "") || "";
473 console.log(`token cleaned: ${token_cleaned}`);
474 const data = await database.getContentFromTable('users', ['*'], `token = '${token_cleaned}'`);
475 console.log(data);
476 if (data.length === 0) {
477 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
478 return;
479 }
480 if (!widgetId) {
481 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing widget id', 'Error', '', true);
482 return;
483 }
484 const user_data = await Widgets.delete_user_widget(data[0], widgetId, database);
485 // console.log(user_data);
486 if (user_data === false) {
487 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'The widget has not been deleted.', 'Error', '', true);
488 return;
489 }
490 const user_widgets = await Widgets.get_user_widgets(data[0], database);
491 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', user_widgets, '', false);
492});
493
494app.get("/widgets", async (req, res) => {
495 const title = `${req.url}`;
496 console.log(`endpoint: get: ${req.url}`);
497 const token = req.headers.authorization;
498 console.log(`token: ${token}`);
499 const token_cleaned = token?.replace("Bearer ", "") || "";
500 console.log(`token cleaned: ${token_cleaned}`);
501 const data = await database.getContentFromTable('users', ['*'], `token = '${token_cleaned}'`);
502 // console.log(data);
503 if (data.length === 0) {
504 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
505 return;
506 }
507 const widgets = await Widgets.get_available_widget_names();
508 // console.log(widgets);
509 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', widgets, '', false);
510});
511
512app.get("/widget/:name", async (req, res) => {
513
514 const title = `${req.url}`;
515 console.log(`endpoint: get: ${req.url}`);
516 const widgetId = req.params.name;
517 console.log(`widgetId: ${widgetId}`);
518 const token = req.headers.authorization;
519 console.log(`token: ${token}`);
520 const token_cleaned = token?.replace("Bearer ", "") || "";
521 console.log(`token cleaned: ${token_cleaned}`);
522 const data = await database.getContentFromTable('users', ['*'], `token = '${token_cleaned}'`);
523 // console.log(data);
524 if (data.length === 0) {
525 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
526 return;
527 }
528 if (!widgetId) {
529 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing widget id', 'Error', '', true);
530 return;
531 }
532 const user_data = await Widgets.get_widget_info(data, widgetId, database);
533 // console.log(user_data);
534 if (user_data === false) {
535 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, '<p>Widget gathering error, the content for the given widget could not be fetched successfully.</p>', 'Error', '', true);
536 return;
537 }
538 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', user_data, '', false);
539});
540
541app.delete("/logout", async (req, res) => {
542 const title = `${req.url}`;
543 console.log(`endpoint: delete: ${req.url}`);
544 const token = req.headers.authorization;
545 console.log(`token: ${token}`);
546 const token_cleaned = token?.replace("Bearer ", "") || "";
547 console.log(`token cleaned: ${token_cleaned}`);
548 const data = await database.getContentFromTable('users', ['*'], `token = '${token_cleaned}'`);
549 // console.log(data);
550 if (data.length === 0) {
551 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
552 return;
553 }
554 const logout_response = await Login.log_user_out(token_cleaned, database);
555 if (logout_response === false) {
556 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'The user has not been logged out.', 'Error', '', true);
557 return;
558 }
559 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', "success", '', false);
560});
561
562app.post("/user/sso", async (req, res) => {
563 const title = `${req.url}`;
564 console.log(`endpoint: post: ${req.url}`);
565 const token = req.headers.authorization;
566 const body = req.body;
567 const username = body.username;
568 const password = body.password;
569
570 console.log(`body: ${JSON.stringify(body)}`);
571 console.log("title: ", title, "token: ", token, "username: ", username, "password: ", password);
572
573 if (!token) {
574 console.log("No token");
575 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing token', 'Error', '', true);
576 return;
577 }
578 console.log("token is present");
579 if (!username || !password) {
580 console.log("No username or password");
581 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing username or password', 'Error', '', true);
582 return;
583 }
584 console.log('username and password are present');
585 const token_cleaned = token.replace("Bearer ", "");
586
587 console.log("fetching data");
588 const data = await database.getContentFromTable('users', ['*'], `token = '${token_cleaned}'`);
589 console.log("data fetched");
590 // console.log(data);
591 if (!data || data.length === 0) {
592 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
593 return;
594 }
595
596 // console.log("token ", token_cleaned, "username ", username, "password ", password);
597
598 const response = await Login.update_user_information(token_cleaned, username, password, database);
599 // console.log("Response: ", response);
600 if (response === false) {
601 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'The user information has not been updated.', 'Error', '', true);
602 return;
603 }
604 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', 'Success', '', false);
605});
606
607app.get("/refresh", async (req, res) => {
608 console.log(`endpoint: get: ${req.url}`);
609 const title = `${req.url}`;
610 const token = req.headers.authorization;
611 console.log(`token: ${token}`);
612 const token_cleaned = token?.replace("Bearer ", "") || "";
613 console.log(`token cleaned: ${token_cleaned}`);
614 const data = await database.getContentFromTable('users', ['*'], `token = '${token_cleaned}'`);
615 console.log(data);
616 if (data.length === 0) {
617 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
618 return;
619 }
620 console.log("data: ", data);
621 const refresh = Number(data[0].refresh);
622 // console.log(`refresh: ${refresh}`);
623 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', { "refresh": refresh }, '', false);
624});
625
626app.post("/refresh/:refresh", async (req, res) => {
627 const title = `${req.url}`;
628 console.log(`endpoint: post: ${req.url}`);
629 const refreshDelay = Number(req.params.refresh);
630 console.log(`refreshDelay: ${refreshDelay}`);
631 const token = req.headers.authorization;
632 console.log(`token: ${token}`);
633 const token_cleaned = token?.replace("Bearer ", "") || "";
634 console.log(`token cleaned: ${token_cleaned}`);
635 const data = await database.getContentFromTable('users', ['*'], `token = '${token_cleaned}'`);
636 // console.log(data);
637 if (data.length === 0) {
638 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Invalid token', 'Error', '', true);
639 return;
640 }
641 if (!refreshDelay || refreshDelay < 0 || Number.isNaN(refreshDelay)) {
642 build_response.build_and_send_response(res, speak_on_correct_status.bad_request, title, 'Missing or invalid refresh delay', 'Error', '', true);
643 return;
644 }
645 await database.updateTable('users', ['refresh'], [refreshDelay], 'token = ?', [token_cleaned]);
646 build_response.build_and_send_response(res, speak_on_correct_status.success, title, 'Success', "Success", '', false);
647});
648
649// Export the app for testing purposes
650export default app
651
652// Define server variable to be accessible globally
653let server: any;
654
655// Start the server if not in test mode
656if (require.main === module) {
657
658 // Port and IP configuration
659 const port: number = Number(env?.port || env?.PORT || Args.get_port() || 5000);
660 const ip: string = env?.ip || env?.IP || Args.get_ip() || '0.0.0.0';
661
662 // Start the server
663 server = app.listen(port, ip, (): void => {
664 const serverAddress = server.address();
665 if (serverAddress) {
666 console.log(`Server is running on http://${serverAddress.address}:${serverAddress.port}`);
667 }
668 });
669}