Files
michaelschiemer/docs/graphql-examples.md
Michael Schiemer 55a330b223 Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
2025-08-11 20:13:26 +02:00

387 lines
7.6 KiB
Markdown

# GraphQL Examples
This framework includes a basic GraphQL implementation with Query and Mutation support.
## GraphQL Endpoints
- **POST /graphql** - GraphQL endpoint for queries and mutations
- **GET /graphql** - GraphQL Playground (interactive editor)
- **GET /graphql/schema** - View schema definition
## Schema Definition
The current schema includes:
```graphql
type User {
id: ID!
name: String!
email: String!
age: Int
active: Boolean!
created_at: String!
}
input UserInput {
name: String!
email: String!
age: Int
active: Boolean
}
type UserStats {
total: Int!
active: Int!
inactive: Int!
average_age: Float!
}
type Query {
users(active: Boolean, limit: Int): [User!]!
user(id: ID!): User
userStats: UserStats!
}
type Mutation {
createUser(input: UserInput!): User!
updateUser(id: ID!, input: UserInput!): User
deleteUser(id: ID!): Boolean!
}
```
## Query Examples
### Get All Users
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "query { users { id name email active } }"
}'
```
Response:
```json
{
"data": {
"users": [
{
"id": "1",
"name": "John Doe",
"email": "john@example.com",
"active": true
},
{
"id": "2",
"name": "Jane Smith",
"email": "jane@example.com",
"active": true
},
{
"id": "3",
"name": "Bob Wilson",
"email": "bob@example.com",
"active": false
}
]
}
}
```
### Get Active Users Only
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "query { users(active: true) { id name email } }"
}'
```
### Get Limited Number of Users
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "query { users(limit: 2) { id name email } }"
}'
```
### Get Single User by ID
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "query { user(id: \"1\") { id name email age active created_at } }"
}'
```
Response:
```json
{
"data": {
"user": {
"id": "1",
"name": "John Doe",
"email": "john@example.com",
"age": 30,
"active": true,
"created_at": "2024-01-01T00:00:00Z"
}
}
}
```
### Get User Statistics
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "query { userStats { total active inactive average_age } }"
}'
```
Response:
```json
{
"data": {
"userStats": {
"total": 3,
"active": 2,
"inactive": 1,
"average_age": 30.0
}
}
}
```
## Mutation Examples
### Create New User
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "mutation { createUser(input: { name: \"Alice Johnson\", email: \"alice@example.com\", age: 28, active: true }) { id name email age active created_at } }"
}'
```
Response:
```json
{
"data": {
"createUser": {
"id": "4",
"name": "Alice Johnson",
"email": "alice@example.com",
"age": 28,
"active": true,
"created_at": "2024-08-08T10:30:00Z"
}
}
}
```
### Update Existing User
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "mutation { updateUser(id: \"1\", input: { name: \"John Smith\", age: 31 }) { id name email age } }"
}'
```
Response:
```json
{
"data": {
"updateUser": {
"id": "1",
"name": "John Smith",
"email": "john@example.com",
"age": 31
}
}
}
```
### Delete User
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "mutation { deleteUser(id: \"3\") }"
}'
```
Response:
```json
{
"data": {
"deleteUser": true
}
}
```
## Using Variables
### Query with Variables
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "query GetUser($userId: ID!) { user(id: $userId) { id name email } }",
"variables": { "userId": "1" }
}'
```
### Mutation with Variables
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "mutation CreateUser($input: UserInput!) { createUser(input: $input) { id name email } }",
"variables": {
"input": {
"name": "Charlie Brown",
"email": "charlie@example.com",
"age": 22,
"active": true
}
}
}'
```
## Complex Queries
### Multiple Queries in One Request
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "query { users(active: true) { id name email } userStats { total active } }"
}'
```
Response:
```json
{
"data": {
"users": [
{
"id": "1",
"name": "John Doe",
"email": "john@example.com"
},
{
"id": "2",
"name": "Jane Smith",
"email": "jane@example.com"
}
],
"userStats": {
"total": 3,
"active": 2
}
}
}
```
### Using Aliases
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "query { activeUsers: users(active: true) { id name } inactiveUsers: users(active: false) { id name } }"
}'
```
## Error Handling
### Invalid Query
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "query { nonexistentField }"
}'
```
Response:
```json
{
"errors": [
{
"message": "Query field 'nonexistentField' not found",
"extensions": {
"code": "VAL_BUSINESS_RULE_VIOLATION"
}
}
]
}
```
### User Not Found
```bash
curl -X POST https://localhost/graphql \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
-d '{
"query": "query { user(id: \"999\") { id name } }"
}'
```
Response:
```json
{
"data": {
"user": null
}
}
```
## GraphQL Playground
Visit https://localhost/graphql in your browser to access the interactive GraphQL Playground:
- **Query Editor**: Write and test GraphQL queries
- **Variables Panel**: Define query variables
- **Results Panel**: View query results
- **Schema Explorer**: Browse available types and fields
- **Execute Button**: Run queries with Ctrl+Enter
## Best Practices
1. **Use Field Selection**: Only request fields you need
2. **Use Variables**: For dynamic queries and better caching
3. **Handle Errors**: Always check for errors in responses
4. **Batch Operations**: Combine multiple queries when possible
5. **Type Safety**: Use proper types in mutations
6. **Validation**: Validate input data before mutations
7. **Caching**: Consider caching strategies for queries