From cce1bcaf232a537e95f95c179f8253805ebe1a01 Mon Sep 17 00:00:00 2001 From: guru_sainath Date: Tue, 11 Feb 2025 13:39:38 +0530 Subject: [PATCH] [MOBIL-707] chore: update instance version details and enforce minimum supported backend version (#2414) * chore: current instance query and updated the min self hosted version * chore: typo and handled version data optional --- apiserver/plane/graphql/queries/instance.py | 29 +++++++++++++++++++ .../plane/graphql/queries/version_check.py | 3 ++ apiserver/plane/graphql/schema.py | 2 ++ apiserver/plane/graphql/types/instance.py | 12 ++++++++ .../plane/graphql/types/version_check.py | 10 +++++-- apiserver/plane/graphql/views.py | 3 +- 6 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 apiserver/plane/graphql/queries/instance.py create mode 100644 apiserver/plane/graphql/types/instance.py diff --git a/apiserver/plane/graphql/queries/instance.py b/apiserver/plane/graphql/queries/instance.py new file mode 100644 index 0000000000..78e31a31e6 --- /dev/null +++ b/apiserver/plane/graphql/queries/instance.py @@ -0,0 +1,29 @@ +# Third-Party Imports +import strawberry + +# Python Standard Library Imports +from asgiref.sync import sync_to_async + +# Strawberry Imports +from strawberry.types import Info +from strawberry.exceptions import GraphQLError + +# Module Imports +from plane.graphql.permissions.public import public_query +from plane.graphql.types.instance import InstanceType +from plane.license.models import Instance + + +@strawberry.type +class InstanceQuery: + @strawberry.field + @public_query() + async def instance(self, info: Info) -> InstanceType: + instance = await sync_to_async(Instance.objects.first)() + + if not instance: + message = "Instance not found" + error_extensions = {"code": "INSTANCE_NOT_FOUND", "statusCode": 404} + raise GraphQLError(message, extensions=error_extensions) + + return instance diff --git a/apiserver/plane/graphql/queries/version_check.py b/apiserver/plane/graphql/queries/version_check.py index 51771da1bd..480206a233 100644 --- a/apiserver/plane/graphql/queries/version_check.py +++ b/apiserver/plane/graphql/queries/version_check.py @@ -44,4 +44,7 @@ class VersionCheckQuery: min_supported_version=version_details["min_supported_version"], url=version_details["url"], force_update=version_details["force_update"], + min_supported_backend_version=version_details[ + "min_backend_supported_version" + ], ) diff --git a/apiserver/plane/graphql/schema.py b/apiserver/plane/graphql/schema.py index 731b29ce15..a9518a24ee 100644 --- a/apiserver/plane/graphql/schema.py +++ b/apiserver/plane/graphql/schema.py @@ -53,6 +53,7 @@ from .queries.feature_flag import FeatureFlagQuery from .queries.version_check import VersionCheckQuery from .queries.timezone import TimezoneListQuery from .queries.asset import WorkspaceAssetQuery, ProjectAssetQuery +from .queries.instance import InstanceQuery # mutations from .mutations.workspace import WorkspaceMutation, WorkspaceInviteMutation @@ -151,6 +152,7 @@ class Query( TimezoneListQuery, WorkspaceAssetQuery, ProjectAssetQuery, + InstanceQuery, ): pass diff --git a/apiserver/plane/graphql/types/instance.py b/apiserver/plane/graphql/types/instance.py new file mode 100644 index 0000000000..b43df2014b --- /dev/null +++ b/apiserver/plane/graphql/types/instance.py @@ -0,0 +1,12 @@ +# Strawberry imports +import strawberry_django + +# Module Imports +from plane.license.models import Instance + + +@strawberry_django.type(Instance) +class InstanceType: + instance_name: str + current_version: str + latest_version: str diff --git a/apiserver/plane/graphql/types/version_check.py b/apiserver/plane/graphql/types/version_check.py index d514ca0f9e..3304bd0318 100644 --- a/apiserver/plane/graphql/types/version_check.py +++ b/apiserver/plane/graphql/types/version_check.py @@ -1,10 +1,14 @@ +# Python imports +from typing import Optional + # Strawberry imports import strawberry @strawberry.type class VersionCheckType: - version: str - min_supported_version: str - url: str + version: Optional[str] + min_supported_version: Optional[str] + url: Optional[str] force_update: bool + min_supported_backend_version: Optional[str] diff --git a/apiserver/plane/graphql/views.py b/apiserver/plane/graphql/views.py index 3f3f9b464b..2a4f5c335d 100644 --- a/apiserver/plane/graphql/views.py +++ b/apiserver/plane/graphql/views.py @@ -12,7 +12,6 @@ from django.views.decorators.csrf import csrf_exempt from asgiref.sync import sync_to_async from rest_framework_simplejwt.authentication import JWTAuthentication from rest_framework_simplejwt.exceptions import InvalidToken, TokenError -from graphql import parse # Strawberry imports from strawberry.django.views import AsyncGraphQLView @@ -98,7 +97,7 @@ class CustomGraphQLView(AsyncGraphQLView): return None def is_public_operation(self, query_name: str) -> bool: - auth_neglect_list = ["VersionCheckQuery"] + auth_neglect_list = ["VersionCheckQuery", "InstanceQuery"] if query_name in auth_neglect_list: return True