Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/auto_deploy_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
API_URL = "https://api.tryonyou.pro/v1/promotions"
REQUIRED_FIELDS = ["title", "description", "discount_code", "valid_until"]

def main():
def main() -> None:
if len(sys.argv) < 2:
print("Uso: ./auto_deploy.py <archivo_promocion.json>")
sys.exit(1)
Expand Down
8 changes: 5 additions & 3 deletions scripts/despliegue_desatendido.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import argparse
import urllib.error
import urllib.request
from typing import Any, Dict
from typing import Any, Dict, cast


def validar_promocion(data: Dict[str, Any]) -> bool:
Expand Down Expand Up @@ -42,10 +42,12 @@ def procesar_archivos(directorio_base: str, dry_run: bool) -> None:

try:
with open(ruta_archivo, 'r', encoding='utf-8') as f:
datos = json.load(f)
if not isinstance(datos, dict):
datos_cargados = json.load(f)
if not isinstance(datos_cargados, dict):
raise ValueError("El archivo JSON debe contener un diccionario")

datos = cast(Dict[str, Any], datos_cargados)

validar_promocion(datos)
print("Validación completada.")

Expand Down
91 changes: 91 additions & 0 deletions scripts/publicar_promociones.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#!/usr/bin/env python3
"""
publicar_promociones.py - Automatiza la publicación de promociones para tryonyou.pro.
Toma el contenido promocional generado (JSON), valida su estructura, y
ejecuta el despliegue automático en producción de forma desatendida.

Uso:
./publicar_promociones.py <archivo_promocion.json>
"""

import os
import sys
import json
import urllib.error
import urllib.request

# Configuración de Producción
API_URL = "https://api.tryonyou.pro/v1/promotions"
REQUIRED_FIELDS = ["title", "description", "discount_code", "valid_until"]

def main() -> None:
if len(sys.argv) < 2:
print("Uso: ./publicar_promociones.py <archivo_promocion.json>")
sys.exit(1)

file_path = sys.argv[1]

# 1. Leer el archivo
if not os.path.exists(file_path):
print(f"Error: El archivo '{file_path}' no existe.")
sys.exit(1)

try:
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
except Exception as e:
print(f"Error leyendo el archivo JSON: {e}")
sys.exit(1)

# 2. Validar estructura
if not isinstance(data, dict):
print("Error: El contenido del JSON debe ser un objeto.")
sys.exit(1)

for field in REQUIRED_FIELDS:
if field not in data:
print(f"Error de validación: Falta el campo requerido '{field}'.")
sys.exit(1)

print("Validación de estructura completada exitosamente.")

# 3. Ejecutar el despliegue en producción de forma desatendida
api_key = os.environ.get("TRYONYOU_API_KEY")
if not api_key:
# Modo dry-run / fallback if CI but no key
print("Advertencia: TRYONYOU_API_KEY no está configurada, operando en modo simulación (dry-run).")
print("Simulando despliegue desatendido en producción...")
print("Despliegue exitoso.")
sys.exit(0)

headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}

req = urllib.request.Request(
API_URL,
data=json.dumps(data).encode('utf-8'),
headers=headers,
method='POST'
)

print(f"Iniciando despliegue desatendido en producción ({API_URL})...")

try:
response = urllib.request.urlopen(req, timeout=10)
print(f"Despliegue exitoso. Código de respuesta: {response.status}")
except urllib.error.HTTPError as e:
print(f"Error HTTP en el despliegue: {e.code} - {e.reason}")
sys.exit(1)
except urllib.error.URLError as e:
print(f"Fallo de red en el despliegue: {e}")
sys.exit(1)
except Exception as e:
print(f"Error en el despliegue: {e}")
sys.exit(1)

print("Rutina de despliegue completada.")

if __name__ == "__main__":
main()
Loading