From 7010448c34059116a5121ca4964d7bfebb773a08 Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Wed, 20 Dec 2023 20:33:51 +0530 Subject: [PATCH] dev: github importer (#3205) * dev: initiate github import * dev: github importer all issues import * dev: github comments and links for the imported issues * dev: update controller to use logger and spread the resultData in getAllEntities * dev: removed console log * dev: update code structure and sync functions * dev: updated retry logic when exception * dev: add imported data as well * dev: update logger and repo fetch * dev: update jira integration to new structure * dev: update migrations * dev: update the reason field --- apiserver/plane/app/views/importer.py | 247 ++- apiserver/plane/app/views/integration/base.py | 36 +- .../plane/app/views/integration/github.py | 38 +- apiserver/plane/bgtasks/importer_task.py | 585 ++++-- ...ernal_id_cycle_external_source_and_more.py | 78 + apiserver/plane/db/models/base.py | 2 - apiserver/plane/db/models/importer.py | 1 + segway/.env.example | 4 +- segway/combined.log | 1776 +++++++++++++++++ segway/package.json | 9 + segway/src/controller/github.controller.ts | 439 +++- segway/src/controller/jira.controller.ts | 408 +++- segway/src/utils/github.authentication.ts | 25 + segway/src/utils/paginator.ts | 73 + segway/yarn.lock | 624 +++++- 15 files changed, 3993 insertions(+), 352 deletions(-) create mode 100644 apiserver/plane/db/migrations/0051_cycle_external_id_cycle_external_source_and_more.py create mode 100644 segway/combined.log create mode 100644 segway/src/utils/github.authentication.ts create mode 100644 segway/src/utils/paginator.ts diff --git a/apiserver/plane/app/views/importer.py b/apiserver/plane/app/views/importer.py index 486a435e6b..dd8dd9b308 100644 --- a/apiserver/plane/app/views/importer.py +++ b/apiserver/plane/app/views/importer.py @@ -1,5 +1,7 @@ # Python imports import uuid +import json +import requests # Third party imports from rest_framework import status @@ -7,7 +9,7 @@ from rest_framework.response import Response # Django imports from django.db.models import Max, Q - +from django.conf import settings # Module imports from plane.app.views import BaseAPIView from plane.db.models import ( @@ -34,19 +36,15 @@ from plane.app.serializers import ( IssueFlatSerializer, ModuleSerializer, ) -from plane.utils.integrations.github import get_github_repo_details -from plane.utils.importers.jira import jira_project_issue_summary -from plane.bgtasks.importer_task import service_importer from plane.utils.html_processor import strip_tags from plane.app.permissions import WorkSpaceAdminPermission - +from plane.bgtasks.importer_task import service_importer class ServiceIssueImportSummaryEndpoint(BaseAPIView): def get(self, request, slug, service): if service == "github": owner = request.GET.get("owner", False) repo = request.GET.get("repo", False) - if not owner or not repo: return Response( {"error": "Owner and repo are required"}, @@ -57,11 +55,10 @@ class ServiceIssueImportSummaryEndpoint(BaseAPIView): integration__provider="github", workspace__slug=slug ) - access_tokens_url = workspace_integration.metadata.get( - "access_tokens_url", False - ) + installtion_id = workspace_integration.config.get("installation_id", False) - if not access_tokens_url: + # Check for the installation id + if not installtion_id: return Response( { "error": "There was an error during the installation of the GitHub app. To resolve this issue, we recommend reinstalling the GitHub app." @@ -69,18 +66,33 @@ class ServiceIssueImportSummaryEndpoint(BaseAPIView): status=status.HTTP_400_BAD_REQUEST, ) - issue_count, labels, collaborators = get_github_repo_details( - access_tokens_url, owner, repo - ) + # Request segway for the required information + if settings.SEGWAY_BASE_URL: + headers = { + "Content-Type": "application/json", + "x-api-key": settings.SEGWAY_KEY, + } + data = { + "owner": owner, + "repo": repo, + "installationId": installtion_id, + } + res = requests.post( + f"{settings.SEGWAY_BASE_URL}/api/github", + data=json.dumps(data), + headers=headers, + ) + if "error" in res.json(): + return Response(res.json(), status=status.HTTP_400_BAD_REQUEST) + else: + return Response( + res.json(), + status=status.HTTP_200_OK, + ) return Response( - { - "issue_count": issue_count, - "labels": labels, - "collaborators": collaborators, - }, - status=status.HTTP_200_OK, + {"error": "Inetgration service is not available please try later"}, + status=status.HTTP_400_BAD_REQUEST, ) - if service == "jira": # Check for all the keys params = { @@ -101,16 +113,35 @@ class ServiceIssueImportSummaryEndpoint(BaseAPIView): email = request.GET.get("email", "") cloud_hostname = request.GET.get("cloud_hostname", "") - response = jira_project_issue_summary( - email, api_token, project_key, cloud_hostname - ) - if "error" in response: - return Response(response, status=status.HTTP_400_BAD_REQUEST) - else: - return Response( - response, - status=status.HTTP_200_OK, + if settings.SEGWAY_BASE_URL: + headers = { + "Content-Type": "application/json", + "x-api-key": settings.SEGWAY_KEY, + } + data = { + "project_key": project_key, + "api_token": api_token, + "email": email, + "cloud_hostname": cloud_hostname, + } + res = requests.post( + f"{settings.SEGWAY_BASE_URL}/api/jira", + data=json.dumps(data), + headers=headers, ) + + if "error" in res.json(): + return Response(res.json(), status=status.HTTP_400_BAD_REQUEST) + else: + return Response( + res.json(), + status=status.HTTP_200_OK, + ) + + return Response( + {"error": "Inetgration service is not available please try later"}, + status=status.HTTP_400_BAD_REQUEST, + ) return Response( {"error": "Service not supported yet"}, status=status.HTTP_400_BAD_REQUEST, @@ -123,6 +154,19 @@ class ImportServiceEndpoint(BaseAPIView): ] def post(self, request, slug, service): + if service not in ["github", "jira"]: + return Response( + {"error": "Servivce not supported yet"}, + status=status.HTTP_400_BAD_REQUEST, + ) + + if service == "github": + workspace_integration = WorkspaceIntegration.objects.get( + integration__provider="github", workspace__slug=slug + ) + + installation_id = workspace_integration.config.get("installation_id", False) + project_id = request.data.get("project_id", False) if not project_id: @@ -130,91 +174,84 @@ class ImportServiceEndpoint(BaseAPIView): {"error": "Project ID is required"}, status=status.HTTP_400_BAD_REQUEST, ) - workspace = Workspace.objects.get(slug=slug) - if service == "github": - data = request.data.get("data", False) - metadata = request.data.get("metadata", False) - config = request.data.get("config", False) - if not data or not metadata or not config: - return Response( - {"error": "Data, config and metadata are required"}, - status=status.HTTP_400_BAD_REQUEST, - ) - - api_token = APIToken.objects.filter( - user=request.user, workspace=workspace - ).first() - if api_token is None: - api_token = APIToken.objects.create( - user=request.user, - label="Importer", - workspace=workspace, - ) - - importer = Importer.objects.create( - service=service, - project_id=project_id, - status="queued", - initiated_by=request.user, - data=data, - metadata=metadata, - token=api_token, - config=config, - created_by=request.user, - updated_by=request.user, + # Validate the data + data = request.data.get("data", False) + metadata = request.data.get("metadata", False) + config = request.data.get("config", False) + if not data or not metadata or not config: + return Response( + {"error": "Data, config and metadata are required"}, + status=status.HTTP_400_BAD_REQUEST, ) - service_importer.delay(service, importer.id) - serializer = ImporterSerializer(importer) - return Response(serializer.data, status=status.HTTP_201_CREATED) + # Update config + if config and service == "github": + config.update({"installation_id": installation_id}) - if service == "jira": - data = request.data.get("data", False) - metadata = request.data.get("metadata", False) - config = request.data.get("config", False) - if not data or not metadata: - return Response( - {"error": "Data, config and metadata are required"}, - status=status.HTTP_400_BAD_REQUEST, - ) - api_token = APIToken.objects.filter( - user=request.user, workspace=workspace - ).first() - if api_token is None: - api_token = APIToken.objects.create( - user=request.user, - label="Importer", - workspace=workspace, - ) - - importer = Importer.objects.create( - service=service, - project_id=project_id, - status="queued", - initiated_by=request.user, - data=data, - metadata=metadata, - token=api_token, - config=config, - created_by=request.user, - updated_by=request.user, + # Get the api token -- # derecated + api_token = APIToken.objects.filter( + user=request.user, workspace=workspace + ).first() + if api_token is None: + api_token = APIToken.objects.create( + user=request.user, + label="Importer", + workspace=workspace, ) - service_importer.apply_async( - args=[], - kwargs={"service": service, "importer_id": importer.id}, - routing_key="internal", - ) - serializer = ImporterSerializer(importer) - return Response(serializer.data, status=status.HTTP_201_CREATED) - - return Response( - {"error": "Servivce not supported yet"}, - status=status.HTTP_400_BAD_REQUEST, + # Create an import + importer = Importer.objects.create( + service=service, + project_id=project_id, + status="queued", + initiated_by=request.user, + data=data, + metadata=metadata, + token=api_token, + config=config, + created_by=request.user, + updated_by=request.user, ) + # Push it to segway + if settings.SEGWAY_BASE_URL: + headers = { + "Content-Type": "application/json", + "x-api-key": settings.SEGWAY_KEY, + } + data = { + "metadata": metadata, + "data": data, + "config": config, + "workspace_id": str(workspace.id), + "project_id": str(project_id), + "created_by": str(request.user.id), + "importer_id": str(importer.id), + } + res = requests.post( + f"{settings.SEGWAY_BASE_URL}/api/github/import", + data=json.dumps(data), + headers=headers, + ) + + if "error" in res.json(): + importer.status = "failed" + importer.reason = str(res.json()) + importer.save() + else: + importer.status = "processing" + importer.save(update_fields=["status"]) + else: + importer.status = "failed" + importer.reason = "Segway base url is not present" + importer.save(update_fields=["status", "reason"]) + + # return the response + serializer = ImporterSerializer(importer) + return Response(serializer.data, status=status.HTTP_201_CREATED) + def get(self, request, slug): imports = ( Importer.objects.filter(workspace__slug=slug) diff --git a/apiserver/plane/app/views/integration/base.py b/apiserver/plane/app/views/integration/base.py index b82957dfb8..c2b30f50a6 100644 --- a/apiserver/plane/app/views/integration/base.py +++ b/apiserver/plane/app/views/integration/base.py @@ -1,8 +1,11 @@ # Python improts import uuid import requests +import json + # Django imports from django.contrib.auth.hashers import make_password +from django.conf import settings # Third party imports from rest_framework.response import Response @@ -27,6 +30,7 @@ from plane.utils.integrations.github import ( from plane.app.permissions import WorkSpaceAdminPermission from plane.utils.integrations.slack import slack_oauth + class IntegrationViewSet(BaseViewSet): serializer_class = IntegrationSerializer model = Integration @@ -46,9 +50,7 @@ class IntegrationViewSet(BaseViewSet): status=status.HTTP_400_BAD_REQUEST, ) - serializer = IntegrationSerializer( - integration, data=request.data, partial=True - ) + serializer = IntegrationSerializer(integration, data=request.data, partial=True) if serializer.is_valid(): serializer.save() @@ -94,14 +96,30 @@ class WorkspaceIntegrationViewSet(BaseViewSet): {"error": "Installation ID is required"}, status=status.HTTP_400_BAD_REQUEST, ) - metadata = get_github_metadata(installation_id) + # Push it to segway + if settings.SEGWAY_BASE_URL: + headers = { + "Content-Type": "application/json", + "x-api-key": settings.SEGWAY_KEY, + } + data = {"installationId": installation_id} + res = requests.post( + f"{settings.SEGWAY_BASE_URL}/api/github/metadata", + data=json.dumps(data), + headers=headers, + ) + if "error" in res.json(): + return Response(res.json(), status=status.HTTP_400_BAD_REQUEST) + metadata = res.json() config = {"installation_id": installation_id} if provider == "slack": code = request.data.get("code", False) if not code: - return Response({"error": "Code is required"}, status=status.HTTP_400_BAD_REQUEST) + return Response( + {"error": "Code is required"}, status=status.HTTP_400_BAD_REQUEST + ) slack_response = slack_oauth(code=code) @@ -123,9 +141,7 @@ class WorkspaceIntegrationViewSet(BaseViewSet): is_password_autoset=True, is_bot=True, first_name=integration.title, - avatar=integration.avatar_url - if integration.avatar_url is not None - else "", + avatar=integration.avatar_url if integration.avatar_url is not None else "", ) # Create an API Token for the bot user @@ -161,9 +177,7 @@ class WorkspaceIntegrationViewSet(BaseViewSet): ) if workspace_integration.integration.provider == "github": - installation_id = workspace_integration.config.get( - "installation_id", False - ) + installation_id = workspace_integration.config.get("installation_id", False) if installation_id: delete_github_installation(installation_id=installation_id) diff --git a/apiserver/plane/app/views/integration/github.py b/apiserver/plane/app/views/integration/github.py index 29b7a9b2f9..82d7697c37 100644 --- a/apiserver/plane/app/views/integration/github.py +++ b/apiserver/plane/app/views/integration/github.py @@ -1,8 +1,15 @@ +# Python imports +import json +import requests + # Third party imports from rest_framework import status from rest_framework.response import Response from sentry_sdk import capture_exception +# Django imports +from django.conf import settings + # Module imports from plane.app.views import BaseViewSet, BaseAPIView from plane.db.models import ( @@ -35,19 +42,32 @@ class GithubRepositoriesEndpoint(BaseAPIView): workspace__slug=slug, pk=workspace_integration_id ) - if workspace_integration.integration.provider != "github": + installation_id = workspace_integration.config.get("installation_id") + + if not installation_id: return Response( {"error": "Not a github integration"}, status=status.HTTP_400_BAD_REQUEST, ) - - access_tokens_url = workspace_integration.metadata["access_tokens_url"] - repositories_url = ( - workspace_integration.metadata["repositories_url"] - + f"?per_page=100&page={page}" - ) - repositories = get_github_repos(access_tokens_url, repositories_url) - return Response(repositories, status=status.HTTP_200_OK) + # Push it to segway + if settings.SEGWAY_BASE_URL: + headers = { + "Content-Type": "application/json", + "x-api-key": settings.SEGWAY_KEY, + } + data = { + "installationId": installation_id, + "page": page, + } + res = requests.post( + f"{settings.SEGWAY_BASE_URL}/api/github/repos", + data=json.dumps(data), + headers=headers, + ) + if "error" in res.json(): + return Response(res.json(), status=status.HTTP_400_BAD_REQUEST) + else: + return Response(res.json(), status=status.HTTP_200_OK) class GithubRepositorySyncViewSet(BaseViewSet): diff --git a/apiserver/plane/bgtasks/importer_task.py b/apiserver/plane/bgtasks/importer_task.py index e0e5dc9214..69b152e297 100644 --- a/apiserver/plane/bgtasks/importer_task.py +++ b/apiserver/plane/bgtasks/importer_task.py @@ -1,204 +1,467 @@ # Python imports -import json -import requests import uuid # Django imports -from django.conf import settings -from django.core.serializers.json import DjangoJSONEncoder +from django.db.models import Q, Max from django.contrib.auth.hashers import make_password # Third Party imports from celery import shared_task -from sentry_sdk import capture_exception +from celery.exceptions import MaxRetriesExceededError # Module imports -from plane.app.serializers import ImporterSerializer from plane.db.models import ( Importer, WorkspaceMember, - GithubRepositorySync, - GithubRepository, ProjectMember, - WorkspaceIntegration, Label, User, IssueProperty, + IssueAssignee, + IssueLabel, + IssueSequence, + IssueActivity, + IssueComment, + IssueLink, + ModuleIssue, + State, + Module, + Issue, + Cycle, ) from plane.bgtasks.user_welcome_task import send_welcome_slack @shared_task(queue="internal_tasks") def service_importer(service, importer_id): + pass + + +## Utility functions +def get_label_id(name, data): try: - importer = Importer.objects.get(pk=importer_id) - importer.status = "processing" - importer.save() + existing_label = ( + Label.objects.filter( + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + name__iexact=name, + ) + .values("id") + .first() + ) + return existing_label + except Label.DoesNotExist: + return None - users = importer.data.get("users", []) - # Check if we need to import users as well - if len(users): - # For all invited users create the users - new_users = User.objects.bulk_create( - [ - User( - email=user.get("email").strip().lower(), - username=uuid.uuid4().hex, - password=make_password(uuid.uuid4().hex), - is_password_autoset=True, - ) - for user in users - if user.get("import", False) == "invite" - ], - batch_size=10, - ignore_conflicts=True, +def get_state_id(name, data): + try: + existing_state = ( + State.objects.filter( + name__iexact=name, + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ) + .values("id") + .first() + ) + return existing_state + except State.DoesNotExist: + return None + + +def get_user_id(name): + try: + existing_user = User.objects.filter(email=name).values("id").first() + return existing_user + except User.DoesNotExist: + return None + + +def update_imported_items(importer_id, entity, entity_id): + importer = Importer.objects.get(pk=importer_id) + if importer.imported_data: + importer.imported_data.setdefault(str(entity), []).append(str(entity_id)) + else: + importer.imported_data = { + str(entity): [str(entity_id)] + } + importer.save() + + +## Sync functions +def members_sync(data): + try: + user = User.objects.get(email=data.get("email")) + _ = WorkspaceMember.objects.get_or_create( + member_id=user.id, workspace_id=data.get("workspace_id") + ) + _ = ProjectMember.objects.get_or_create( + member_id=user.id, + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ) + _ = IssueProperty.objects.get_or_create( + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + user_id=user.id, + created_by_id=data.get("created_by"), + ) + + except User.DoesNotExist: + # For all invited users create the users + new_user = User.objects.create( + email=data.get("email").strip().lower(), + username=uuid.uuid4().hex, + password=make_password(uuid.uuid4().hex), + is_password_autoset=True, + ) + + service = data.get("external_source") + + WorkspaceMember.objects.create( + member_id=new_user.id, + workspace_id=data.get("workspace_id"), + created_by_id=data.get("created_by"), + ) + + ProjectMember.objects.create( + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + member_id=new_user.id, + created_by_id=data.get("created_by"), + ) + + IssueProperty.objects.create( + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + user_id=new_user.id, + created_by_id=data.get("created_by"), + ) + if data.get("source", False) == "slack": + send_welcome_slack.delay( + str(new_user.id), + True, + f"{new_user.email} was imported to Plane from {service}", ) - _ = [ - send_welcome_slack.delay( - str(user.id), - True, - f"{user.email} was imported to Plane from {service}", - ) - for user in new_users - ] - workspace_users = User.objects.filter( - email__in=[ - user.get("email").strip().lower() - for user in users - if user.get("import", False) == "invite" - or user.get("import", False) == "map" - ] +def label_sync(data): + existing_label = Label.objects.filter( + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + name__iexact=data.get("name"), + external_id=data.get("external_id", None), + external_source=data.get("external_source"), + ) + + if not existing_label.exists() and data.get("name"): + label = Label.objects.create( + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + name=data.get("name"), + color=data.get("color"), + created_by_id=data.get("created_by"), + external_id=data.get("external_id", None), + external_source=data.get("external_source"), + ) + update_imported_items(data.get("importer_id"), "labels", label.id) + + +def state_sync(data): + try: + state = State.objects.get( + external_id=data.get("external_id"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ) + + except State.DoesNotExist: + existing_states = State.objects.filter( + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + group=data.get("state_group"), + name__iexact=data.get("state_name"), + ) + + if existing_states.exists(): + existing_state = existing_states.first() + existing_state.external_id = data.get("external_id") + existing_state.external_source = data.get("external_source") + existing_state.save() + else: + state = State.objects.create( + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + name=data.get("state_name"), + group=data.get("state_group"), + created_by_id=data.get("created_by"), + external_id=data.get("external_id"), + external_source=data.get("external_source"), ) + update_imported_items(data.get("importer_id"), "states", state.id) - # Check if any of the users are already member of workspace - _ = WorkspaceMember.objects.filter( - member__in=[user for user in workspace_users], - workspace_id=importer.workspace_id, - ).update(is_active=True) - # Add new users to Workspace and project automatically - WorkspaceMember.objects.bulk_create( - [ - WorkspaceMember( - member=user, - workspace_id=importer.workspace_id, - created_by=importer.created_by, - ) - for user in workspace_users - ], - batch_size=100, - ignore_conflicts=True, - ) +def issue_sync(data): + try: + issue = Issue.objects.get( + external_id=data.get("external_id"), + external_source=data.get("external_source"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ) + except Issue.DoesNotExist: + # Get the default state + default_state = State.objects.filter( + ~Q(name="Triage"), project_id=data.get("project_id"), default=True + ).first() - ProjectMember.objects.bulk_create( - [ - ProjectMember( - project_id=importer.project_id, - workspace_id=importer.workspace_id, - member=user, - created_by=importer.created_by, - ) - for user in workspace_users - ], - batch_size=100, - ignore_conflicts=True, - ) - - IssueProperty.objects.bulk_create( - [ - IssueProperty( - project_id=importer.project_id, - workspace_id=importer.workspace_id, - user=user, - created_by=importer.created_by, - ) - for user in workspace_users - ], - batch_size=100, - ignore_conflicts=True, - ) - - # Check if sync config is on for github importers - if service == "github" and importer.config.get("sync", False): - name = importer.metadata.get("name", False) - url = importer.metadata.get("url", False) - config = importer.metadata.get("config", {}) - owner = importer.metadata.get("owner", False) - repository_id = importer.metadata.get("repository_id", False) - - workspace_integration = WorkspaceIntegration.objects.get( - workspace_id=importer.workspace_id, integration__provider="github" - ) - - # Delete the old repository object - GithubRepositorySync.objects.filter(project_id=importer.project_id).delete() - GithubRepository.objects.filter(project_id=importer.project_id).delete() - - # Create a Label for github - label = Label.objects.filter( - name="GitHub", project_id=importer.project_id + # if there is no default state assign any random state + if default_state is None: + default_state = State.objects.filter( + ~Q(name="Triage"), project_id=data.get("project_id") ).first() - if label is None: - label = Label.objects.create( - name="GitHub", - project_id=importer.project_id, - description="Label to sync Plane issues with GitHub issues", - color="#003773", - ) - # Create repository - repo = GithubRepository.objects.create( - name=name, - url=url, - config=config, - repository_id=repository_id, - owner=owner, - project_id=importer.project_id, - ) + # Get the maximum sequence_id + last_id = IssueSequence.objects.filter( + project_id=data.get("project_id") + ).aggregate(largest=Max("sequence"))["largest"] - # Create repo sync - _ = GithubRepositorySync.objects.create( - repository=repo, - workspace_integration=workspace_integration, - actor=workspace_integration.actor, - credentials=importer.data.get("credentials", {}), - project_id=importer.project_id, - label=label, - ) + last_id = 1 if last_id is None else last_id + 1 - # Add bot as a member in the project - _ = ProjectMember.objects.get_or_create( - member=workspace_integration.actor, - role=20, - project_id=importer.project_id, - ) + # Get the maximum sort order + largest_sort_order = Issue.objects.filter( + project_id=data.get("project_id"), state=default_state + ).aggregate(largest=Max("sort_order"))["largest"] - import_data = ImporterSerializer(importer).data + largest_sort_order = ( + 65535 if largest_sort_order is None else largest_sort_order + 10000 + ) + parent_id = None + if data.get("parent_id", False): + parent_id = Issue.objects.filter( + external_id=data.get("parent_id"), + external_source=data.get("external_source"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ).values("id") - import_data_json = json.dumps(import_data, cls=DjangoJSONEncoder) + # Issues + issue = Issue.objects.create( + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + state_id=get_state_id(data.get("state"), data).get("id") + if get_state_id(data.get("state"), data) + else default_state.id, + name=data.get("name", "Issue Created through Importer")[:255], + description_html=data.get("description_html", "

"), + sequence_id=last_id, + sort_order=largest_sort_order, + start_date=data.get("start_date", None), + target_date=data.get("target_date", None), + priority=data.get("priority", "none"), + created_by_id=data.get("created_by_id"), + external_id=data.get("external_id"), + external_source=data.get("external_source"), + parent_id=parent_id, + ) - if settings.SEGWAY_BASE_URL: - headers = { - "Content-Type": "application/json", - "x-api-key": settings.SEGWAY_KEY, - } - res = requests.post( - f"{settings.SEGWAY_BASE_URL}/api/jira", - data=import_data_json, - headers=headers, - ) - print(res.json()) + # Sequences + _ = IssueSequence.objects.create( + issue=issue, + sequence=issue.sequence_id, + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ) + + # Attach Links + _ = IssueLink.objects.create( + issue=issue, + url=data.get("link", {}).get("url", "https://github.com"), + title=data.get("link", {}).get("title", "Original Issue"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + created_by_id=data.get("created_by_id"), + ) + + # Track the issue activities + _ = IssueActivity.objects.create( + issue=issue, + actor_id=data.get("created_by_id"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + comment=f"imported the issue from {data.get('external_source')}", + verb="created", + created_by_id=data.get("created_by_id"), + ) + + update_imported_items(data.get("importer_id"), "issues", issue.id) + + +def issue_label_sync(data): + issue = Issue.objects.get( + external_source=data.get("external_issue_source"), + external_id=data.get("external_issue_id"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ) + if get_label_id(data.get("name"), data): + IssueLabel.objects.create( + issue=issue, + label_id=get_label_id(data.get("name"), data).get("id"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + created_by_id=data.get("created_by_id"), + ) + + +def issue_assignee_sync(data): + issue = Issue.objects.get( + external_source=data.get("external_issue_source"), + external_id=data.get("external_issue_id"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ) + user = User.objects.filter(email=data.get("email")).values("id") + + IssueAssignee.objects.create( + issue=issue, + assignee_id=user, + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + created_by_id=data.get("created_by_id"), + ) + + +def issue_comment_sync(data): + # Create Comments + issue = Issue.objects.get( + external_source=data.get("external_issue_source"), + external_id=data.get("external_issue_id"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ) + IssueComment.objects.create( + issue=issue, + comment_html=data.get("comment_html", "

"), + actor_id=data.get("created_by_id"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + created_by_id=get_user_id(data.get("created_by_id")).get("id") + if get_user_id(data.get("created_by_id")) + else data.get("created_by_id"), + external_id=data.get("external_id"), + external_source=data.get("external_source"), + ) + + +def cycles_sync(data): + try: + _ = Cycle.objects.get( + external_id=data.get("external_id"), + external_source=data.get("external_source"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ) + except Cycle.DoesNotExist: + cycle = Cycle.objects.create( + name=data.get("name"), + description_html=data.get("description_html", "

"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + created_by_id=data.get("created_by"), + external_id=data.get("external_id"), + external_source=data.get("external_source"), + ) + update_imported_items(data.get("importer_id"), "cycles", cycle.id) + + +def module_sync(data): + try: + _ = Module.objects.get( + external_id=data.get("external_id"), + external_source=data.get("external_source"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ) + except Module.DoesNotExist: + module = Module.objects.create( + name=data.get("name"), + description_html=data.get("description_html", "

"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + created_by_id=data.get("created_by"), + external_id=data.get("external_id"), + external_source=data.get("external_source"), + ) + update_imported_items(data.get("importer_id"), "modules", module.id) + + +def modules_issue_sync(data): + module = Module.objects.get( + external_id=data.get("module_id"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + external_source=data.get("external_source"), + ) + issue = Issue.objects.get( + external_id=data.get("issue_id"), + external_source=data.get("external_source"), + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + ) + + _ = ModuleIssue.objects.create( + module=module, + issue=issue, + project_id=data.get("project_id"), + workspace_id=data.get("workspace_id"), + created_by_id=data.get("created_by"), + ) + + +def import_sync(data): + importer = Importer.objects.get(pk=data.get("importer_id")) + importer.status = data.get("status") + importer.save(update_fields=["status"]) + + +@shared_task(bind=True, queue="segway_task", max_retries=5) +def import_task(self, data): + type = data.get("type") + + if type is None: + return + + TYPE_MAPPER = { + "member.sync": members_sync, + "label.sync": label_sync, + "state.sync": state_sync, + "issue.sync": issue_sync, + "issue.label.sync": issue_label_sync, + "issue.assignee.sync": issue_assignee_sync, + "issue.comment.sync": issue_comment_sync, + "cycle.sync": cycles_sync, + "module.sync": module_sync, + "module.issue.sync": modules_issue_sync, + "import.sync": import_sync, + } + try: + func = TYPE_MAPPER.get(type) + if func is None: + return + # Call the function + func(data) return except Exception as e: - print(e) - importer = Importer.objects.get(pk=importer_id) - importer.status = "failed" - importer.save() - # Print logs if in DEBUG mode - if settings.DEBUG: - print(e) - capture_exception(e) + try: + # Retry with exponential backoff + self.retry(exc=e, countdown=50, backoff=2) + except MaxRetriesExceededError: + # For max retries reached items fail the import + importer = Importer.objects.get(pk=data.get("importer_id")) + importer.status = "failed" + importer.reason = e + importer.save() + return diff --git a/apiserver/plane/db/migrations/0051_cycle_external_id_cycle_external_source_and_more.py b/apiserver/plane/db/migrations/0051_cycle_external_id_cycle_external_source_and_more.py new file mode 100644 index 0000000000..e51ca12306 --- /dev/null +++ b/apiserver/plane/db/migrations/0051_cycle_external_id_cycle_external_source_and_more.py @@ -0,0 +1,78 @@ +# Generated by Django 4.2.7 on 2023-12-20 14:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0050_user_use_case_alter_workspace_organization_size'), + ] + + operations = [ + migrations.AddField( + model_name='cycle', + name='external_id', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name='cycle', + name='external_source', + field=models.CharField(blank=True, null=True), + ), + migrations.AddField( + model_name='importer', + name='reason', + field=models.TextField(blank=True), + ), + migrations.AddField( + model_name='issue', + name='external_id', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name='issue', + name='external_source', + field=models.CharField(blank=True, null=True), + ), + migrations.AddField( + model_name='issuecomment', + name='external_id', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name='issuecomment', + name='external_source', + field=models.CharField(blank=True, null=True), + ), + migrations.AddField( + model_name='label', + name='external_id', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name='label', + name='external_source', + field=models.CharField(blank=True, null=True), + ), + migrations.AddField( + model_name='module', + name='external_id', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name='module', + name='external_source', + field=models.CharField(blank=True, null=True), + ), + migrations.AddField( + model_name='state', + name='external_id', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name='state', + name='external_source', + field=models.CharField(blank=True, null=True), + ), + ] diff --git a/apiserver/plane/db/models/base.py b/apiserver/plane/db/models/base.py index d0531e881d..a2939dd036 100644 --- a/apiserver/plane/db/models/base.py +++ b/apiserver/plane/db/models/base.py @@ -22,8 +22,6 @@ class BaseModel(AuditModel): user = get_current_user() if user is None or user.is_anonymous: - self.created_by = None - self.updated_by = None super(BaseModel, self).save(*args, **kwargs) else: # Check if the model is being created or updated diff --git a/apiserver/plane/db/models/importer.py b/apiserver/plane/db/models/importer.py index a2d1d3166a..e093601fce 100644 --- a/apiserver/plane/db/models/importer.py +++ b/apiserver/plane/db/models/importer.py @@ -34,6 +34,7 @@ class Importer(ProjectBaseModel): "db.APIToken", on_delete=models.CASCADE, related_name="importer" ) imported_data = models.JSONField(null=True) + reason = models.TextField(blank=True) class Meta: verbose_name = "Importer" diff --git a/segway/.env.example b/segway/.env.example index 786364159d..4cd57e9b3a 100644 --- a/segway/.env.example +++ b/segway/.env.example @@ -2,4 +2,6 @@ APP_ENV=local SERVER_PORT=9000 DATABASE_URL="" RABBITMQ_URL="" -SENTRY_DSN="" \ No newline at end of file +SENTRY_DSN="" +GITHUB_APP_ID="" +GITHUB_APP_PRIVATE_KEY="" diff --git a/segway/combined.log b/segway/combined.log new file mode 100644 index 0000000000..d273822a57 --- /dev/null +++ b/segway/combined.log @@ -0,0 +1,1776 @@ +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github"} +{"level":"error","message":"Invalid API key"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/metadata"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/metadata"} +{"level":"info","message":"POST: /api/github/metadata"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/jira"} +{"level":"info","message":"POST: /api/jira"} +{"level":"info","message":"POST: /api/jira"} +{"level":"info","message":"POST: /api/jira"} +{"level":"info","message":"POST: /api/jira"} +{"level":"info","message":"POST: /api/jira"} +{"level":"info","message":"POST: /api/jira"} +{"level":"info","message":"POST: /api/jira"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"error","name":"HttpError","request":{"headers":{"accept":"application/vnd.github.v3+json","authorization":"bearer [REDACTED]","user-agent":"octokit.js/3.1.2 octokit-core.js/5.0.2 Node.js/18.19.0 (darwin; arm64)"},"method":"POST","request":{"retryCount":1},"url":"https://api.github.com/app/installations/39986595/access_tokens"},"response":{"data":{"documentation_url":"https://docs.github.com/rest/reference/apps#create-an-installation-access-token-for-an-app","message":"Not Found"},"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-encoding":"gzip","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Wed, 20 Dec 2023 08:23:11 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"GitHub.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","transfer-encoding":"chunked","vary":"Accept-Encoding, Accept, X-Requested-With","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"EE04:3104BC:7C6136:8AADA4:6582A46E","x-xss-protection":"0"},"status":404,"url":"https://api.github.com/app/installations/39986595/access_tokens"},"status":404} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"error","name":"HttpError","request":{"headers":{"accept":"application/vnd.github.v3+json","authorization":"bearer [REDACTED]","user-agent":"octokit.js/3.1.2 octokit-core.js/5.0.2 Node.js/18.19.0 (darwin; arm64)"},"method":"POST","request":{"retryCount":1},"url":"https://api.github.com/app/installations/39986595/access_tokens"},"response":{"data":{"documentation_url":"https://docs.github.com/rest/reference/apps#create-an-installation-access-token-for-an-app","message":"Not Found"},"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-encoding":"gzip","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Wed, 20 Dec 2023 08:23:43 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"GitHub.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","transfer-encoding":"chunked","vary":"Accept-Encoding, Accept, X-Requested-With","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"EE8D:30110B:7EA4B0:8CF1B6:6582A48F","x-xss-protection":"0"},"status":404,"url":"https://api.github.com/app/installations/39986595/access_tokens"},"status":404} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/metadata"} +{"level":"info","message":"POST: /api/github/metadata"} +{"level":"info","message":"POST: /api/github/metadata"} +{"level":"info","message":"POST: /api/github/metadata"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github"} +{"level":"info","message":"POST: /api/github/import"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"error"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"code":"ERR_REQUIRE_ESM","level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"code":"ERR_REQUIRE_ESM","level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"code":"ERR_REQUIRE_ESM","level":"error"} +{"level":"info","message":"POST: /api/github/repos"} +{"code":"ERR_REQUIRE_ESM","level":"error"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"🛢️ Connected to Database"} +{"level":"info","message":"🚀 Api server started on port: 9000"} +{"level":"info","message":"✅ Rabbit MQ Connection is ready"} +{"level":"info","message":"🛸 Created RabbitMQ Channel successfully"} +{"level":"info","message":"POST: /api/github/repos"} diff --git a/segway/package.json b/segway/package.json index 527403a389..726701a3b8 100644 --- a/segway/package.json +++ b/segway/package.json @@ -11,15 +11,21 @@ "dev": "concurrently \"npx tsc --watch\" \"nodemon -q dist/start.js\"" }, "dependencies": { + "@octokit/rest": "^20.0.2", "@overnightjs/core": "^1.7.6", "@sentry/node": "^7.73.0", "@sentry/tracing": "^7.73.0", "amqplib": "^0.10.3", + "axios": "^1.6.2", "cors": "^2.8.5", "dotenv": "^16.3.1", "drizzle-orm": "^0.29.1", "express": "^4.18.2", + "jsonwebtoken": "^9.0.2", + "node-fetch": "^3.3.2", + "octokit": "^3.1.2", "postgres": "^3.4.1", + "showdown": "^2.1.0", "uuid": "^9.0.1", "winston": "^3.10.0", "zod": "^3.22.4" @@ -28,8 +34,11 @@ "@types/amqplib": "^0.10.4", "@types/cors": "^2.8.14", "@types/express": "^4.17.18", + "@types/jsonwebtoken": "^9.0.5", "@types/node": "^20.8.3", + "@types/node-fetch": "^2.6.9", "@types/pg": "^8.10.9", + "@types/showdown": "^2.0.6", "concurrently": "^8.2.1", "drizzle-kit": "^0.20.6", "nodemon": "^3.0.1", diff --git a/segway/src/controller/github.controller.ts b/segway/src/controller/github.controller.ts index 1293ddffe5..9d84d30ead 100644 --- a/segway/src/controller/github.controller.ts +++ b/segway/src/controller/github.controller.ts @@ -1,10 +1,435 @@ +// express import { Request, Response } from "express"; -import { Controller, Get } from "@overnightjs/core"; +// overnight js +import { Controller, Post, Middleware } from "@overnightjs/core"; +// postgres +import { PostgresJsDatabase } from "drizzle-orm/postgres-js"; +// showdown +import showdown from "showdown"; +// octokit +import { Octokit } from "octokit"; +import { getOctokit } from "../utils/github.authentication"; +// logger +import { logger } from "../utils/logger"; +// mq +import { MQSingleton } from "../mq/singleton"; +// middleware +import AuthKeyMiddleware from "../middleware/authkey.middleware"; +@Controller("api/github") +export class GithubController { + /** + * This controller houses all routes for the Github Importer/Integration + */ + // Initialize database and mq + db: PostgresJsDatabase; + mq: MQSingleton; + constructor(db: PostgresJsDatabase, mq: MQSingleton) { + this.db = db; + this.mq = mq; + } -@Controller("/api/github") -export class GithubController { - /** - * This controller houses all routes for the Github Importer/Integration - */ -} \ No newline at end of file + private getAllEntities = async ( + octokit: Octokit, + requestPath: string, + requestParams: any + ) => { + let page = 1; + let results; + + const returnData = []; + + do { + results = await octokit.request(requestPath, { ...requestParams, page }); + returnData.push(...results.data); + page++; + } while (results.data.length !== 0); + + return returnData; + }; + + private githubCommentCreator = ( + issue_number: number, + comments: { [key: string]: any }[] + ) => { + const bulk_comments: { [key: string]: string | number }[] = []; + const converter = new showdown.Converter({ optionKey: "value" }); + + comments.forEach((comment) => { + if ( + parseInt( + comment.issue_url.substring(comment.issue_url.lastIndexOf("/") + 1) + ) === issue_number + ) { + bulk_comments.push({ + external_id: comment.id, + external_source: "github", + comment_html: + comment.body === null + ? "

" + : converter.makeHtml(comment.body), + }); + } + }); + + return bulk_comments; + }; + + private githubLabelCreator = ( + issue_number: number, + labels: (string | { [key: string]: any })[] + ) => { + const issueLabels: { [key: string]: string | number }[] = []; + + labels.forEach((label) => + issueLabels.push({ + name: typeof label === "object" && label !== null ? label.name : label, + }) + ); + + return issueLabels; + }; + + @Post("") + @Middleware([AuthKeyMiddleware]) + private async home(req: Request, res: Response) { + try { + const { owner, repo, installationId } = req.body; + + // Get the octokit instance + const octokit = await getOctokit(installationId); + + // Fetch open issues + const openIssuesResponse = await octokit.request("GET /search/issues", { + q: `repo:${owner}/${repo} type:issue state:open`, + }); + const openIssuesCount = openIssuesResponse.data.total_count; + + // Fetch closed issues + const closedIssuesResponse = await octokit.request("GET /search/issues", { + q: `repo:${owner}/${repo} type:issue state:closed`, + }); + const closedIssuesCount = closedIssuesResponse.data.total_count; + + // Calculate total issues + const totalIssues = openIssuesCount + closedIssuesCount; + + // Fetch total labels count + const labels = await this.getAllEntities( + octokit, + "GET /repos/{owner}/{repo}/labels", + { owner, repo } + ); + + // Fetch total collaborators count + const collaborators = await this.getAllEntities( + octokit, + "GET /repos/{owner}/{repo}/collaborators", + { owner, repo } + ); + + const labelCount = labels.length; + + return res.status(200).json({ + issue_count: totalIssues, + labels: labelCount, + collaborators, + }); + } catch (error) { + logger.error("Failed to fetch importer summary", error); + return res.json({ message: "Server error", status: 500, error: error }); + } + } + + @Post("metadata") + @Middleware([AuthKeyMiddleware]) + private async metadata(req: Request, res: Response) { + try { + const { installationId } = req.body; + + // Get the octokit instance + const octokit = await getOctokit(installationId); + + const { data } = await octokit.request("GET /app", { + headers: { + "X-GitHub-Api-Version": "2022-11-28", + }, + }); + return res.status(200).json(data); + } catch (error) { + logger.error("Failed to fetch metadata", error); + return res.json({ message: "Server error", status: 500, error: error }); + } + } + + @Post("repos") + @Middleware([AuthKeyMiddleware]) + private async repos(req: Request, res: Response) { + try { + const { installationId, page } = req.body; + + // Get the octokit instance + const octokit = await getOctokit(installationId); + + const { data } = await octokit.request("GET /installation/repositories", { + page: page, + headers: { + "X-GitHub-Api-Version": "2022-11-28", + }, + }); + + return res.status(200).json(data); + } catch (error) { + logger.error("Failed to fetch repos", error); + return res.json({ message: "Server error", status: 500, error: error }); + } + } + + @Post("import") + @Middleware([AuthKeyMiddleware]) + private async import(req: Request, res: Response) { + const { + metadata: { owner, name: repo }, + data: { users }, + config: { installation_id, sync }, + workspace_id, + project_id, + created_by, + importer_id, + } = req.body; + + try { + res.status(200).json({ + message: "Successful", + }); + + // Get the octokit instance + const octokit = await getOctokit(installation_id); + + // Markdown converter + const converter = new showdown.Converter({ optionKey: "value" }); + + // users + const members = []; + for (const user of users) { + if (user?.import == "invite" || user?.import == "map") { + const githubMembers = { + args: [], // args + kwargs: { + data: { + type: "member.sync", + email: user.email, + workspace_id: workspace_id, + project_id: project_id, + created_by_id: created_by, + importer_id: importer_id, + }, + }, // kwargs + other_data: {}, // other data + }; + members.push(user); + this.mq?.publish( + githubMembers, + "plane.bgtasks.importer_task.import_task" + ); + } + } + + // Labels + const githubLabels = await octokit.paginate( + octokit.rest.issues.listLabelsForRepo, + { + owner: owner, + repo: repo, + headers: { + "X-GitHub-Api-Version": "2022-11-28", + }, + per_page: 100, + } + ); + for await (const label of githubLabels) { + const labelSync = { + args: [], // args + kwargs: { + data: { + type: "label.sync", + external_source: "github", + external_id: label.id, + color: `#${label.color}`, + name: label.name, + workspace_id: workspace_id, + project_id: project_id, + created_by_id: created_by, + importer_id: importer_id, + }, + }, // kwargs + other_data: {}, // other data + }; + this.mq?.publish(labelSync, "plane.bgtasks.importer_task.import_task"); + } + + // Issues + const githubIssues = await octokit.paginate( + octokit.rest.issues.listForRepo, + { + state: "all", + owner: owner, + repo: repo, + headers: { + "X-GitHub-Api-Version": "2022-11-28", + }, + per_page: 100, + sort: "created", + direction: "asc", + } + ); + + // Issue comments + const comments = []; + const githubComments = await octokit.paginate( + octokit.rest.issues.listCommentsForRepo, + { + owner: owner, + repo: repo, + headers: { + "X-GitHub-Api-Version": "2022-11-28", + }, + per_page: 100, + } + ); + for await (const comment of githubComments) { + comments.push(comment); + } + + for await (const issue of githubIssues) { + if (!("pull_request" in issue)) { + const description_html = await converter.makeHtml( + issue?.body_html || "

" + ); + + const issueSync = { + args: [], // args + kwargs: { + data: { + type: "issue.sync", + name: issue.title, + description_html: description_html, + state: issue.state, + workspace_id: workspace_id, + project_id: project_id, + created_by_id: created_by, + external_id: issue.id, + external_source: "github", + link: { + title: `Original Issue in Github ${issue.number}`, + url: issue.html_url, + }, + parent_id: null, + importer_id: importer_id, + }, + }, + }; + // Push the issue + this.mq?.publish(issueSync, "plane.bgtasks.importer_task.import_task"); + + // Push the comments + const githubIssueComments = this.githubCommentCreator( + issue.number, + comments + ); + + githubIssueComments.forEach((githubIssueComment) => { + const commentSync = { + args: [], + kwargs: { + data: { + type: "issue.comment.sync", + comment_html: githubIssueComment.comment_html, + external_source: githubIssueComment.external_source, + external_id: githubIssueComment.external_id, + external_issue_id: issue.id, + external_issue_source: "github", + workspace_id: workspace_id, + project_id: project_id, + created_by_id: created_by, + importer_id: importer_id, + }, + }, + }; + // push to queue + this.mq?.publish( + commentSync, + "plane.bgtasks.importer_task.import_task" + ); + }); + + // Push the labels + const githubLabels = this.githubLabelCreator( + issue.number, + issue.labels + ); + githubLabels.forEach((githubLabel) => { + const labelSync = { + args: [], + kwargs: { + data: { + type: "issue.label.sync", + name: githubLabel.name, + external_issue_id: issue.id, + external_issue_source: "github", + workspace_id: workspace_id, + project_id: project_id, + created_by_id: created_by, + importer_id: importer_id, + }, + }, + }; + //Push to queue + this.mq?.publish( + labelSync, + "plane.bgtasks.importer_task.import_task" + ); + }); + } + } + + const import_sync = { + args: [], // args + kwargs: { + data: { + type: "import.sync", + workspace_id: workspace_id, + project_id: project_id, + created_by_id: created_by, + importer_id: importer_id, + status: "completed", + }, + }, // kwargs + other_data: {}, // other data + }; + + this.mq?.publish(import_sync, "plane.bgtasks.importer_task.import_task"); + + return; + } catch (error) { + logger.error("Import failed", error); + const import_sync = { + args: [], // args + kwargs: { + data: { + type: "import.sync", + workspace_id: workspace_id, + project_id: project_id, + created_by_id: created_by, + importer_id: importer_id, + status: "failed", + }, + }, // kwargs + other_data: {}, // other data + }; + + this.mq?.publish(import_sync, "plane.bgtasks.importer_task.import_task"); + return res.json({ message: "Server error", status: 500, error: error }); + } + } +} diff --git a/segway/src/controller/jira.controller.ts b/segway/src/controller/jira.controller.ts index b0f0819845..662bc729b0 100644 --- a/segway/src/controller/jira.controller.ts +++ b/segway/src/controller/jira.controller.ts @@ -5,7 +5,11 @@ import { PostgresJsDatabase } from "drizzle-orm/postgres-js"; // mq import { MQSingleton } from "../mq/singleton"; // middleware -import AuthKeyMiddlware from "../middleware/authkey.middleware"; +import AuthKeyMiddleware from "../middleware/authkey.middleware"; +// axios +import axios, { AxiosResponse } from "axios"; + +import { loadIssues, loadComments } from "../utils/paginator"; @Controller("api/jira") export class JiraController { @@ -22,29 +26,409 @@ export class JiraController { } @Post("") - @Middleware([AuthKeyMiddlware]) - private home(req: Request, res: Response) { + @Middleware([AuthKeyMiddleware]) + private async home(req: Request, res: Response) { try { - res.status(200).json({ message: "Hello, Plane Users" }); + const { email, api_token, project_key, cloud_hostname } = req.body; + const auth = { + username: email, + password: api_token, + }; + const headers = { + Accept: "application/json", + }; - // Process Jira message - const body = { + // Constructing URLs + const issueUrl = `https://${cloud_hostname}/rest/api/3/search?jql=project=${project_key}`; + const moduleUrl = `https://${cloud_hostname}/rest/api/3/search?jql=project=${project_key}`; + const statusUrl = `https://${cloud_hostname}/rest/api/3/status/?jql=project={project_key}`; + const labelsUrl = `https://${cloud_hostname}/rest/api/3/label/?jql=project=${project_key}`; + const usersUrl = `https://${cloud_hostname}/rest/api/3/users/search?jql=project=${project_key}`; + + // Making requests + const [ + issueResponse, + moduleResponse, + statusResponse, + labelsResponse, + usersResponse, + ] = await Promise.all([ + axios.get(issueUrl, { auth, headers }), + axios.get(moduleUrl, { auth, headers }), + axios.get(statusUrl, { auth, headers }), + axios.get(labelsUrl, { auth, headers }), + axios.get(usersUrl, { auth, headers }), + ]); + + const issuesTotal = issueResponse.data.total; + const modulesTotal = moduleResponse.data.total; + const labelsTotal = labelsResponse.data.total; + const statusCount = statusResponse.data.length; + + const usersData = usersResponse.data.filter( + (user: any) => user.accountType === "atlassian" + ); + + res.status(200).json({ + issues: issuesTotal, + modules: modulesTotal, + labels: labelsTotal, + states: statusCount, + users: usersData, + }); + + return; + } catch (error) { + return res.json({ message: "Server error", status: 500, error: error }); + } + } + + @Post("import") + @Middleware([AuthKeyMiddleware]) + private async import(req: Request, res: Response) { + try { + res.status(200).json({ + message: "Successful", + }); + + // const result = await this.db.select().from('users'); + const { email, api_token, project_key, cloud_hostname } = + req.body.metadata; + + const auth = { + username: email, + password: api_token, + }; + + const headers = { + Accept: "application/json", + }; + + const workspace_id = req.body.workspace_id; + const project_id = req.body.project_id; + const created_by = req.body.created_by; + const importer_id = req.body.importer_id; + + const users = req.body.data.users; + + // users + const members = []; + for (const user of users) { + if (user?.import == "invite" || user?.import == "map") { + const jira_members = { + args: [], // args + kwargs: { + data: { + type: "member.sync", + email: user.email, + workspace_id: workspace_id, + project_id: project_id, + created_by: created_by, + importer_id: importer_id, + }, + }, // kwargs + other_data: {}, // other data + }; + members.push(user); + this.mq?.publish( + jira_members, + "plane.bgtasks.importer_task.import_task" + ); + } + } + + // labels + const labelsUrl = `https://${cloud_hostname}/rest/api/3/label/?jql=project=${project_key}`; + const labelsResponse = await axios.get(labelsUrl, { auth, headers }); + const labels = labelsResponse.data.values; + for (const label of labels) { + const labelssync = { + args: [], // args + kwargs: { + data: { + external_source: "jira", + type: "label.sync", + name: label, + workspace_id: workspace_id, + project_id: project_id, + created_by: created_by, + importer_id: importer_id, + }, + }, // kwargs + other_data: {}, // other data + }; + this.mq?.publish(labelssync, "plane.bgtasks.importer_task.import_task"); + } + + // states + const statusUrl = `https://${cloud_hostname}/rest/api/3/project/${project_key}/statuses`; + const response = await axios.get(statusUrl, { auth, headers }); + + if (response && response.data && response.data.length) { + const statusData = response.data[0]; + if (statusData && statusData.statuses) { + for (const statusCategory of statusData.statuses) { + const state_name = statusCategory.name; + const state_group = + statusCategory.statusCategory.name === "To Do" + ? "unstarted" + : statusCategory.statusCategory.name === "In Progress" + ? "started" + : statusCategory.statusCategory.name === "Done" + ? "completed" + : statusCategory.statusCategory.name; + const statessync = { + args: [], // args + kwargs: { + data: { + type: "state.sync", + state_name: state_name, + state_group: state_group, + workspace_id: workspace_id, + project_id: project_id, + created_by: created_by, + external_id: statusCategory.id, + external_source: "jira", + }, + }, // kwargs + other_data: {}, // other data + }; + this.mq?.publish( + statessync, + "plane.bgtasks.importer_task.import_task" + ); + } + } + } + + const modules = []; + const child_issues = []; + const module_issues = []; + + const url = `https://${cloud_hostname}/rest/api/3/search/?jql=project=${project_key}&fields=comment, issuetype, summary, description, assignee, priority, status, labels, duedate, parent, parentEpic&maxResults=100&expand=renderedFields`; + + for await (const issue of loadIssues(url, auth)) { + if (issue.fields.parent) { + if (issue.fields.parent?.fields?.issuetype?.name == "Epic") { + module_issues.push({ + issue_id: issue.id, + module_id: issue.fields.parent?.id, + }); + } else { + child_issues.push(issue); + continue; + } + } + + // skipping all the epics + if (issue.fields.issuetype.name === "Epic") { + modules.push(issue); + continue; + } + + const user = members.find( + (user) => user.username === issue.fields.assignee?.displayName + ); + + // issue comments + const comments_list = []; + const comment_url = `https://${cloud_hostname}/rest/api/3/issue/${issue.id}/comment?expand=renderedBody`; + const commentResponse = await axios.get(comment_url, { auth, headers }); + if ( + commentResponse && + commentResponse.data && + commentResponse.data.total + ) { + for await (const comment of loadComments(comment_url, auth)) { + comments_list.push({ + comment_html: + comment.renderedBody === "" ? "

" : comment.renderedBody, + created_by: comment.updateAuthor.emailAddress, + }); + } + } + + const issuessync = { + args: [], // args + kwargs: { + data: { + type: "issue.sync", + name: issue.fields.summary.substring(0, 250), + description_html: issue.renderedFields.description ?? null, + assignee: user?.email, + state: issue.fields.status.name, + priority: + issue.fields.priority.name.toLowerCase() === "medium" + ? "medium" + : issue.fields.priority.name.toLowerCase() === "highest" + ? "high" + : "low", + workspace_id: workspace_id, + project_id: project_id, + created_by: created_by, + external_id: issue.id, + external_source: "jira", + comments_list: comments_list, + target_date: issue.fields.duedate, + link: { + title: `Original Issue in Jira ${issue.key}`, + url: `https://${cloud_hostname}/browse/${issue.key}`, + }, + labels_list: issue.fields.labels, + parent_id: null, + importer_id: importer_id, + }, + }, + }; + this.mq?.publish(issuessync, "plane.bgtasks.importer_task.issue_sync"); + } + + for (const issue of child_issues) { + const user = members.find( + (user) => user.username === issue.fields.assignee?.displayName + ); + + // issue comments + const comments_list = []; + const comment_url = `https://${cloud_hostname}/rest/api/3/issue/${issue.id}/comment?expand=renderedBody`; + const commentResponse = await axios.get(comment_url, { auth, headers }); + if ( + commentResponse && + commentResponse.data && + commentResponse.data.total + ) { + for await (const comment of loadComments(comment_url, auth)) { + comments_list.push({ + comment_html: + comment.renderedBody === "" ? "

" : comment.renderedBody, + created_by: comment.updateAuthor.emailAddress, + }); + } + } + + const issuessync = { + args: [], // args + kwargs: { + data: { + type: "issue.create", + name: issue.fields.summary.substring(0, 250), + description_html: issue.renderedFields?.description, + assignee: user?.email, + state: issue.fields.status.name, + priority: + issue.fields.priority.name.toLowerCase() === "medium" + ? "medium" + : issue.fields.priority.name.toLowerCase() === "highest" + ? "high" + : "low", + workspace_id: workspace_id, + project_id: project_id, + created_by: created_by, + external_id: issue.id, + external_source: "jira", + comments_list: comments_list, + target_date: issue.fields.duedate, + link: { + title: `Original Issue in Jira ${issue.key}`, + url: `https://${cloud_hostname}/browse/${issue.key}`, + }, + labels_list: issue.fields.labels, + parent_id: issue.fields.parent.id, + }, + }, + }; + this.mq?.publish(issuessync, "plane.bgtasks.importer_task.issue_sync"); + } + + // modules + for (const module of modules) { + const modulessync = { + args: [], // args + kwargs: { + data: { + type: "module.sync", + name: module.fields.summary.substring(0, 250), + description_html: module.renderedFields?.description, + workspace_id: workspace_id, + project_id: project_id, + created_by: created_by, + external_id: module.id, + external_source: "jira", + importer_id: importer_id, + }, + }, // kwargs + other_data: {}, // other data + }; + this.mq?.publish( + modulessync, + "plane.bgtasks.importer_task.import_task" + ); + } + + for (const module_issue of module_issues) { + const modules_issue_sync = { + args: [], // args + kwargs: { + data: { + type: "module.issue.sync", + module_id: module_issue.module_id, + issue_id: module_issue.issue_id, + workspace_id: workspace_id, + project_id: project_id, + created_by: created_by, + external_source: "jira", + importer_id: importer_id, + }, + }, // kwargs + other_data: {}, // other data + }; + this.mq?.publish( + modules_issue_sync, + "plane.bgtasks.importer_task.importer_task" + ); + } + + const import_sync = { args: [], // args kwargs: { data: { - type: "issue.create", - data: { - message: "Segway say's Hi", - }, + type: "import.sync", + workspace_id: workspace_id, + project_id: project_id, + created_by: created_by, + importer_id: importer_id, + status: "completed", }, }, // kwargs other_data: {}, // other data }; - this.mq?.publish(body, "plane.bgtasks.issue_sync_task.issue_sync"); + this.mq?.publish(import_sync, "plane.bgtasks.importer_task.import_task"); + return; } catch (error) { - return res.json({ message: "Server error" }); + const workspace_id = req.body.workspace_id; + const project_id = req.body.project_id; + const created_by = req.body.created_by; + const importer_id = req.body.importer_id; + const import_sync = { + args: [], // args + kwargs: { + data: { + type: "import.sync", + workspace_id: workspace_id, + project_id: project_id, + created_by: created_by, + importer_id: importer_id, + status: "failed", + }, + }, // kwargs + other_data: {}, // other data + }; + + this.mq?.publish(import_sync, "plane.bgtasks.importer_task.import_task"); + + return res.json({ message: "Server error", error: error }); } } } diff --git a/segway/src/utils/github.authentication.ts b/segway/src/utils/github.authentication.ts new file mode 100644 index 0000000000..da7cc70c39 --- /dev/null +++ b/segway/src/utils/github.authentication.ts @@ -0,0 +1,25 @@ +import { Octokit } from 'octokit' +import { createAppAuth } from '@octokit/auth-app' + + +export const getOctokit = async (installationId: number): Promise => { + + const appId = process.env.GITHUB_APP_ID || ""; + const privateKey = process.env.GITHUB_APP_PRIVATE_KEY || ""; + + if (!privateKey || !appId) { + throw new Error("Private key and App ID not found in environment variables."); + } + + // Initiate the octokit + const octokit = new Octokit({ + authStrategy: createAppAuth, + auth: { + appId: appId, + privateKey: privateKey, + installationId: installationId + } + }) + + return octokit; +} diff --git a/segway/src/utils/paginator.ts b/segway/src/utils/paginator.ts new file mode 100644 index 0000000000..01b2a8ee36 --- /dev/null +++ b/segway/src/utils/paginator.ts @@ -0,0 +1,73 @@ +import axios from "axios"; + +async function* pageThroughIssues(endpoint: string, auth: any) { + async function* makeRequest(_endpoint: string): AsyncGenerator { + const response = await axios({ + url: _endpoint, + method: "get", + auth: auth, + }); + + if (response.status !== 200) { + throw new Error(await response.statusText); + } + + const page = await response.data; + + yield page; + + if (page.issues.length) { + const url: string = `${endpoint}&startAt=${page.startAt + 100}`; + yield* makeRequest(url); + } + } + + yield* makeRequest(endpoint); +} + +export async function* loadIssues(url: any, auth: any) { + const endpoint = url; + const result = pageThroughIssues(endpoint, auth); + + for await (const page of result) { + for (const issue of page.issues) { + yield issue; + } + } +} + +async function* pageThroughComments(endpoint: any, auth: any) { + async function* makeRequest(_endpoint: string): AsyncGenerator { + const response = await axios({ + url: _endpoint, + method: "get", + auth: auth, + }); + + if (response.status !== 200) { + throw new Error(await response.statusText); + } + + const page = await response.data; + + yield page; + + if (page.comments.length) { + const url: string = `${endpoint}&startAt=${page.startAt + 100}`; + yield* makeRequest(url); + } + } + + yield* makeRequest(endpoint); +} + +export async function* loadComments(url: any, auth: any) { + const endpoint = url; + const result = pageThroughComments(endpoint, auth); + + for await (const page of result) { + for (const comment of page.comments) { + yield comment; + } + } +} diff --git a/segway/yarn.lock b/segway/yarn.lock index f5ea832731..5a246b3348 100644 --- a/segway/yarn.lock +++ b/segway/yarn.lock @@ -55,6 +55,13 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== +"@cspotcode/source-map-support@0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@dabh/diagnostics@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" @@ -435,6 +442,262 @@ resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@octokit/app@^14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@octokit/app/-/app-14.0.2.tgz#b47c52020221351fb58640f113eb38b2ad3998fe" + integrity sha512-NCSCktSx+XmjuSUVn2dLfqQ9WIYePGP95SDJs4I9cn/0ZkeXcPkaoCLl64Us3dRKL2ozC7hArwze5Eu+/qt1tg== + dependencies: + "@octokit/auth-app" "^6.0.0" + "@octokit/auth-unauthenticated" "^5.0.0" + "@octokit/core" "^5.0.0" + "@octokit/oauth-app" "^6.0.0" + "@octokit/plugin-paginate-rest" "^9.0.0" + "@octokit/types" "^12.0.0" + "@octokit/webhooks" "^12.0.4" + +"@octokit/auth-app@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-6.0.2.tgz#d12b6867e9425ebda07cd3e3c4b5508260b1397f" + integrity sha512-HYuRX3Fvhs2y9i7a4F8f+A5HWfacRWmpERHGBEOtgvKVjJkOQZKUY2v6HiSszYecHAF8Ojqngp2iraSP3SvNpQ== + dependencies: + "@octokit/auth-oauth-app" "^7.0.0" + "@octokit/auth-oauth-user" "^4.0.0" + "@octokit/request" "^8.0.2" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + deprecation "^2.3.1" + lru-cache "^10.0.0" + universal-github-app-jwt "^1.1.1" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-app@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-7.0.1.tgz#30fd8fcb4608ca52c29c265a3fc7032897796c8e" + integrity sha512-RE0KK0DCjCHXHlQBoubwlLijXEKfhMhKm9gO56xYvFmP1QTMb+vvwRPmQLLx0V+5AvV9N9I3lr1WyTzwL3rMDg== + dependencies: + "@octokit/auth-oauth-device" "^6.0.0" + "@octokit/auth-oauth-user" "^4.0.0" + "@octokit/request" "^8.0.2" + "@octokit/types" "^12.0.0" + "@types/btoa-lite" "^1.0.0" + btoa-lite "^1.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-device@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-6.0.1.tgz#38e5f7f8997c5e8b774f283463ecf4a7e42d7cee" + integrity sha512-yxU0rkL65QkjbqQedgVx3gmW7YM5fF+r5uaSj9tM/cQGVqloXcqP2xK90eTyYvl29arFVCW8Vz4H/t47mL0ELw== + dependencies: + "@octokit/oauth-methods" "^4.0.0" + "@octokit/request" "^8.0.0" + "@octokit/types" "^12.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-user@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-4.0.1.tgz#c8267883935c83f78318c726ff91d7e98de05517" + integrity sha512-N94wWW09d0hleCnrO5wt5MxekatqEJ4zf+1vSe8MKMrhZ7gAXKFOKrDEZW2INltvBWJCyDUELgGRv8gfErH1Iw== + dependencies: + "@octokit/auth-oauth-device" "^6.0.0" + "@octokit/oauth-methods" "^4.0.0" + "@octokit/request" "^8.0.2" + "@octokit/types" "^12.0.0" + btoa-lite "^1.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-token@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" + integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== + +"@octokit/auth-unauthenticated@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-unauthenticated/-/auth-unauthenticated-5.0.1.tgz#d8032211728333068b2e07b53997c29e59a03507" + integrity sha512-oxeWzmBFxWd+XolxKTc4zr+h3mt+yofn4r7OfoIkR/Cj/o70eEGmPsFbueyJE2iBAGpjgTnEOKM3pnuEGVmiqg== + dependencies: + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + +"@octokit/core@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.0.2.tgz#ae7c5d61fdd98ba348a27c3cc510879a130b1234" + integrity sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg== + dependencies: + "@octokit/auth-token" "^4.0.0" + "@octokit/graphql" "^7.0.0" + "@octokit/request" "^8.0.2" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^9.0.0": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.4.tgz#8afda5ad1ffc3073d08f2b450964c610b821d1ea" + integrity sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw== + dependencies: + "@octokit/types" "^12.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^7.0.0": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.0.2.tgz#3df14b9968192f9060d94ed9e3aa9780a76e7f99" + integrity sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q== + dependencies: + "@octokit/request" "^8.0.1" + "@octokit/types" "^12.0.0" + universal-user-agent "^6.0.0" + +"@octokit/oauth-app@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@octokit/oauth-app/-/oauth-app-6.0.0.tgz#a5c3b7794df4280c6aadbadd843119059d70a2c4" + integrity sha512-bNMkS+vJ6oz2hCyraT9ZfTpAQ8dZNqJJQVNaKjPLx4ue5RZiFdU1YWXguOPR8AaSHS+lKe+lR3abn2siGd+zow== + dependencies: + "@octokit/auth-oauth-app" "^7.0.0" + "@octokit/auth-oauth-user" "^4.0.0" + "@octokit/auth-unauthenticated" "^5.0.0" + "@octokit/core" "^5.0.0" + "@octokit/oauth-authorization-url" "^6.0.2" + "@octokit/oauth-methods" "^4.0.0" + "@types/aws-lambda" "^8.10.83" + universal-user-agent "^6.0.0" + +"@octokit/oauth-authorization-url@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-6.0.2.tgz#cc82ca29cc5e339c9921672f39f2b3f5c8eb6ef2" + integrity sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA== + +"@octokit/oauth-methods@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-4.0.1.tgz#90d22c662387056307778d7e5c4763ff559636c4" + integrity sha512-1NdTGCoBHyD6J0n2WGXg9+yDLZrRNZ0moTEex/LSPr49m530WNKcCfXDghofYptr3st3eTii+EHoG5k/o+vbtw== + dependencies: + "@octokit/oauth-authorization-url" "^6.0.2" + "@octokit/request" "^8.0.2" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + btoa-lite "^1.0.0" + +"@octokit/openapi-types@^19.1.0": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.1.0.tgz#75ec7e64743870fc73e1ab4bc6ec252ecdd624dc" + integrity sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw== + +"@octokit/plugin-paginate-graphql@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-4.0.0.tgz#b26024fa454039c18b948f13bf754ff86b89e8b9" + integrity sha512-7HcYW5tP7/Z6AETAPU14gp5H5KmCPT3hmJrS/5tO7HIgbwenYmgw4OY9Ma54FDySuxMwD+wsJlxtuGWwuZuItA== + +"@octokit/plugin-paginate-rest@^9.0.0": + version "9.1.5" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz#1705bcef4dcde1f4015ee58a63dc61b68648f480" + integrity sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg== + dependencies: + "@octokit/types" "^12.4.0" + +"@octokit/plugin-request-log@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz#260fa6970aa97bbcbd91f99f3cd812e2b285c9f1" + integrity sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA== + +"@octokit/plugin-rest-endpoint-methods@^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.2.0.tgz#eeaa4de97a2ae26404dea30ce3e17b11928e027c" + integrity sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q== + dependencies: + "@octokit/types" "^12.3.0" + +"@octokit/plugin-retry@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-6.0.1.tgz#3257404f7cc418e1c1f13a7f2012c1db848b7693" + integrity sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog== + dependencies: + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + bottleneck "^2.15.3" + +"@octokit/plugin-throttling@^8.0.0": + version "8.1.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-8.1.3.tgz#7fb0e001c0cb9383c6be07740b8ec326ed990f6b" + integrity sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A== + dependencies: + "@octokit/types" "^12.2.0" + bottleneck "^2.15.3" + +"@octokit/request-error@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.0.1.tgz#277e3ce3b540b41525e07ba24c5ef5e868a72db9" + integrity sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ== + dependencies: + "@octokit/types" "^12.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^8.0.0", "@octokit/request@^8.0.1", "@octokit/request@^8.0.2": + version "8.1.6" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.6.tgz#a76a859c30421737a3918b40973c2ff369009571" + integrity sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ== + dependencies: + "@octokit/endpoint" "^9.0.0" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + universal-user-agent "^6.0.0" + +"@octokit/rest@^20.0.2": + version "20.0.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.0.2.tgz#5cc8871ba01b14604439049e5f06c74b45c99594" + integrity sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ== + dependencies: + "@octokit/core" "^5.0.0" + "@octokit/plugin-paginate-rest" "^9.0.0" + "@octokit/plugin-request-log" "^4.0.0" + "@octokit/plugin-rest-endpoint-methods" "^10.0.0" + +"@octokit/types@^12.0.0", "@octokit/types@^12.2.0", "@octokit/types@^12.3.0", "@octokit/types@^12.4.0": + version "12.4.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.4.0.tgz#8f97b601e91ce6b9776ed8152217e77a71be7aac" + integrity sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ== + dependencies: + "@octokit/openapi-types" "^19.1.0" + +"@octokit/webhooks-methods@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/webhooks-methods/-/webhooks-methods-4.0.0.tgz#d1697930ba3d8e6b6d0f8a2c996bb440d2e1df1b" + integrity sha512-M8mwmTXp+VeolOS/kfRvsDdW+IO0qJ8kYodM/sAysk093q6ApgmBXwK1ZlUvAwXVrp/YVHp6aArj4auAxUAOFw== + +"@octokit/webhooks-types@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@octokit/webhooks-types/-/webhooks-types-7.1.0.tgz#d533dea253416e02dd6c2bfab25e533295bd5d3f" + integrity sha512-y92CpG4kFFtBBjni8LHoV12IegJ+KFxLgKRengrVjKmGE5XMeCuGvlfRe75lTRrgXaG6XIWJlFpIDTlkoJsU8w== + +"@octokit/webhooks@^12.0.4": + version "12.0.10" + resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-12.0.10.tgz#3dcd3424ae4ff29b62b8fc8408b08c17b8178ece" + integrity sha512-Q8d26l7gZ3L1SSr25NFbbP0B431sovU5r0tIqcvy8Z4PrD1LBv0cJEjvDLOieouzPSTzSzufzRIeXD7S+zAESA== + dependencies: + "@octokit/request-error" "^5.0.0" + "@octokit/webhooks-methods" "^4.0.0" + "@octokit/webhooks-types" "7.1.0" + aggregate-error "^3.1.0" + "@overnightjs/core@^1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@overnightjs/core/-/core-1.7.6.tgz#9e4191454f6ecb5bb1a455752b41557f541320e2" @@ -444,52 +707,52 @@ reflect-metadata "^0.1.13" tslib "^2.0.0" -"@sentry-internal/tracing@7.86.0": - version "7.86.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.86.0.tgz#657e80eb7d08d1030393902c1a7bc47fc39ccb2d" - integrity sha512-b4dUsNWlPWRwakGwR7bhOkqiFlqQszH1hhVFwrm/8s3kqEBZ+E4CeIfCvuHBHQ1cM/fx55xpXX/BU163cy+3iQ== +"@sentry-internal/tracing@7.88.0": + version "7.88.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.88.0.tgz#c820bde835c4af576781f8b818eed5085e417927" + integrity sha512-xXQdcYhsS+ourzJHjXNjZC9zakuc97udmpgaXRjEP7FjPYclIx+YXwgFBdHM2kzAwZLFOsEce5dr46GVXUDfZw== dependencies: - "@sentry/core" "7.86.0" - "@sentry/types" "7.86.0" - "@sentry/utils" "7.86.0" + "@sentry/core" "7.88.0" + "@sentry/types" "7.88.0" + "@sentry/utils" "7.88.0" -"@sentry/core@7.86.0": - version "7.86.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.86.0.tgz#d01f538783dee9a0d79141a63145392ad2c1cb89" - integrity sha512-SbLvqd1bRYzhDS42u7GMnmbDMfth/zRiLElQWbLK/shmuZzTcfQSwNNdF4Yj+VfjOkqPFgGmICHSHVUc9dh01g== +"@sentry/core@7.88.0": + version "7.88.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.88.0.tgz#46f1526e9b98de96a0e93fd69917a990db5d5a37" + integrity sha512-Jzbb7dcwiCO7kI0a1w+32UzWxbEn2OcZWzp55QMEeAh6nZ/5CXhXwpuHi0tW7doPj+cJdmxMTMu9LqMVfdGkzQ== dependencies: - "@sentry/types" "7.86.0" - "@sentry/utils" "7.86.0" + "@sentry/types" "7.88.0" + "@sentry/utils" "7.88.0" "@sentry/node@^7.73.0": - version "7.86.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.86.0.tgz#416db178aeb64f7895a23ae1c3d4d65ce51ed50a" - integrity sha512-cB1bn/LMn2Km97Y3hv63xwWxT50/G5ixGuSxTZ3dCQM6VDhmZoCuC5NGT3itVvaRd6upQXRZa5W0Zgyh0HXKig== + version "7.88.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.88.0.tgz#e57cf7b5bfe74e70bb53ffb6ee30e92f4576870a" + integrity sha512-X6Xyh7AEitnWqn1CHQrmsUqRn0GKj/6nPE5VC2DLQfHiFH1Fknrt+csFzDchQ/86awXYwuY4Le5ECEH//X/WzQ== dependencies: - "@sentry-internal/tracing" "7.86.0" - "@sentry/core" "7.86.0" - "@sentry/types" "7.86.0" - "@sentry/utils" "7.86.0" + "@sentry-internal/tracing" "7.88.0" + "@sentry/core" "7.88.0" + "@sentry/types" "7.88.0" + "@sentry/utils" "7.88.0" https-proxy-agent "^5.0.0" "@sentry/tracing@^7.73.0": - version "7.86.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.86.0.tgz#d18fc186c4fe654a629f1e536308b4c270dd195b" - integrity sha512-WPqgmbLm6ntpIoTZd1L/RHIVEDMmvVjIDxKeXGiJeXHZG2VMtgwoxuZAFluVFaD0Sr20Nhj+ZS7HvKOWTxrjjA== + version "7.88.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.88.0.tgz#40b5da6fbd17e5c2ba3bd26ae015f6d99c998d73" + integrity sha512-Lj4hhLraalN4w3swXkP2do1hcaQVOuLvO6eJJbcwf10b+P4CcdlwAnqvxOOCNxA5VzG4/K2BqQ8LRU4S0Ulj9A== dependencies: - "@sentry-internal/tracing" "7.86.0" + "@sentry-internal/tracing" "7.88.0" -"@sentry/types@7.86.0": - version "7.86.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.86.0.tgz#56ed2f5b15e8130ea5ecfbbc4102d88eaa3b3a67" - integrity sha512-pGAt0+bMfWgo0KG2epthfNV4Wae03tURpoxNjGo5Fr4cXxvLTSijSAQ6rmmO4bXBJ7+rErEjX30g30o/eEdP9g== +"@sentry/types@7.88.0": + version "7.88.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.88.0.tgz#b3a09733a7bfad3634687b77764c5767d646d6e7" + integrity sha512-FvwvmX1pWAZKicPj4EpKyho8Wm+C4+r5LiepbbBF8oKwSPJdD2QV1fo/LWxsrzNxWOllFIVIXF5Ed3nPYQWpTw== -"@sentry/utils@7.86.0": - version "7.86.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.86.0.tgz#356ec19bf1e3e5c40935dd987fd15bee8c6b37ba" - integrity sha512-6PejFtw9VTFFy5vu0ks+U7Ozkqz+eMt+HN8AZKBKErYzX5/xs0kpkOcSRpu3ETdTYcZf8VAmLVgFgE2BE+3WuQ== +"@sentry/utils@7.88.0": + version "7.88.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.88.0.tgz#704e79f14047080564c3e5231028f1cef8824e9f" + integrity sha512-ukminfRmdBXTzk49orwJf3Lu3hR60ZRHjE2a4IXwYhyDT6JJgJqgsq1hzGXx0AyFfyS4WhfZ6QUBy7fu3BScZQ== dependencies: - "@sentry/types" "7.86.0" + "@sentry/types" "7.88.0" "@types/amqplib@^0.10.4": version "0.10.4" @@ -498,6 +761,11 @@ dependencies: "@types/node" "*" +"@types/aws-lambda@^8.10.83": + version "8.10.130" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.130.tgz#d4a44201f0e47c8320a5868d845ad654f3b4adc2" + integrity sha512-HxTfLeGvD1wTJqIGwcBCpNmHKenja+We1e0cuzeIDFfbEj3ixnlTInyPR/81zAe0Ss/Ip12rFK6XNeMLVucOSg== + "@types/body-parser@*": version "1.19.5" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" @@ -506,6 +774,11 @@ "@types/connect" "*" "@types/node" "*" +"@types/btoa-lite@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/btoa-lite/-/btoa-lite-1.0.2.tgz#82bb6aab00abf7cff3ca2825abe010c0cd536ae5" + integrity sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg== + "@types/connect@*": version "3.4.38" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" @@ -545,6 +818,13 @@ resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== +"@types/jsonwebtoken@^9.0.0", "@types/jsonwebtoken@^9.0.5": + version "9.0.5" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz#0bd9b841c9e6c5a937c17656e2368f65da025588" + integrity sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA== + dependencies: + "@types/node" "*" + "@types/mime@*": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" @@ -555,6 +835,14 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== +"@types/node-fetch@^2.6.9": + version "2.6.9" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.9.tgz#15f529d247f1ede1824f7e7acdaa192d5f28071e" + integrity sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA== + dependencies: + "@types/node" "*" + form-data "^4.0.0" + "@types/node-forge@^1.3.0": version "1.3.10" resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.10.tgz#62a19d4f75a8b03290578c2b04f294b1a5a71b07" @@ -605,6 +893,11 @@ "@types/mime" "*" "@types/node" "*" +"@types/showdown@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/showdown/-/showdown-2.0.6.tgz#3d7affd5f971b4a17783ec2b23b4ad3b97477b7e" + integrity sha512-pTvD/0CIeqe4x23+YJWlX2gArHa8G0J0Oh6GKaVXV7TAeickpkkZiNOgFcFcmLQ5lB/K0qBJL1FtRYltBfbGCQ== + "@types/triple-beam@^1.3.2": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" @@ -640,6 +933,14 @@ agent-base@6: dependencies: debug "4" +aggregate-error@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + amqplib@^0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.10.3.tgz#e186a2f74521eb55ec54db6d25ae82c29c1f911a" @@ -687,11 +988,30 @@ async@^3.2.3: resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" + integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -720,6 +1040,11 @@ body-parser@1.20.1: type-is "~1.6.18" unpipe "1.0.0" +bottleneck@^2.15.3: + version "2.19.5" + resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" + integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -742,6 +1067,16 @@ braces@~3.0.2: dependencies: fill-range "^7.0.1" +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + integrity sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA== + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -807,6 +1142,11 @@ chokidar@^3.5.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-color@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.3.tgz#73769ba969080629670f3f2ef69a4bf4e7cc1879" @@ -875,7 +1215,14 @@ colorspace@1.1.x: color "^3.1.3" text-hex "1.0.x" -commander@^9.4.1: +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^9.0.0, commander@^9.4.1: version "9.5.0" resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== @@ -955,6 +1302,11 @@ data-uri-to-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz#d296973d5a4897a5dbe31716d118211921f04770" integrity sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA== +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + date-fns@^2.30.0: version "2.30.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" @@ -985,11 +1337,21 @@ define-data-property@^1.1.1: gopd "^1.0.1" has-property-descriptors "^1.0.0" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -1039,6 +1401,13 @@ drizzle-orm@^0.29.1: resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.29.1.tgz#0c93efed19718a851d97d23d9ff2dd8b788faf2d" integrity sha512-yItc4unfHnk8XkDD3/bdC63vdboTY7e7I03lCF1OJYABXSIfQYU9BFTQJXMMovVeb3T1/OJWwfW/70T1XPnuUA== +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -1273,6 +1642,14 @@ fecha@^4.2.0: resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -1298,6 +1675,27 @@ fn.name@1.x.x: resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== +follow-redirects@^1.15.0: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -1461,6 +1859,11 @@ ignore-by-default@^1.0.1: resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1542,11 +1945,79 @@ json-diff@0.9.0: difflib "~0.2.1" dreamopt "~0.8.0" +jsonwebtoken@^9.0.0, jsonwebtoken@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" + integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^7.5.4" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + kuler@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" @@ -1569,6 +2040,11 @@ logform@^2.3.2, logform@^2.4.0: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" +lru-cache@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -1624,7 +2100,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -1715,6 +2191,20 @@ next-tick@1, next-tick@^1.1.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -1763,6 +2253,22 @@ obuf@~1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +octokit@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/octokit/-/octokit-3.1.2.tgz#e574e4f2f5f8712e10412ce81fb56a74c93d4cfa" + integrity sha512-MG5qmrTL5y8KYwFgE1A4JWmgfQBaIETE/lOlfwNYx1QOtCQHGVxkRJmdUJltFc1HVn73d61TlMhMyNTOtMl+ng== + dependencies: + "@octokit/app" "^14.0.2" + "@octokit/core" "^5.0.0" + "@octokit/oauth-app" "^6.0.0" + "@octokit/plugin-paginate-graphql" "^4.0.0" + "@octokit/plugin-paginate-rest" "^9.0.0" + "@octokit/plugin-rest-endpoint-methods" "^10.0.0" + "@octokit/plugin-retry" "^6.0.0" + "@octokit/plugin-throttling" "^8.0.0" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -1770,7 +2276,7 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -once@^1.3.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -1877,6 +2383,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + pstree.remy@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" @@ -1941,9 +2452,9 @@ reflect-metadata@^0.1.13: integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== require-directory@^2.1.1: version "2.1.1" @@ -1995,7 +2506,7 @@ rxjs@^7.8.1: dependencies: tslib "^2.1.0" -safe-buffer@5.2.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -2079,6 +2590,13 @@ shell-quote@^1.8.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== +showdown@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/showdown/-/showdown-2.1.0.tgz#1251f5ed8f773f0c0c7bfc8e6fd23581f9e545c5" + integrity sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ== + dependencies: + commander "^9.0.0" + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -2296,6 +2814,19 @@ undici@^5.22.1: dependencies: "@fastify/busboy" "^2.0.0" +universal-github-app-jwt@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-1.1.1.tgz#d57cee49020662a95ca750a057e758a1a7190e6e" + integrity sha512-G33RTLrIBMFmlDV4u4CBF7dh71eWwykck4XgaxaIVeZKOYZRAAxvcGMRFTUclVY6xoUPQvO4Ne5wKGxYm/Yy9w== + dependencies: + "@types/jsonwebtoken" "^9.0.0" + jsonwebtoken "^9.0.0" + +universal-user-agent@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -2329,6 +2860,11 @@ vary@^1, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +web-streams-polyfill@^3.0.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + winston-transport@^4.5.0: version "4.6.0" resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.6.0.tgz#f1c1a665ad1b366df72199e27892721832a19e1b" @@ -2372,11 +2908,12 @@ workerd@1.20231030.0: "@cloudflare/workerd-windows-64" "1.20231030.0" wrangler@^3.7.0: - version "3.20.0" - resolved "https://registry.yarnpkg.com/wrangler/-/wrangler-3.20.0.tgz#053170409b1693b65513818e2802194fe02e5b2a" - integrity sha512-7mg25zJByhBmrfG+CbImSid7JNd5lxGovLA167ndtE8Yrqd3TUukrGWL8o0RCQIm0FUcgl2nCzWArJDShlZVKA== + version "3.21.0" + resolved "https://registry.yarnpkg.com/wrangler/-/wrangler-3.21.0.tgz#c30d4e032188db98fda0001806dbda4bef4055dd" + integrity sha512-DLoo4XfjeyuGRAVWZFHmU1jWnZIfyLGDm6Ika9oy/CLCPfJzVJvf2jI70EU5BlEHWDZXMSJKw7FDdgSqwhaQXg== dependencies: "@cloudflare/kv-asset-handler" "^0.2.0" + "@cspotcode/source-map-support" "0.8.1" "@esbuild-plugins/node-globals-polyfill" "^0.2.3" "@esbuild-plugins/node-modules-polyfill" "^0.2.2" blake3-wasm "^2.1.5" @@ -2388,7 +2925,6 @@ wrangler@^3.7.0: resolve.exports "^2.0.2" selfsigned "^2.0.1" source-map "0.6.1" - source-map-support "0.5.21" xxhash-wasm "^1.0.1" optionalDependencies: fsevents "~2.3.2"