import mysql.connector import json from decimal import * from github import Github import datetime import os MYSQL = os.environ['MYSQL'] MYSQL_PASS = os.environ["PASSWORD"] MYSQL_USER = os.environ["USER"] MYSQL_DATABASE = os.environ["DATABASE"] GIT_TOKEN = os.environ["TOKEN"] cnx = mysql.connector.connect(user=MYSQL_USER, password=MYSQL_PASS, host=MYSQL, database=MYSQL_DATABASE) cursor = cnx.cursor() g = Github(GIT_TOKEN) class JSONEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, Decimal): return int(obj) if isinstance(obj, (datetime.date, datetime.datetime)): return obj.isoformat() return json.JSONEncoder.default(self, obj) def getRepository(url): if "https://api.github.com/repos" in url: url = url.replace("https://github.com") repo = url.split("github.com")[1].split("/") repository = repo[1] + "/" + repo[2] return repository def getTicketNumber(url): repo = url.split("github.com")[1].split("/") ticket_number = repo[4] try: return int(ticket_number) except: return 0 def getTicketLastComment(url): details = {} try: last_update = \ g.get_repo(getRepository(url)).get_issue(getTicketNumber(url)).get_comments().reversed[0].raw_data["updated_at"] return last_update except: return str(datetime.datetime.now().replace(microsecond=0).isoformat()) def getTicketDescription(url): ticket_details = {} raw_data = g.get_repo(getRepository(url)).get_issue(getTicketNumber(url)).raw_data ticket_details["id"] = getTicketNumber(url) ticket_details["desc"] = raw_data["title"] ticket_details["status"] = raw_data["state"] ticket_details["url"] = raw_data["html_url"] ticket_details["repo"] = getRepository(url) ticket_details["last_update"] = getTicketLastComment(url) return ticket_details def locate_url(zendesk_id, url): query = "SELECT count(*) from zendesk_issue_details i where zendesk_id = %s and issue_link = %s" cursor.execute(query, (int(zendesk_id),url)) for (total,) in cursor: if int(total) != 0: return True else: return False def insert_detail(ticket_id, url, organization_name, organization_id): if not locate_ticket(ticket_id): insert_header(ticket_id, organization_name, organization_id); if locate_url(ticket_id, url): return insert_stmt = ("insert into zendesk_issue_details " "(zendesk_id, issue_id, issue_repo, issue_last_update, issue_status, issue_description, issue_link) " " values " "(%(zendesk_id)s, %(issue_id)s, %(issue_repo)s, %(issue_last_update)s, %(issue_status)s, " "%(issue_description)s, %(issue_link)s)" ) details = getTicketDescription(url) zendesk_issue_details_json = { 'zendesk_id': int(ticket_id), 'issue_id': details["id"], 'issue_repo': details["repo"], 'issue_last_update': details["last_update"].replace("Z",""), 'issue_status': details["status"], 'issue_description': details["desc"], 'issue_link': details["url"] } cursor.execute(insert_stmt, zendesk_issue_details_json) cnx.commit() def remove_url(zendesk_id, ticket_id): insert_stmt = "delete from zendesk_issue_details where id = %s and zendesk_id = %s" cursor.execute(insert_stmt, (ticket_id, zendesk_id)) cnx.commit() def insert_header(ticket_id, organization_name, organization_id): insert_stmt = ("insert into zendesk_issue " "(zendesk_id, customer_id, customer_name) " " values " "(%s, %s, %s)" ) cursor.execute(insert_stmt, (int(ticket_id), int(organization_id), str(organization_name))) cnx.commit() def locate_ticket(zendesk_id): query = "SELECT count(*) from zendesk_issue i where zendesk_id = %s" cursor.execute(query, (int(zendesk_id),)) for (total,) in cursor: if int(total) != 0: return True else: return False def get_ticket_json(zendesk_id): query = ("SELECT i.zendesk_id, i.last_update, " "id.id, id.issue_id, id.issue_repo, id.issue_last_update, id.issue_status, id.issue_description," " id.issue_link from zendesk_issue i inner join zendesk_issue_details id on i.zendesk_id = id.zendesk_id" " where i.zendesk_id = %s") cursor.execute(query, (int(zendesk_id),)) json_ticket = {"zendesk_id": 0} for (zendesk_idH, last_updateH, id, issue_id, issue_repo, issue_last_update, issue_status, issue_description, issue_link) in cursor: if json_ticket["zendesk_id"] == 0: json_ticket["zendesk_id"] = int(zendesk_idH) json_ticket["last_update"] = last_updateH json_ticket["issues"] = [] json_ticket["issues"].append({"internal_id": int(id), "id": int(issue_id), "desc": issue_description, "status": issue_status, "url": issue_link, "repo": issue_repo, "last_update": issue_last_update}) if json_ticket["zendesk_id"] == 0: return {} else: return json_ticket def get_response(zendesk_id): responseObj = {} responseObj["statusCode"] = 200 responseObj["headers"] = { 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Origin': 'https://pingcap.zendesk.com', 'Access-Control-Allow-Methods': 'DELETE,POST,GET,OPTIONS' } responseObj["headers"]["Content-Type"] = "application/json" responseObj["body"] = json.dumps(get_ticket_json(int(zendesk_id)), cls=JSONEncoder) return responseObj def lambda_handler(event, context): print(event) if event["httpMethod"] == "GET": zendesk_id = event["headers"]["zendesk-id"] responseObj = get_response(zendesk_id) if event["httpMethod"] == "DELETE": zendesk_id = event["headers"]["zendesk-id"] internal_id = event["headers"]["internal-id"] remove_url(zendesk_id, internal_id) responseObj = get_response(zendesk_id) if event["httpMethod"] == "POST": url = event["headers"]["url"] ticket_id = event["headers"]["ticket-id"] organization_id = event["headers"]["organization-id"] organization_name = event["headers"]["organization-name"] insert_detail(ticket_id, url, organization_name, organization_id) responseObj = get_response(ticket_id) print(responseObj) return responseObj