0
# Relay Support
1
2
Implementation of Relay specifications including connections, global object identification, and pagination.
3
4
## Capabilities
5
6
### Relay Types
7
8
```python { .api }
9
class RelayObjectType(ObjectType):
10
"""Object type with Relay connection support."""
11
12
class RelayQueryType(QueryType):
13
"""Query type with Relay node interface support."""
14
15
class RelayNodeInterfaceType(InterfaceType):
16
"""Relay Node interface implementation."""
17
```
18
19
### Relay Connections
20
21
```python { .api }
22
class RelayConnection:
23
"""Implementation of Relay connection specification."""
24
25
def __init__(
26
self,
27
edges: list,
28
page_info: dict,
29
total_count: Optional[int] = None
30
): ...
31
32
class ConnectionArguments:
33
"""Arguments for Relay connections."""
34
first: Optional[int]
35
after: Optional[str]
36
last: Optional[int]
37
before: Optional[str]
38
```
39
40
### Global ID Utilities
41
42
```python { .api }
43
def encode_global_id(type_name: str, node_id: str) -> str:
44
"""Encode global ID for Relay."""
45
46
def decode_global_id(global_id: str) -> tuple[str, str]:
47
"""Decode global ID from Relay, returns (type_name, node_id)."""
48
```
49
50
### Types
51
52
```python { .api }
53
ConnectionResolver = Callable
54
GlobalIDTuple = tuple[str, str]
55
```
56
57
## Usage Examples
58
59
```python
60
from ariadne.contrib.relay import (
61
RelayQueryType, RelayConnection, encode_global_id, decode_global_id
62
)
63
64
query = RelayQueryType()
65
66
@query.field("node")
67
def resolve_node(_, info, id):
68
type_name, node_id = decode_global_id(id)
69
if type_name == "User":
70
return get_user(node_id)
71
return None
72
73
# Connection resolver
74
@query.field("users")
75
def resolve_users_connection(_, info, first=None, after=None):
76
users = get_users(first=first, after=after)
77
return RelayConnection(
78
edges=[{"node": user, "cursor": encode_cursor(user.id)} for user in users],
79
page_info={"hasNextPage": True, "hasPreviousPage": False}
80
)
81
```