armature-framework 0.2.2

A modern, type-safe HTTP framework for Rust inspired by Angular and NestJS. Features dependency injection, decorators, middleware, authentication (JWT/OAuth2/SAML), validation, OpenAPI/Swagger, caching, job queues, and observability.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
## GraphQL Configuration and Documentation

Armature's GraphQL module provides comprehensive configuration options for controlling playgrounds, documentation endpoints, and schema introspection.

---

## Table of Contents

- [Configuration]#configuration
- [GraphQL Config Options]#graphql-config-options
- [Development vs Production]#development-vs-production
- [Schema Documentation]#schema-documentation
- [Playground Options]#playground-options
- [Security Considerations]#security-considerations
- [Examples]#examples

---

## Configuration

### Basic Configuration

```rust
use armature_graphql::GraphQLConfig;

// Default configuration (playgrounds enabled)
let config = GraphQLConfig::new("/graphql");

// Development configuration (all features enabled)
let config = GraphQLConfig::development("/graphql");

// Production configuration (playgrounds disabled)
let config = GraphQLConfig::production("/graphql");
```

---

## GraphQL Config Options

### Available Options

```rust
pub struct GraphQLConfig {
    /// GraphQL endpoint path
    pub endpoint: String,

    /// Enable GraphQL Playground (interactive GraphQL IDE)
    pub enable_playground: bool,

    /// Playground endpoint path (if enabled)
    pub playground_endpoint: String,

    /// Enable GraphiQL (lighter alternative to Playground)
    pub enable_graphiql: bool,

    /// GraphiQL endpoint path (if enabled)
    pub graphiql_endpoint: String,

    /// Enable schema documentation endpoint
    pub enable_schema_docs: bool,

    /// Schema documentation endpoint path
    pub schema_docs_endpoint: String,

    /// Enable introspection queries (required for playgrounds and docs)
    pub enable_introspection: bool,

    /// Maximum query depth (0 = unlimited)
    pub max_depth: usize,

    /// Maximum query complexity (0 = unlimited)
    pub max_complexity: usize,

    /// Enable query validation
    pub enable_validation: bool,

    /// Enable Apollo Tracing
    pub enable_tracing: bool,
}
```

### Builder Pattern

```rust
let config = GraphQLConfig::new("/api/graphql")
    .with_playground(true)
    .with_graphiql(false)
    .with_schema_docs(true)
    .with_introspection(true)
    .with_max_depth(10)
    .with_max_complexity(100)
    .with_validation(true)
    .with_tracing(false);
```

---

## Development vs Production

### Development Configuration

Enable all features for the best developer experience:

```rust
let config = GraphQLConfig::development("/graphql");

// Equivalent to:
let config = GraphQLConfig::new("/graphql")
    .with_playground(true)
    .with_graphiql(true)
    .with_schema_docs(true)
    .with_introspection(true)
    .with_tracing(true);
```

**Features enabled:**
- ✅ GraphQL Playground
- ✅ GraphiQL
- ✅ Schema documentation
- ✅ Introspection queries
- ✅ Apollo tracing

### Production Configuration

Disable playgrounds and introspection for security:

```rust
let config = GraphQLConfig::production("/graphql");

// Equivalent to:
let config = GraphQLConfig::new("/graphql")
    .with_playground(false)
    .with_graphiql(false)
    .with_schema_docs(false)
    .with_introspection(false);
```

**Features disabled:**
- ❌ GraphQL Playground
- ❌ GraphiQL
- ❌ Schema documentation (can be enabled separately)
- ❌ Introspection queries

---

## Schema Documentation

### Documentation Endpoint

Armature generates beautiful, interactive schema documentation:

```rust
use armature_graphql::{generate_schema_docs_html, Schema};

let html = generate_schema_docs_html(
    &schema,
    "/graphql",      // GraphQL endpoint
    "My API"         // API title
);
```

### Features of Schema Documentation

1. **Interactive Schema Viewer**
   - Browse types, queries, mutations, subscriptions
   - Syntax highlighting for SDL
   - Copy schema to clipboard

2. **Getting Started Guide**
   - API endpoint information
   - Example queries
   - Integration instructions

3. **Example Queries**
   - Introspection queries
   - Type information queries
   - Common patterns

4. **Beautiful UI**
   - Modern, responsive design
   - Tabbed interface
   - Professional styling

### Accessing Documentation

Once enabled, access documentation at:
- **Schema Docs**: `http://localhost:3000/graphql/schema`
- **SDL Download**: `http://localhost:3000/graphql/schema.graphql`

---

## Playground Options

### GraphQL Playground

Full-featured GraphQL IDE with:
- Query editor with syntax highlighting
- Variable editor
- Response viewer
- Schema documentation sidebar
- Query history
- Multiple tabs

```rust
// Enable Playground
let config = GraphQLConfig::new("/graphql")
    .with_playground(true)
    .with_playground_endpoint("/graphql/playground");
```

**Access at**: `http://localhost:3000/graphql/playground`

### GraphiQL

Lighter alternative with:
- Query editor
- Variable support
- Schema explorer
- Query execution
- Faster load times

```rust
// Enable GraphiQL
let config = GraphQLConfig::new("/graphql")
    .with_graphiql(true)
    .with_graphiql_endpoint("/graphql/graphiql");
```

