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:
MyPluginItemnotItemmyPluginItemsnotitemscreateMyPluginItemnotcreateItem