diff --git a/app/__init__.py b/app/__init__.py index 435a7c4..2fb0a67 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -8,7 +8,7 @@ from .routes.auth import auth from .routes.perfil import perfil from .routes.montagem import montagem from .routes.zabbix import zabbix -from .routes.zammad import zammad +from .routes.integrator import zammad # Inicializa o MySQL mysql = MySQL() diff --git a/app/__pycache__/__init__.cpython-311.pyc b/app/__pycache__/__init__.cpython-311.pyc index ea54a8c..7fcb5cd 100644 Binary files a/app/__pycache__/__init__.cpython-311.pyc and b/app/__pycache__/__init__.cpython-311.pyc differ diff --git a/app/__pycache__/config.cpython-311.pyc b/app/__pycache__/config.cpython-311.pyc index f3b82bc..3fe355b 100644 Binary files a/app/__pycache__/config.cpython-311.pyc and b/app/__pycache__/config.cpython-311.pyc differ diff --git a/app/config.py b/app/config.py index ef5d4fc..23a6d81 100644 --- a/app/config.py +++ b/app/config.py @@ -25,7 +25,7 @@ class Config: LDAP_PASSWORD = os.getenv('LDAP_PASSWORD', '123Mudar') # Senha do usuário LDAP #Api Zammad - zammad_api_url = 'http://10.10.253.59/api/v1' + zammad_api_url = 'http://zammad.itguys.com.br/api/v1' zammad_token = 'L081vJ19kood2uDlTSSt59LWBaewT9-a-MH_VKno8RY' diff --git a/app/routes/__pycache__/__init__.cpython-311.pyc b/app/routes/__pycache__/__init__.cpython-311.pyc index 84ca60e..9986904 100644 Binary files a/app/routes/__pycache__/__init__.cpython-311.pyc and b/app/routes/__pycache__/__init__.cpython-311.pyc differ diff --git a/app/routes/__pycache__/auth.cpython-311.pyc b/app/routes/__pycache__/auth.cpython-311.pyc index 0304289..a191178 100644 Binary files a/app/routes/__pycache__/auth.cpython-311.pyc and b/app/routes/__pycache__/auth.cpython-311.pyc differ diff --git a/app/routes/__pycache__/integrator.cpython-311.pyc b/app/routes/__pycache__/integrator.cpython-311.pyc new file mode 100644 index 0000000..d526edb Binary files /dev/null and b/app/routes/__pycache__/integrator.cpython-311.pyc differ diff --git a/app/routes/__pycache__/montagem.cpython-311.pyc b/app/routes/__pycache__/montagem.cpython-311.pyc index 7e23648..8ffc1a9 100644 Binary files a/app/routes/__pycache__/montagem.cpython-311.pyc and b/app/routes/__pycache__/montagem.cpython-311.pyc differ diff --git a/app/routes/__pycache__/perfil.cpython-311.pyc b/app/routes/__pycache__/perfil.cpython-311.pyc index bb737d6..b071bf3 100644 Binary files a/app/routes/__pycache__/perfil.cpython-311.pyc and b/app/routes/__pycache__/perfil.cpython-311.pyc differ diff --git a/app/routes/__pycache__/zabbix.cpython-311.pyc b/app/routes/__pycache__/zabbix.cpython-311.pyc index 747f38f..447e478 100644 Binary files a/app/routes/__pycache__/zabbix.cpython-311.pyc and b/app/routes/__pycache__/zabbix.cpython-311.pyc differ diff --git a/app/routes/__pycache__/zammad.cpython-311.pyc b/app/routes/__pycache__/zammad.cpython-311.pyc index cb92841..cdfa48b 100644 Binary files a/app/routes/__pycache__/zammad.cpython-311.pyc and b/app/routes/__pycache__/zammad.cpython-311.pyc differ diff --git a/app/routes/auth.py b/app/routes/auth.py index 60f61ba..7f6750e 100644 --- a/app/routes/auth.py +++ b/app/routes/auth.py @@ -78,10 +78,9 @@ def login(): if not is_valid_email(username_full): return jsonify({'msg': 'Formato de e-mail inválido'}), 400 - # Separar nome de usuário e domínio + # Separar nome de usuário e domínio try: username, domain = username_full.split('@') - print(f" Domínio extraído: {domain}") # <-- Adiciona este print except ValueError: return jsonify({'msg': 'Formato de usuário inválido. Use "usuario@dominio.com".'}), 400 @@ -90,13 +89,11 @@ def login(): with mysql.connection.cursor() as cur: cur.execute("SELECT idempresa, ip_dominio FROM empresa WHERE dominio = %s", (domain,)) empresa_result = cur.fetchone() - if not empresa_result: return jsonify({'msg': 'Domínio não encontrado no banco de dados'}), 404 id_empresa, ip_dominio = empresa_result - # Verificar se o usuário está associado à empresa no MySQL with mysql.connection.cursor() as cur: @@ -111,8 +108,8 @@ def login(): return jsonify({'msg': 'Erro no banco de dados'}), 500 # Conexão LDAP com autenticação - ldap_server = f'ldap://{"itguys.com.br:389"}' # Altere para 'ldaps://{ip_dominio}:636' se LDAPS for usado - ldap_user = f'{domain}\\{username}' # Formato DOMAIN\username + ldap_server = f'ldap://{"itguys.com.br:389"}' + ldap_user = f'{domain}\\{username}' try: server = ldap3.Server(ldap_server, get_info=ldap3.ALL) @@ -120,20 +117,19 @@ def login(): server, user=username_full, password=password, - authentication=ldap3.SIMPLE + authentication=ldap3.SIMPLE ) - - if conn.bind(): token = jwt.encode({ 'user': username_full, + 'domain': domain, # Incluindo o domínio no payload 'exp': datetime.utcnow() + timedelta(hours=1) }, current_app.config['SECRET_KEY'], algorithm="HS256") conn.unbind() logging.info(f"Login bem-sucedido para usuário: {username_full}") - return jsonify({'msg': 'Login bem-sucedido', 'token': token}), 200 + return jsonify({'msg': 'Login bem-sucedido', 'token': token, 'domain': domain}), 200 else: conn.unbind() logging.warning(f"Falha na autenticação LDAP para o usuário: {username_full}") @@ -149,8 +145,5 @@ def login(): logging.error(f"Erro inesperado: {str(e)}") return jsonify({'msg': 'Erro inesperado durante a autenticação.'}), 500 - - - diff --git a/app/routes/integrator.py b/app/routes/integrator.py new file mode 100644 index 0000000..0c031c5 --- /dev/null +++ b/app/routes/integrator.py @@ -0,0 +1,19 @@ +from flask import Blueprint, jsonify, request +from .zammad import listar_tickets # Importa a função do zammad.py +from .auth import token_required # Importa o decorador de autenticação + +zammad = Blueprint('zammad',__name__) + +@zammad.route('/tickets', methods=['GET']) +@token_required +def tickets(data): + # O decorador token_required já valida o token e retorna os dados do payload + domain = data.get('domain') # Extraído do token + + if not domain: + return jsonify({"error": "Domínio não encontrado no token"}), 400 + + tickets, status_code = listar_tickets(domain) + return jsonify(tickets), status_code + + diff --git a/app/routes/zammad.py b/app/routes/zammad.py index b40b7b2..a9ac65a 100644 --- a/app/routes/zammad.py +++ b/app/routes/zammad.py @@ -1,41 +1,39 @@ -from flask import Blueprint, jsonify, request import requests -# Blueprint para rotas relacionadas ao Zammad -zammad = Blueprint('zammad', __name__) +base_url = "http://zammad.itguys.com.br/api/v1" +zammad_token = "kT0IXO8aVhPoTLcMRNL290rqd9jbRhhM0zf8MgBo3n00NLChToSU6rOGnMgWA0M2" -# Configurações da API do Zammad -base_url = "http://10.10.253.59/api/v1" # URL base da API Zammad -zammad_token = "kT0IXO8aVhPoTLcMRNL290rqd9jbRhhM0zf8MgBo3n00NLChToSU6rOGnMgWA0M2" # Token da API Zammad - -# Rota para listar tickets -@zammad.route('/tickets', methods=['GET']) -def listar_tickets(): +def listar_tickets(domain): try: - # Cabeçalho de autenticação para a API Zammad headers = { "Authorization": f"Token token={zammad_token}", "Content-Type": "application/json" } + url = f"{base_url}/tickets?domain={domain}" + response = requests.get(url, headers=headers, timeout=10) - # Faz a requisição para a API Zammad - url = f"{base_url}/tickets" - response = requests.get(url, headers=headers, timeout=10) # Timeout adicionado para evitar requisições travadas - - # Processa a resposta if response.status_code == 200: tickets = response.json() - return jsonify(tickets), 200 + tickets_filtrados = [ + { + "title": ticket.get("title"), + "type": ticket.get("type"), + "created_at": ticket.get("created_at"), + "close_at": ticket.get("close_at"), + "state_id": ticket.get("state_id"), + "pending_time": ticket.get("pending_time"), + "number": ticket.get("number"), + "organization_id": ticket.get("organization_id"), + "customer_id": ticket.get("customer_id"), + } + for ticket in tickets + ] + return tickets_filtrados, 200 else: - return jsonify({ - "error": f"Erro ao buscar tickets: {response.status_code}", - "details": response.text - }), response.status_code + return {"error": f"Erro ao buscar tickets: {response.status_code}", "details": response.text}, response.status_code except requests.exceptions.RequestException as e: - # Captura problemas de conexão ou requisição - return jsonify({"error": "Erro na requisição à API", "details": str(e)}), 500 + return {"error": "Erro na requisição à API", "details": str(e)}, 500 except Exception as e: - # Captura quaisquer outros erros inesperados - return jsonify({"error": "Erro interno ao processar a solicitação", "details": str(e)}), 500 + return {"error": "Erro interno ao processar a solicitação", "details": str(e)}, 500