**Access at**: `http://localhost:3000/graphql/graphiql`

### Disabling Playgrounds

For production environments:

```rust
let config = GraphQLConfig::production("/graphql");
// Playgrounds are disabled by default
```

Or selectively disable:

```rust
let config = GraphQLConfig::new("/graphql")
    .with_playground(false)
    .with_graphiql(false);
```

---

## Security Considerations

### Introspection Queries

Introspection allows clients to query the GraphQL schema structure. While useful for development, it can expose your API structure in production.

**Recommendation**: Disable introspection in production:

```rust
let config = if cfg!(debug_assertions) {
    GraphQLConfig::development("/graphql")
} else {
    GraphQLConfig::production("/graphql")
};
```

### Query Complexity Limits

Prevent abuse with complexity limits:

```rust
let config = GraphQLConfig::new("/graphql")
    .with_max_depth(10)          // Limit query depth
    .with_max_complexity(100);   // Limit overall complexity
```

### Playground Access Control

Implement authentication for playgrounds in production:

```rust
#[get("/playground")]
async fn playground(&self, req: HttpRequest) -> Result<HttpResponse, Error> {
    // Check authentication
    if !is_authenticated(&req) {
        return Err(Error::Unauthorized);
    }

    // Only allow in development or for authorized users
    if !cfg!(debug_assertions) && !is_admin(&req) {
        return Err(Error::Forbidden);
    }

    Ok(/* playground HTML */)
}
```

---

## Examples

### Example 1: Development Setup

```rust
use armature_graphql::GraphQLConfig;

let config = GraphQLConfig::development("/graphql");

// All features enabled for development
assert!(config.enable_playground);
assert!(config.enable_graphiql);
assert!(config.enable_schema_docs);
assert!(config.enable_introspection);
```

### Example 2: Production Setup

```rust
let config = GraphQLConfig::production("/graphql");

// Playgrounds disabled for security
assert!(!config.enable_playground);
assert!(!config.enable_graphiql);
assert!(!config.enable_introspection);
```

### Example 3: Custom Configuration

```rust
let config = GraphQLConfig::new("/api/v1/graphql")
    .with_playground(false)           // Disable Playground
    .with_graphiql(true)              // Enable GraphiQL
    .with_schema_docs(true)           // Enable documentation
    .with_introspection(true)         // Enable introspection
    .with_max_depth(15)               // Limit depth
    .with_max_complexity(200)         // Limit complexity
    .with_tracing(false);             // Disable tracing
```

### Example 4: Environment-Based Configuration

```rust
use std::env;

let config = match env::var("ENV").unwrap_or_default().as_str() {
    "production" => GraphQLConfig::production("/graphql"),
    "staging" => GraphQLConfig::new("/graphql")
        .with_playground(true)
        .with_introspection(true)
        .with_schema_docs(false),
    _ => GraphQLConfig::development("/graphql"),
};
```

### Example 5: Full Controller Implementation

```rust
use armature_framework::prelude::*;
use armature_graphql::*;

#[controller("/graphql")]
struct GraphQLController {
    schema: Schema<Query, Mutation, Subscription>,
    config: GraphQLConfig,
}

impl GraphQLController {
    #[post("/")]
    async fn execute(&self, req: HttpRequest) -> Result<HttpResponse, Error> {
        // Execute GraphQL query
        // ...
    }

    #[get("/playground")]
    async fn playground(&self, _req: HttpRequest) -> Result<HttpResponse, Error> {
        if !self.config.enable_playground {
            return Err(Error::NotFound);
        }

        let html = graphql_playground_html(&self.config.endpoint);
        Ok(HttpResponse::ok()
            .with_header("Content-Type", "text/html")
            .with_body(html.into_bytes()))
    }

    #[get("/schema")]
    async fn schema_docs(&self, _req: HttpRequest) -> Result<HttpResponse, Error> {
        if !self.config.enable_schema_docs {
            return Err(Error::NotFound);
        }

        let html = generate_schema_docs_html(&self.schema, &self.config.endpoint, "My API");
        Ok(HttpResponse::ok()
            .with_header("Content-Type", "text/html")
            .with_body(html.into_bytes()))
    }
}
```

---

## Best Practices

1. **Use Environment-Based Config**
   - Development: All features enabled
   - Staging: Selective features
   - Production: Minimal features

2. **Protect Sensitive Endpoints**
   - Add authentication to playgrounds
   - Use rate limiting
   - Monitor access logs

3. **Enable Documentation Selectively**
   - Public APIs: Enable schema docs
   - Internal APIs: Disable in production
   - Authenticated APIs: Require auth

4. **Set Complexity Limits**
   - Prevent denial-of-service attacks
   - Limit query depth
   - Monitor query complexity

5. **Use HTTPS in Production**
   - Encrypt GraphQL traffic
   - Protect sensitive data
   - Enable CORS appropriately

---

## Summary

Armature's GraphQL configuration provides:

✅ **Flexible playground options** (Playground, GraphiQL)
✅ **Interactive schema documentation**
✅ **Development vs production configurations**
✅ **Security controls** (introspection, complexity limits)
✅ **Customizable endpoints**
✅ **Easy integration** with Armature framework

For complete examples, see:
- `examples/graphql_with_docs.rs`
- `examples/graphql_api.rs`
- `examples/graphql_programmatic.rs`