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