Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
538 changes: 538 additions & 0 deletions backend/INTEGRATION_GUIDE.md

Large diffs are not rendered by default.

269 changes: 269 additions & 0 deletions backend/QUICK_REFERENCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,269 @@
# Runtime Contract Validation - Quick Reference

## TL;DR - The Essentials

### ✓ What's Implemented

- **Strict validation** for all request DTOs
- **Unknown field rejection** with whitelisting
- **Correlation ID tracking** for request tracing
- **Backward compatibility** via decorators
- **Comprehensive logging** of validation failures
- **Monitoring via** ContractValidationService

### Files Created

| File | Purpose |
|------|---------|
| `src/common/pipes/strict-validation.pipe.ts` | Custom validation pipe |
| `src/common/services/contract-validation.service.ts` | Validation failure tracking |
| `src/common/decorators/allow-backward-compatibility.decorator.ts` | Field name mapping |
| `src/common/decorators/disable-strict-validation.decorator.ts` | Disable strict mode |
| `src/common/pipes/strict-validation.pipe.spec.ts` | Unit tests |
| `src/common/services/contract-validation.service.spec.ts` | Service tests |
| `src/common/pipes/strict-validation.integration.spec.ts` | Integration tests |
| `src/common/RUNTIME_CONTRACT_VALIDATION.md` | Full documentation |

### Updated Files

| File | Changes |
|------|---------|
| `src/common/common.module.ts` | Added ContractValidationService |
| `src/main.ts` | Added imports |

## Common Tasks

### Add Validation to a DTO

```typescript
import { IsString, IsEmail, MinLength, MaxLength, IsOptional } from 'class-validator';

export class CreateUserDto {
@IsEmail()
email: string;

@IsString()
@MinLength(8)
@MaxLength(256)
password: string;

@IsOptional()
@IsString()
@MaxLength(100)
name?: string;
}
```

### Enable Backward Compatibility

```typescript
import { AllowBackwardCompatibility } from '../decorators/allow-backward-compatibility.decorator';

@Put('users/:id')
@AllowBackwardCompatibility({
'fullName': 'name',
'userBio': 'bio'
})
async updateUser(@Body() dto: UpdateUserDto) { }
```

### Disable Strict Validation (when needed)

```typescript
import { DisableStrictValidation } from '../decorators/disable-strict-validation.decorator';

@Post('avatar/upload')
@DisableStrictValidation()
async uploadAvatar(@Body() dto: FileUploadDto) { }
```

### Access Validation Metrics

```typescript
constructor(private contractValidationService: ContractValidationService) {}

getMetrics() {
return this.contractValidationService.getFailureStatistics();
// Returns: { totalFailures, failuresByReason, failuresByEndpoint, uniqueCorrelationIds }
}
```

### Get Recent Failures

```typescript
const failures = this.contractValidationService.getFailureRecords({
endpoint: 'POST /users',
limit: 50
});
```

### Debug a Request

```typescript
// Using correlation ID from request/response header
const requestFailures = this.contractValidationService.getFailureByCorrelationId(
'req_1234567890_abc123'
);
```

## Error Response Format

```json
{
"statusCode": 400,
"message": "Validation failed",
"errors": [
{
"field": "email",
"constraints": {
"isEmail": "email must be an email"
}
}
],
"correlationId": "req_1234567890_abc123",
"timestamp": "2026-06-30T12:34:56.789Z",
"path": "/api/v2/users"
}
```

## Common Validators

```typescript
// Type validators
@IsString()
@IsNumber()
@IsBoolean()
@IsArray()
@IsObject()
@IsEmail()
@IsUUID()
@IsISO8601()

// Length validators
@MinLength(n)
@MaxLength(n)
@Length(min, max)

// Numeric validators
@Min(n)
@Max(n)
@IsNegative()
@IsPositive()

// Array validators
@ArrayMinSize(n)
@ArrayMaxSize(n)
@ArrayContains(value)

// Combined usage
@IsArray()
@ArrayMinSize(1)
@IsString({ each: true })
tags: string[];
```

## Testing Validation

```bash
# Run validation tests
npm test -- strict-validation

# With coverage
npm test -- --coverage strict-validation

# Integration tests
npm test -- strict-validation.integration
```

## Troubleshooting

### Issue: Valid request rejected

**Check**: Are all DTO decorators correct?
- Optional fields must have `@IsOptional()`
- Check decorator names and parameters
- Verify min/max constraints

### Issue: Unknown fields not rejected

**Check**:
- Is `forbidNonWhitelisted: true` in ValidationPipe?
- Is `whitelist: true` configured?
- Is @DisableStrictValidation applied?

### Issue: Correlation ID missing

**Check**:
- Is CorrelationIdMiddleware registered?
- Is middleware applied to all routes?
- Check request headers for X-Correlation-ID

### Issue: Custom validator not working

**Check**:
- Is validator imported and used correctly?
- Are all dependencies installed?
- Check validator implementation

## Headers and Context

### Request Headers

```
X-Correlation-ID: req_1234567890_abc123
X-Request-ID: req_1234567890_abc123
Correlation-ID: req_1234567890_abc123
```

### Response Headers

```
X-Correlation-ID: req_1234567890_abc123
Content-Type: application/json
```

## Key Concepts

| Concept | Meaning |
|---------|---------|
| **Strict Validation** | All fields validated, extra fields rejected |
| **Whitelist** | Only declared fields accepted |
| **Forbid Non-Whitelisted** | Extra fields cause validation error |
| **Transformation** | String trimming, type conversions |
| **Correlation ID** | Unique identifier for request tracing |
| **Backward Compatibility** | Support deprecated field names temporarily |
| **Grace Period** | Time allowed for clients to migrate |

## Performance Impact

- **Validation overhead**: < 1ms per request
- **Memory usage**: ~5-10MB for 10K failure records
- **No database impact**: All in-memory

## Best Practices

✓ Always use proper DTO decorators
✓ Include boundary constraints (min/max)
✓ Mark optional fields with @IsOptional()
✓ Provide clear error messages
✓ Test validation in integration tests
✓ Monitor validation failures
✓ Use correlation IDs for debugging
✓ Document backward compatibility timelines

## Documentation Links

- Full Guide: [RUNTIME_CONTRACT_VALIDATION.md](./src/common/RUNTIME_CONTRACT_VALIDATION.md)
- Integration: [INTEGRATION_GUIDE.md](./INTEGRATION_GUIDE.md)
- Summary: [RUNTIME_CONTRACT_VALIDATION_SUMMARY.md](./RUNTIME_CONTRACT_VALIDATION_SUMMARY.md)

## Support Resources

1. **Tests**: See `strict-validation.pipe.spec.ts` for examples
2. **Integration Tests**: See `strict-validation.integration.spec.ts`
3. **Full Docs**: Read `RUNTIME_CONTRACT_VALIDATION.md`
4. **Code**: Check implementations in `src/common/`

---

**Quick Reference Complete** - More details in main documentation
Loading
Loading