94 lines
2.7 KiB
Python
Executable File
94 lines
2.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Saleor API Helper — uso programatico do motor M5
|
|
Carrega SALEOR_APP_TOKEN de scripts/.env e executa queries/mutations GraphQL
|
|
"""
|
|
import os
|
|
import sys
|
|
import json
|
|
import argparse
|
|
import urllib.request
|
|
import urllib.error
|
|
from pathlib import Path
|
|
|
|
# Carregar .env
|
|
ENV_FILE = Path(__file__).parent / ".env"
|
|
if ENV_FILE.exists():
|
|
for line in ENV_FILE.read_text().splitlines():
|
|
line = line.strip()
|
|
if not line or line.startswith("#"):
|
|
continue
|
|
if "=" in line:
|
|
k, v = line.split("=", 1)
|
|
v = v.strip().strip('"').strip("'")
|
|
os.environ.setdefault(k, v)
|
|
|
|
SALEOR_URL = os.environ.get("SALEOR_API_URL", "https://loja.m5digital.net.br/graphql/")
|
|
SALEOR_TOKEN = os.environ.get("SALEOR_APP_TOKEN", "")
|
|
|
|
|
|
def query(gql: str, variables: dict = None) -> dict:
|
|
payload = json.dumps({"query": gql, "variables": variables or {}}).encode()
|
|
req = urllib.request.Request(
|
|
SALEOR_URL,
|
|
data=payload,
|
|
headers={
|
|
"Content-Type": "application/json",
|
|
"Authorization": f"Bearer {SALEOR_TOKEN}",
|
|
},
|
|
)
|
|
with urllib.request.urlopen(req, timeout=30) as resp:
|
|
return json.loads(resp.read().decode())
|
|
|
|
|
|
def cmd_query(args):
|
|
result = query(args.query)
|
|
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
|
|
|
|
def cmd_me(args):
|
|
r = query("{ me { email isStaff } }")
|
|
print(json.dumps(r.get("data", r), indent=2))
|
|
|
|
|
|
def cmd_products(args):
|
|
r = query(
|
|
"{ products(first: %d, channel: \"m5-digital\") { totalCount edges { node { id name slug } } } }"
|
|
% args.first
|
|
)
|
|
print(json.dumps(r.get("data", r), indent=2, ensure_ascii=False))
|
|
|
|
|
|
def cmd_count(args):
|
|
r = query("{ products(first: 1) { totalCount } orders(first: 1) { totalCount } channels { id name slug isActive } }")
|
|
print(json.dumps(r.get("data", r), indent=2, ensure_ascii=False))
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Saleor API Helper")
|
|
sub = parser.add_subparsers(dest="cmd", required=True)
|
|
|
|
p = sub.add_parser("query", help="executa query GraphQL arbitraria")
|
|
p.add_argument("query", help='query GraphQL entre aspas')
|
|
p.set_defaults(func=cmd_query)
|
|
|
|
p = sub.add_parser("me", help="usuario autenticado")
|
|
p.set_defaults(func=cmd_me)
|
|
|
|
p = sub.add_parser("products", help="lista produtos")
|
|
p.add_argument("--first", type=int, default=10)
|
|
p.set_defaults(func=cmd_products)
|
|
|
|
p = sub.add_parser("count", help="contadores")
|
|
p.set_defaults(func=cmd_count)
|
|
|
|
args = parser.parse_args()
|
|
if not SALEOR_TOKEN:
|
|
print("ERRO: SALEOR_APP_TOKEN nao definido em scripts/.env", file=sys.stderr)
|
|
sys.exit(1)
|
|
args.func(args)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|