Terarea  2
The automation project
Loading...
Searching...
No Matches
services.py
Go to the documentation of this file.
1"""
2This file contains every method about services
3"""
4
5from typing import Any, List
6from fastapi import Response, Request
7from display_tty import Disp, TOML_CONF, FILE_DESCRIPTOR, SAVE_TO_FILE, FILE_NAME
8from .. import constants as CONST
9from ..runtime_data import RuntimeData
10from ..http_codes import HCI
11
12
14 """
15 The class that contains every method about services
16 """
17
18 def __init__(self, runtime_data: RuntimeData, success: int = 0, error: int = 84, debug: bool = False) -> None:
19 """_summary_
20 The constructor of the services class
21 """
22 self.debug: bool = debug
23 self.success: int = success
24 self.error: int = error
25 self.runtime_data_initialised: RuntimeData = runtime_data
26 self.disp: Disp = Disp(
27 TOML_CONF,
28 SAVE_TO_FILE,
29 FILE_NAME,
30 FILE_DESCRIPTOR,
31 debug=self.debug,
32 logger=self.__class__.__name__
33 )
34
35 async def get_services(self, request: Request) -> Response:
36 """
37 The method to get every services contained in the db
38 """
39 title = "get_services"
40 token = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
41 request
42 )
43 self.disp.log_debug(f"Token = {token}", title)
44 if not token:
45 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(
46 title,
47 token
48 )
49 if self.runtime_data_initialised.boilerplate_non_http_initialised.is_token_correct(
50 token
51 ) is False:
52 return self.runtime_data_initialised.boilerplate_responses_initialised.invalid_token(
53 title
54 )
55 services_data = self.runtime_data_initialised.database_link.get_data_from_table(
56 CONST.TAB_SERVICES,
57 "*"
58 )
59 if not services_data or isinstance(services_data, int):
60 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
61 title=title,
62 message="services not found.",
63 resp="not found",
64 token=token,
65 error=True
66 )
67 return HCI.not_found(
68 content=body,
69 content_type=CONST.CONTENT_TYPE,
70 headers=self.runtime_data_initialised.json_header
71 )
72 self.disp.log_debug(f"Retrieved data {services_data}", title)
73 for i, service in enumerate(services_data):
74 if "api_key" in service:
75 services_data[i]["api_key"] = self.runtime_data_initialised.boilerplate_non_http_initialised.hide_api_key(
76 service["api_key"]
77 )
78 services_data[i]["created_at"] = self.runtime_data_initialised.database_link.datetime_to_string(
79 service["created_at"])
80 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
81 title=title,
82 message=services_data,
83 resp="success",
84 token=token
85 )
86 return HCI.success(
87 content=body,
88 content_type=CONST.CONTENT_TYPE,
89 headers=self.runtime_data_initialised.json_header
90 )
91
92 async def get_service_by_id(self, request: Request, service_id: str) -> Response:
93 """
94 The method to get a service by it's id
95 """
96 title = "Get service by id"
97 token = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
98 request
99 )
100 self.disp.log_debug(f"Token = {token}", title)
101 if not token:
102 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(
103 title,
104 token
105 )
106 if self.runtime_data_initialised.boilerplate_non_http_initialised.is_token_correct(
107 token
108 ) is False:
109 return self.runtime_data_initialised.boilerplate_responses_initialised.invalid_token(
110 title
111 )
112 service_data = self.runtime_data_initialised.database_link.get_data_from_table(
113 CONST.TAB_SERVICES,
114 "*",
115 f"id='{service_id}'",
116 beautify=True
117 )
118 if isinstance(service_data, int):
119 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
120 title,
121 token
122 )
123 for i, service in enumerate(service_data):
124 if "api_key" in service:
125 service_data[i]["api_key"] = self.runtime_data_initialised.boilerplate_non_http_initialised.hide_api_key(
126 service["api_key"]
127 )
128 service_data[i]["created_at"] = self.runtime_data_initialised.database_link.datetime_to_string(
129 service["created_at"]
130 )
131 if len(service_data) == 1:
132 service_data = service_data[0]
133 self.disp.log_debug(f"Service found: {service_data}", title)
134 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
135 title=title,
136 message=service_data,
137 resp="success",
138 token=token
139 )
140 return HCI.success(
141 content=body,
142 content_type=CONST.CONTENT_TYPE,
143 headers=self.runtime_data_initialised.json_header
144 )
145
146 async def get_services_by_tag(self, request: Request, tags: str) -> Response:
147 """
148 The function to get and filter every services by specifics tag
149 """
150 title = "get_services_by_tag"
151 token = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
152 request
153 )
154 self.disp.log_debug(f"Token = {token}", title)
155 if not token:
156 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(
157 title,
158 token
159 )
160 if self.runtime_data_initialised.boilerplate_non_http_initialised.is_token_correct(
161 token
162 ) is False:
163 return self.runtime_data_initialised.boilerplate_responses_initialised.invalid_token(
164 title
165 )
166 if not tags or tags == "":
167 return self.runtime_data_initialised.boilerplate_responses_initialised.bad_request(
168 title,
169 token
170 )
171 tags_list = tags.split(":")
172 services_data = self.runtime_data_initialised.database_link.get_data_from_table(
173 CONST.TAB_SERVICES,
174 "*"
175 )
176 filtered_services: list[dict] = []
177 for i, service in enumerate(services_data):
178 if "api_key" in service:
179 service[i]["api_key"] = self.runtime_data_initialised.boilerplate_non_http_initialised.hide_api_key(
180 service["api_key"]
181 )
182 for _, element in enumerate(tags_list):
183 if element in service["tags"]:
184 filtered_services.append(service)
185 if not filtered_services:
186 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
187 title=title,
188 message=f"No services found with the given tags '{tags}'.",
189 resp="not found",
190 token=token,
191 error=True
192 )
193 return HCI.not_found(
194 content=body,
195 content_type=CONST.CONTENT_TYPE,
196 headers=self.runtime_data_initialised.json_header
197 )
198 for i, service in enumerate(filtered_services):
199 filtered_services[i]["created_at"] = self.runtime_data_initialised.database_link.datetime_to_string(
200 service["created_at"])
201 msg = f"Services with guven tags '{tags}': "
202 msg += f"{filtered_services}"
203 self.disp.log_debug(msg, title)
204 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
205 title=title,
206 message=filtered_services,
207 resp="success",
208 token=token
209 )
210 return HCI.success(
211 content=body,
212 content_type=CONST.CONTENT_TYPE,
213 headers=self.runtime_data_initialised.json_header
214 )
215
216 async def get_recent_services(self, request: Request) -> Response:
217 """
218 The function to get and filter every services by the most recent to the oldest
219 """
220 title = "get_recent_services"
221 token = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
222 request
223 )
224 self.disp.log_debug(f"Token = {token}", title)
225 if not token:
226 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(
227 title,
228 token
229 )
230 if self.runtime_data_initialised.boilerplate_non_http_initialised.is_token_correct(
231 token
232 ) is False:
233 return self.runtime_data_initialised.boilerplate_responses_initialised.invalid_token(
234 title
235 )
236 service_data = self.runtime_data_initialised.database_link.get_data_from_table(
237 CONST.TAB_SERVICES,
238 "*"
239 )
240 recent_services = sorted(
241 service_data, key=lambda x: x["created_at"], reverse=True
242 )[:10]
243 if not recent_services:
244 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
245 title=title,
246 message="No recent services found.",
247 resp="not found",
248 token=token,
249 error=True
250 )
251 return HCI.not_found(
252 content=body,
253 content_type=CONST.CONTENT_TYPE,
254 headers=self.runtime_data_initialised.json_header
255 )
256 for i, service in enumerate(recent_services):
257 if "api_key" in service:
258 service_data[i]["api_key"] = self.runtime_data_initialised.boilerplate_non_http_initialised.hide_api_key(
259 service["api_key"]
260 )
261 recent_services[i]["created_at"] = self.runtime_data_initialised.database_link.datetime_to_string(
262 service["created_at"])
263 self.disp.log_debug(f"Recent services: {recent_services}", title)
264 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
265 title=title,
266 message=recent_services,
267 resp="success",
268 token=token
269 )
270 return HCI.success(
271 content=body,
272 content_type=CONST.CONTENT_TYPE,
273 headers=self.runtime_data_initialised.json_header
274 )
275
276 async def get_service_id_by_name(self, request: Request, name: str) -> Response:
277 """
278 The function to get a service id by the name
279 """
280 title = "get_service_id_by_name"
281 token = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
282 request
283 )
284 self.disp.log_debug(f"Token = {token}", title)
285 if not token:
286 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(
287 title,
288 token
289 )
290 if self.runtime_data_initialised.boilerplate_non_http_initialised.is_token_correct(
291 token
292 ) is False:
293 return self.runtime_data_initialised.boilerplate_responses_initialised.invalid_token(
294 title
295 )
296 retrieved_id = self.runtime_data_initialised.database_link.get_data_from_table(
297 CONST.TAB_SERVICES,
298 "id",
299 f"name='{name}'"
300 )
301 if isinstance(retrieved_id, int):
302 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
303 title,
304 token
305 )
306 service_id = str(retrieved_id[0]["id"])
307 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
308 title=title,
309 message=service_id,
310 resp="success",
311 token=token
312 )
313 return HCI.success(
314 content=body,
315 content_type=CONST.CONTENT_TYPE,
316 headers=self.runtime_data_initialised.json_header
317 )
318
319 async def create_service(self, request: Request, name: str) -> Response:
320 """
321 Create a new service (Only for admin account)
322 """
323 title: str = "create_service"
324 token: str = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
325 request
326 )
327 if not token:
328 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(
329 title,
330 token
331 )
332 if self.runtime_data_initialised.boilerplate_non_http_initialised.is_token_admin(
333 token
334 ) is False:
335 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(title, token)
336 if not name:
337 return self.runtime_data_initialised.boilerplate_responses_initialised.bad_request(
338 title,
339 token
340 )
341 self.disp.log_debug(f"Service name: {name}", title)
342 response = self.runtime_data_initialised.database_link.get_data_from_table(
343 CONST.TAB_SERVICES,
344 "*",
345 f"name='{name}'"
346 )
347 if isinstance(response, int) is False:
348 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
349 title,
350 token
351 )
352 request_body = await self.runtime_data_initialised.boilerplate_incoming_initialised.get_body(request)
353 if not request_body or not all(key in request_body for key in ("url", "api_key", "category", "type", "tags", "colour", "description")):
354 return self.runtime_data_initialised.boilerplate_responses_initialised.bad_request(
355 title,
356 token
357 )
358 self.disp.log_debug(f"Request body: {request_body}", title)
359 data: list = [
360 name,
361 request_body["url"],
362 request_body["api_key"],
363 request_body["category"],
364 str(0),
365 request_body["type"],
366 request_body["tags"],
367 "NOW()",
368 str(int(False)),
369 request_body["colour"],
370 request_body["description"]
371 ]
372 self.disp.log_debug(f"Generated data: {data}", title)
373 columns: List[Any] = self.runtime_data_initialised.database_link.get_table_column_names(
374 CONST.TAB_SERVICES)
375 if isinstance(columns, int):
376 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
377 title,
378 token
379 )
380 columns.pop(0)
381 self.disp.log_debug(f"Columns: {columns}", title)
382 if self.runtime_data_initialised.database_link.insert_data_into_table(CONST.TAB_SERVICES, data, columns) == self.error:
383 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
384 title,
385 token
386 )
387 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
388 title=title,
389 message="The new service is created successfully.",
390 resp="success",
391 token=token
392 )
393 return HCI.success(
394 content=body,
395 content_type=CONST.CONTENT_TYPE,
396 headers=self.runtime_data_initialised.json_header
397 )
398
399 async def update_service(self, request: Request, service_id: str) -> Response:
400 """
401 Update a service data (Only for admin account)
402 """
403 title: str = "update_service"
404 token: str = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
405 request
406 )
407 if not token:
408 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(
409 title,
410 token
411 )
412 if self.runtime_data_initialised.boilerplate_non_http_initialised.is_token_admin(
413 token
414 ) is False:
415 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(title, token)
416 if not service_id:
417 return self.runtime_data_initialised.boilerplate_responses_initialised.bad_request(
418 title,
419 token
420 )
421 self.disp.log_debug(f"Service id: {service_id}", title)
422 if isinstance(self.runtime_data_initialised.database_link.get_data_from_table(
423 CONST.TAB_SERVICES,
424 "*",
425 f"id='{service_id}'"
426 ), int):
427 msg = f"Failed to retrieve data from '{CONST.TAB_SERVICES}'"
428 msg += " table."
429 self.disp.log_error(msg, title)
430 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
431 title,
432 token
433 )
434 request_body = await self.runtime_data_initialised.boilerplate_incoming_initialised.get_body(
435 request
436 )
437 if not request_body or not all(key in request_body for key in ("name", "url", "api_key", "category", "tags", "colour", "description")):
438 return self.runtime_data_initialised.boilerplate_responses_initialised.bad_request(
439 title,
440 token
441 )
442 self.disp.log_debug(f"Request body: {request_body}", title)
443 data: list = [
444 request_body["name"],
445 request_body["url"],
446 request_body["api_key"],
447 request_body["category"],
448 request_body["tags"],
449 request_body["colour"],
450 request_body["description"]
451 ]
452 self.disp.log_debug(f"Generated data: {data}", title)
453 columns: list = self.runtime_data_initialised.database_link.get_table_column_names(
454 CONST.TAB_SERVICES
455 )
456 if isinstance(columns, int):
457 msg = "Failed to retrieve columns from "
458 msg += f"'{CONST.TAB_SERVICES}' table."
459 self.disp.log_error(msg, title)
460 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
461 title,
462 token
463 )
464 columns.pop(0)
465 columns.pop(4)
466 columns.pop(4)
467 columns.pop(5)
468 columns.pop(5)
469 self.disp.log_debug(f"Columns: {columns}", title)
470 if self.runtime_data_initialised.database_link.update_data_in_table(
471 CONST.TAB_SERVICES,
472 data,
473 columns,
474 f"id='{service_id}'"
475 ) == self.error:
476 msg = f"Failed to update data in '{CONST.TAB_SERVICES}"
477 msg += "' table."
478 self.disp.log_error(msg, title)
479 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
480 title,
481 token
482 )
483 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
484 title=title,
485 message="The service is updated successfully.",
486 resp="success",
487 token=token
488 )
489 return HCI.success(
490 content=body,
491 content_type=CONST.CONTENT_TYPE,
492 headers=self.runtime_data_initialised.json_header
493 )
494
495 async def patch_service(self, request: Request, service_id: str) -> Response:
496 """
497 Update a service value (Only for admin account)
498 """
499 title: str = "update_service"
500 token: str = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
501 request
502 )
503 if not token:
504 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(
505 title,
506 token
507 )
508 if self.runtime_data_initialised.boilerplate_non_http_initialised.is_token_admin(
509 token
510 ) is False:
511 return self.runtime_data_initialised.boilerplate_responses_initialised.unauthorized(title, token)
512 if not service_id:
513 return self.runtime_data_initialised.boilerplate_responses_initialised.bad_request(
514 title,
515 token
516 )
517 self.disp.log_debug(f"Service id: {service_id}", title)
518 if isinstance(self.runtime_data_initialised.database_link.get_data_from_table(
519 CONST.TAB_SERVICES,
520 "*",
521 f"id='{service_id}'"
522 ), int):
523 msg = f"Failed to retrieve data from '{CONST.TAB_SERVICES}'"
524 msg += "table."
525 self.disp.log_error(msg, title)
526 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
527 title,
528 token
529 )
530 request_body = await self.runtime_data_initialised.boilerplate_incoming_initialised.get_body(
531 request
532 )
533 if not request_body:
534 return self.runtime_data_initialised.boilerplate_responses_initialised.bad_request(
535 title,
536 token
537 )
538 self.disp.log_debug(f"Request body: {request_body}", title)
539 if "name" in request_body:
540 if self.runtime_data_initialised.boilerplate_non_http_initialised.update_single_data(
541 CONST.TAB_SERVICES,
542 "id",
543 "name",
544 service_id,
545 request_body
546 ) == self.error:
547 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(title, token)
548 if "url" in request_body:
549 if self.runtime_data_initialised.boilerplate_non_http_initialised.update_single_data(
550 CONST.TAB_SERVICES,
551 "id",
552 "url",
553 service_id,
554 request_body
555 ) == self.error:
556 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(title, token)
557 if "api_key" in request_body:
558 if self.runtime_data_initialised.boilerplate_non_http_initialised.update_single_data(
559 CONST.TAB_SERVICES,
560 "id",
561 "api_key",
562 service_id,
563 request_body
564 ) == self.error:
565 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(title, token)
566 if "category" in request_body:
567 if self.runtime_data_initialised.boilerplate_non_http_initialised.update_single_data(
568 CONST.TAB_SERVICES,
569 "id",
570 "category",
571 service_id,
572 request_body
573 ) == self.error:
574 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(title, token)
575 if "tags" in request_body:
576 if self.runtime_data_initialised.boilerplate_non_http_initialised.update_single_data(
577 CONST.TAB_SERVICES,
578 "id",
579 "tags",
580 service_id,
581 request_body
582 ) == self.error:
583 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(title, token)
584 if "colour" in request_body:
585 if self.runtime_data_initialised.boilerplate_non_http_initialised.update_single_data(
586 CONST.TAB_SERVICES,
587 "id",
588 "colour",
589 service_id,
590 request_body
591 ) == self.error:
592 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(title, token)
593 if "description" in request_body:
594 if self.runtime_data_initialised.boilerplate_non_http_initialised.update_single_data(
595 CONST.TAB_SERVICES,
596 "id",
597 "description",
598 service_id,
599 request_body
600 ) == self.error:
601 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(title, token)
602 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
603 title=title,
604 message="The service value is updated successfully.",
605 resp="success",
606 token=token
607 )
608 return HCI.success(
609 content=body,
610 content_type=CONST.CONTENT_TYPE,
611 headers=self.runtime_data_initialised.json_header
612 )
613
614 async def delete_service(self, request: Request, service_id: str) -> Response:
615 """
616 The function to delete a service from the database
617 """
618 title: str = "delete_oauth_provider"
619 if not service_id:
620 return self.runtime_data_initialised.boilerplate_responses_initialised.provider_not_given(
621 title,
622 None
623 )
624 self.disp.log_debug(f"Service id: {service_id}", title)
625 token: str = self.runtime_data_initialised.boilerplate_incoming_initialised.get_token_if_present(
626 request
627 )
628 self.disp.log_debug(f"Token gotten: {token}", title)
629 if self.runtime_data_initialised.boilerplate_non_http_initialised.is_token_correct(token) is False:
630 self.disp.log_error("You're not admin.", title)
631 return self.runtime_data_initialised.boilerplate_responses_initialised.insuffisant_rights(
632 title,
633 token
634 )
635 retrived_data = self.runtime_data_initialised.database_link.get_data_from_table(
636 CONST.TAB_SERVICES,
637 "*",
638 f"id='{service_id}'"
639 )
640 if isinstance(retrived_data, int):
641 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
642 title,
643 token
644 )
645 provider_name = retrived_data[0]["name"]
646 # Add a code to delete every users actions with this service
647 # Add a code to delete every applets with this service
648 if retrived_data[0]["oauth"] == 1:
649 if self.runtime_data_initialised.database_link.drop_data_from_table(
650 CONST.TAB_ACTIVE_OAUTHS,
651 f"service_id='{service_id}'"
652 ) == self.error:
653 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
654 title,
655 token
656 )
657 if self.runtime_data_initialised.database_link.drop_data_from_table(
658 CONST.TAB_USER_OAUTH_CONNECTION,
659 f"provider_name='{provider_name}'"
660 ) == self.error:
661 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
662 title,
663 token
664 )
665 if self.runtime_data_initialised.database_link.drop_data_from_table(
666 CONST.TAB_SERVICES,
667 f"id='{service_id}'"
668 ) == self.error:
669 return self.runtime_data_initialised.boilerplate_responses_initialised.internal_server_error(
670 title,
671 token
672 )
673 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
674 title=title,
675 message="The service has been deleted successfully.",
676 resp="success",
677 token=token,
678 )
679 return HCI.success(
680 body,
681 content_type=CONST.CONTENT_TYPE,
682 headers=self.runtime_data_initialised.json_header
683 )
Response get_recent_services(self, Request request)
Definition services.py:216
Response get_services(self, Request request)
Definition services.py:35
Response get_service_by_id(self, Request request, str service_id)
Definition services.py:92
Response update_service(self, Request request, str service_id)
Definition services.py:399
Response create_service(self, Request request, str name)
Definition services.py:319
None __init__(self, RuntimeData runtime_data, int success=0, int error=84, bool debug=False)
Definition services.py:18
Response delete_service(self, Request request, str service_id)
Definition services.py:614
Response get_services_by_tag(self, Request request, str tags)
Definition services.py:146
Response get_service_id_by_name(self, Request request, str name)
Definition services.py:276
Response patch_service(self, Request request, str service_id)
Definition services.py:495