|
|
@@ -5,6 +5,7 @@ from config.settings import DEVELOPMENT
|
|
|
import os
|
|
|
import redis
|
|
|
from logging import getLogger
|
|
|
+from models.items import Product
|
|
|
|
|
|
logger = getLogger(__name__)
|
|
|
|
|
|
@@ -33,14 +34,12 @@ def get_token():
|
|
|
global token, token_exp
|
|
|
# Intento de obtener el token desde la RAM
|
|
|
if token and token_exp and time() < token_exp:
|
|
|
- logger.info("Token obtenido desde variable global")
|
|
|
return token
|
|
|
try:
|
|
|
# Intentar obtener el token desde Redis
|
|
|
cached_token = redis_client.get(REDIS_TOKEN_KEY)
|
|
|
|
|
|
if cached_token:
|
|
|
- logger.info("Token obtenido desde Redis cache")
|
|
|
|
|
|
token = cached_token
|
|
|
|
|
|
@@ -74,7 +73,6 @@ def get_token():
|
|
|
# Guardar el token en Redis con expiración automática
|
|
|
if ttl_seconds > 0:
|
|
|
redis_client.setex(REDIS_TOKEN_KEY, ttl_seconds, token)
|
|
|
- logger.info(f"Token nuevo guardado en Redis (expira en {ttl_seconds} segundos)")
|
|
|
else:
|
|
|
logger.warning("Warning: El token ya está expirado")
|
|
|
except Exception as e:
|
|
|
@@ -91,6 +89,22 @@ def get_categories():
|
|
|
r = requests.get(url, headers=headers)
|
|
|
return r.json()
|
|
|
|
|
|
+def get_category(id_category:int):
|
|
|
+ token = get_token()
|
|
|
+ url = 'https://api.fu.do/v1alpha1/product-categories/{}'.format(id_category)
|
|
|
+ headers = {
|
|
|
+ 'Authorization': 'Bearer ' + token
|
|
|
+ }
|
|
|
+ r = requests.get(url, headers=headers)
|
|
|
+ if r.status_code != 200:
|
|
|
+ logger.error(f"Error al obtener producto: {r.json()['errors']}")
|
|
|
+ data = r.json()["data"]
|
|
|
+ return {
|
|
|
+ "id": data["id"],
|
|
|
+ "name": data["attributes"]["name"],
|
|
|
+ "enableOnlineMenu": data["attributes"].get("enableOnlineMenu", False)
|
|
|
+ }
|
|
|
+
|
|
|
def get_product(id_category:int):
|
|
|
url = 'https://api.fu.do/v1alpha1/products/{}'.format(id_category)
|
|
|
token = get_token()
|
|
|
@@ -100,16 +114,56 @@ def get_product(id_category:int):
|
|
|
r = requests.get(url, headers=headers)
|
|
|
if r.status_code != 200:
|
|
|
logger.error(f"Error al obtener producto: {r.json()['errors']}")
|
|
|
- return r.json()
|
|
|
+ data = r.json().get("data")
|
|
|
+ if not data:
|
|
|
+ return None
|
|
|
+ return Product(
|
|
|
+ id=int(data["id"]),
|
|
|
+ name=data["attributes"]["name"],
|
|
|
+ type=get_category(data["relationships"]["productCategory"]["data"]["id"])["name"] or "Producto",
|
|
|
+ price=data["attributes"]["price"],
|
|
|
+ image=data["attributes"]["imageUrl"],
|
|
|
+ description=data["attributes"]["description"],
|
|
|
+ status=1 if data["attributes"]["active"] and data else 0,
|
|
|
+ promo_day=None,
|
|
|
+ promo_price=None,
|
|
|
+ promo_id=None
|
|
|
+ )
|
|
|
+
|
|
|
|
|
|
-def get_products():
|
|
|
- url = 'https://api.fu.do/v1alpha1/products'
|
|
|
+def get_products(page: int = 1):
|
|
|
+ url = 'https://api.fu.do/v1alpha1/products?page[number]={}'.format(page)
|
|
|
token = get_token()
|
|
|
headers = {
|
|
|
'Authorization': 'Bearer ' + token
|
|
|
}
|
|
|
r = requests.get(url, headers=headers)
|
|
|
- return list(filter(lambda x: x['relationships']['productCategory']['data']['id'] == '1', r.json()['data']))
|
|
|
+ return r.json()['data']
|
|
|
+
|
|
|
+def get_all_products():
|
|
|
+ """Método para obtener todos los productos de la base de datos.
|
|
|
+
|
|
|
+ Returns:
|
|
|
+ Diccionario de productos con IDs como claves y datos de productos como valores.
|
|
|
+ """
|
|
|
+ url = 'https://api.fu.do/v1alpha1/products?page[number]={}'
|
|
|
+ products = {}
|
|
|
+ token = get_token()
|
|
|
+ page = 1
|
|
|
+ while True:
|
|
|
+ r = requests.get(url.format(page), headers={'Authorization': 'Bearer ' + token})
|
|
|
+ if r.status_code != 200:
|
|
|
+ if products:
|
|
|
+ return products
|
|
|
+ else:
|
|
|
+ return None
|
|
|
+ data = r.json().get('data')
|
|
|
+ if not data:
|
|
|
+ return products
|
|
|
+ for product in data:
|
|
|
+ products[product['id']] = product
|
|
|
+ page += 1
|
|
|
+
|
|
|
N_PER_PAGE = 100
|
|
|
|
|
|
def _get_page_bounds(page: int, token: str):
|
|
|
@@ -324,22 +378,6 @@ def clear_token():
|
|
|
except Exception as e:
|
|
|
logger.error(f"Error al eliminar token de Redis: {e}")
|
|
|
|
|
|
-if __name__ == "__main__":
|
|
|
- table = get_table(107)
|
|
|
- if table is None:
|
|
|
- logger.error('No se pudo obtener la mesa')
|
|
|
- exit()
|
|
|
- activeSale = get_active_sale(table)
|
|
|
- if not activeSale:
|
|
|
- logger.error('No hay una venta activa para la mesa')
|
|
|
- activeSale = create_sale(table['id'])
|
|
|
- if activeSale is None:
|
|
|
- logger.error('No se pudo crear la venta')
|
|
|
- exit()
|
|
|
- else:
|
|
|
- activeSale = activeSale[0]
|
|
|
- logger.info('Venta activa: %s', activeSale['id'])
|
|
|
-
|
|
|
|
|
|
"""
|
|
|
Instrucciones para hacer un pedido:
|
|
|
@@ -353,4 +391,8 @@ Configuración de Redis:
|
|
|
- Host: REDIS_HOST (default: localhost)
|
|
|
- Puerto: REDIS_PORT (default: 6379)
|
|
|
- Base de datos: REDIS_DB (default: 0)
|
|
|
-"""
|
|
|
+"""
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ from rich import print
|
|
|
+ print(get_product(1))
|