Skip to main content

GraphQL Extensions

Extend the LusterCMS GraphQL API with your plugin.

Registering Types

# resolvers.py
import strawberry
from core.api.schema_registry import register_type

@strawberry.type
class MyPluginItem:
id: str
name: str
value: int

register_type(MyPluginItem)

Adding Queries

@strawberry.type
class MyPluginQuery:
@strawberry.field
def my_plugin_items(self) -> List[MyPluginItem]:
return get_items()

@strawberry.field
def my_plugin_item(self, id: str) -> MyPluginItem:
return get_item(id)

# Register with schema
from core.api.schema_registry import register_query_extension
register_query_extension(MyPluginQuery)

Adding Mutations

@strawberry.type
class MyPluginMutation:
@strawberry.mutation
def create_my_plugin_item(
self,
name: str,
value: int
) -> MyPluginItem:
return create_item(name, value)

from core.api.schema_registry import register_mutation_extension
register_mutation_extension(MyPluginMutation)

Input Types

@strawberry.input
class CreateItemInput:
name: str
value: int = 0

@strawberry.mutation
def create_item(self, input: CreateItemInput) -> MyPluginItem:
return create_item(**input.__dict__)

Authentication

from core.auth.decorators import require_auth, require_permission

@strawberry.type
class MyPluginQuery:
@strawberry.field
@require_auth
def protected_items(self, info) -> List[MyPluginItem]:
user = info.context.user
return get_items_for_user(user.id)

@strawberry.field
@require_permission("my_plugin.admin")
def admin_items(self) -> List[MyPluginItem]:
return get_all_items()

Namespacing

Prefix your types and fields to avoid collisions:

  • MyPluginItem not Item
  • myPluginItems not items
  • createMyPluginItem not createItem