Erwin Jacimino před 5 měsíci
rodič
revize
24f131dd92
3 změnil soubory, kde provedl 81 přidání a 32 odebrání
  1. 66 24
      fudo/fudo.py
  2. 3 0
      public/main/js/app.js
  3. 12 8
      update_prices.py

+ 66 - 24
fudo/fudo.py

@@ -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))

+ 3 - 0
public/main/js/app.js

@@ -1,3 +1,6 @@
+// derivar para fudo
+window.location.replace("https://menu.fu.do/klein/qr-menu");
+
 
 //--- Imports ---
 import { getOnlineUserCount, getUserList } from './service/chat.js';

+ 12 - 8
update_prices.py

@@ -1,16 +1,16 @@
 #deploy
 import psycopg2
 from config.settings import POSTGRESQL_DB_CONFIG
-from fudo.fudo import get_product, get_products, get_category
+from fudo.fudo import get_product, get_products, get_category, get_all_products
 from models.items import Product
 from rich import print
 indexed_products = {}
 
-for x in range(1,6):
-    products = get_products(x)
-    for product in products:
-        indexed_products[str(product["id"])] = product
-print(len(indexed_products))
+# for x in range(1,6):
+#     products = get_products(x)
+#     for product in products:
+#         indexed_products[str(product["id"])] = product
+# print(len(indexed_products))
 
 
 def update_prices():
@@ -114,6 +114,10 @@ def add_missing_products():
 
 if __name__ == "__main__":
     # Primero agregamos los que faltan
-    add_missing_products()
+    # add_missing_products()
     # Luego actualizamos precios (su función original)
-    update_prices()
+    # update_prices()
+
+    products = get_all_products()
+    for product in products:
+        indexed_products[str(product["id"])] = product