diff --git a/instruct/handlers.py b/instruct/handlers.py index 67cdcf5..c6c5ce6 100644 --- a/instruct/handlers.py +++ b/instruct/handlers.py @@ -176,9 +176,35 @@ async def _send_sd_api_request(requester_email: str, subject: str, description: return None +async def _find_existing_trueconf_ticket(requester_email: str) -> str | None: + """ + Найти существующую открытую заявку с темой 'Запрос доступа к Trueconf' для пользователя. + """ + subject = "Запрос доступа к Trueconf" + try: + url = f"{SD_URL.rstrip('/')}/api/v3/requests?filter=status:Open&fields=id,subject,requester" + headers = {"TECHNICIAN_KEY": SD_TOKEN} + async with httpx.AsyncClient(verify=False) as client: + resp = await client.get(url, headers=headers, timeout=10.0) + if resp.status_code == 200: + data = resp.json() + requests_list = data.get("requests", []) + for req in requests_list: + requester = req.get("requester", {}) + req_email = requester.get("email", "") or requester.get("email_id", "") + if req_email == requester_email and subject in req.get("subject", ""): + ticket_id = req.get("id") + logger.info(f"Found existing Trueconf ticket #{ticket_id} for {requester_email}") + return str(ticket_id) + except Exception as e: + logger.warning(f"Failed to search existing tickets: {e}") + return None + + async def create_sd_ticket_for_trueconf(user_id: str, cn: str) -> str | None: """ Создать заявку в Service Desk для запроса доступа к Trueconf. + Если уже есть открытая заявка — возвращает её ID. """ subject = "Запрос доступа к Trueconf" @@ -187,6 +213,12 @@ async def create_sd_ticket_for_trueconf(user_id: str, cn: str) -> str | None: requester_email = ad_info.get("mail") or DEFAULT_REQUESTER city = ad_info.get("city", "Кемерово") if ad_info else "Кемерово" + # Сначала ищем существующую открытую заявку + existing_ticket = await _find_existing_trueconf_ticket(requester_email) + if existing_ticket: + logger.info(f"Returning existing ticket #{existing_ticket} for {cn}") + return existing_ticket + description = ( f"Пользователь {cn} ({user_id}) запросил инструкцию по Trueconf, " f"но не имеет группы 2FA. Требуется выдача доступа."