(vision) SCS/DDD
This commit is contained in:
@@ -0,0 +1,360 @@
|
||||
# API Documentation - Meldestelle Self-Contained Systems
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides comprehensive documentation for the Meldestelle API Gateway, which aggregates all bounded context APIs into a unified interface while maintaining the independence of each context.
|
||||
|
||||
## Features Implemented
|
||||
|
||||
### ✅ OpenAPI/Swagger Integration
|
||||
- **OpenAPI 3.0 specification** generation
|
||||
- **Swagger UI** interactive documentation
|
||||
- **Automatic API documentation** from code annotations
|
||||
- **Multiple server environments** (development, production)
|
||||
|
||||
### ✅ Postman Collections
|
||||
- **Comprehensive API collection** covering all endpoints
|
||||
- **Environment variables** for easy configuration
|
||||
- **Authentication token management** with automatic token extraction
|
||||
- **Pre-configured request examples** for all endpoints
|
||||
|
||||
### ✅ API Tests
|
||||
- **Integration tests** for all major endpoints
|
||||
- **Authentication flow testing**
|
||||
- **CRUD operation validation**
|
||||
- **Error handling verification**
|
||||
|
||||
## API Structure
|
||||
|
||||
The API Gateway aggregates the following bounded contexts:
|
||||
|
||||
### 1. System Information
|
||||
- `GET /` - API Gateway information
|
||||
- `GET /health` - Health check for all contexts
|
||||
- `GET /api` - API documentation overview
|
||||
- `GET /swagger` - Interactive Swagger UI
|
||||
|
||||
### 2. Authentication Context (`/auth/*`)
|
||||
- `POST /auth/register` - User registration
|
||||
- `POST /auth/login` - User authentication
|
||||
- `GET /auth/profile` - Get user profile
|
||||
- `PUT /auth/profile` - Update user profile
|
||||
- `POST /auth/change-password` - Change password
|
||||
|
||||
### 3. Master Data Context (`/api/masterdata/*`)
|
||||
- `GET /api/masterdata/countries` - Get all countries
|
||||
- `GET /api/masterdata/countries/active` - Get active countries
|
||||
- `GET /api/masterdata/countries/{id}` - Get country by ID
|
||||
- `GET /api/masterdata/countries/iso/{code}` - Get country by ISO code
|
||||
- `POST /api/masterdata/countries` - Create country
|
||||
- `PUT /api/masterdata/countries/{id}` - Update country
|
||||
- `DELETE /api/masterdata/countries/{id}` - Delete country
|
||||
|
||||
### 4. Horse Registry Context (`/api/horses/*`)
|
||||
- `GET /api/horses` - Get all horses
|
||||
- `GET /api/horses/active` - Get active horses
|
||||
- `GET /api/horses/{id}` - Get horse by ID
|
||||
- `GET /api/horses/search` - Search horses by name
|
||||
- `GET /api/horses/owner/{ownerId}` - Get horses by owner
|
||||
- `POST /api/horses` - Create horse
|
||||
- `PUT /api/horses/{id}` - Update horse
|
||||
- `DELETE /api/horses/{id}` - Delete horse
|
||||
- `DELETE /api/horses/batch` - Batch delete horses
|
||||
- `GET /api/horses/stats` - Get horse statistics
|
||||
|
||||
## Getting Started
|
||||
|
||||
### 1. Start the API Gateway
|
||||
|
||||
```bash
|
||||
# Navigate to the project root
|
||||
cd /path/to/meldestelle
|
||||
|
||||
# Run the API Gateway
|
||||
./gradlew :api-gateway:run
|
||||
```
|
||||
|
||||
The API will be available at `http://localhost:8080`
|
||||
|
||||
### 2. Access Swagger UI
|
||||
|
||||
Open your browser and navigate to:
|
||||
```
|
||||
http://localhost:8080/swagger
|
||||
```
|
||||
|
||||
This provides an interactive interface to explore and test all API endpoints.
|
||||
|
||||
### 3. Use Postman Collection
|
||||
|
||||
1. Import the Postman collection from `docs/postman/Meldestelle_API_Collection.json`
|
||||
2. Set the `baseUrl` variable to `http://localhost:8080`
|
||||
3. Start with the "System Information" folder to verify the API is running
|
||||
4. Use the "Authentication Context" to get an auth token
|
||||
5. The token will be automatically saved and used for authenticated endpoints
|
||||
|
||||
## Authentication
|
||||
|
||||
The API uses JWT (JSON Web Token) based authentication:
|
||||
|
||||
1. **Register** a new user via `POST /auth/register`
|
||||
2. **Login** with credentials via `POST /auth/login`
|
||||
3. **Extract the JWT token** from the login response
|
||||
4. **Include the token** in the `Authorization` header: `Bearer <token>`
|
||||
|
||||
### Example Authentication Flow
|
||||
|
||||
```bash
|
||||
# 1. Register a new user
|
||||
curl -X POST http://localhost:8080/auth/register \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"email": "test@example.com",
|
||||
"password": "SecurePassword123!",
|
||||
"firstName": "Test",
|
||||
"lastName": "User",
|
||||
"phoneNumber": "+43123456789"
|
||||
}'
|
||||
|
||||
# 2. Login to get token
|
||||
curl -X POST http://localhost:8080/auth/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"email": "test@example.com",
|
||||
"password": "SecurePassword123!"
|
||||
}'
|
||||
|
||||
# 3. Use token for authenticated requests
|
||||
curl -X GET http://localhost:8080/api/horses \
|
||||
-H "Authorization: Bearer <your-jwt-token>"
|
||||
```
|
||||
|
||||
## Response Format
|
||||
|
||||
All API responses follow a consistent format using the `BaseDto` wrapper:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"example": "Actual response data goes here"
|
||||
},
|
||||
"message": "Operation completed successfully",
|
||||
"timestamp": "2024-01-15T10:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
### Error Response Format
|
||||
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"data": null,
|
||||
"message": "Error description",
|
||||
"errors": [
|
||||
{
|
||||
"field": "email",
|
||||
"message": "Invalid email format"
|
||||
}
|
||||
],
|
||||
"timestamp": "2024-01-15T10:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### Running API Tests
|
||||
|
||||
```bash
|
||||
# Run all API Gateway tests
|
||||
./gradlew :api-gateway:test
|
||||
|
||||
# Run specific test class
|
||||
./gradlew :api-gateway:test --tests "ApiIntegrationTest"
|
||||
|
||||
# Run with verbose output
|
||||
./gradlew :api-gateway:test --info
|
||||
```
|
||||
|
||||
### Test Coverage
|
||||
|
||||
The test suite covers:
|
||||
- ✅ API Gateway information endpoints
|
||||
- ✅ Health check functionality
|
||||
- ✅ OpenAPI/Swagger integration
|
||||
- ✅ Authentication endpoints structure
|
||||
- ✅ Master data CRUD operations
|
||||
- ✅ Horse registry endpoints
|
||||
- ✅ Error handling and validation
|
||||
- ✅ CORS configuration
|
||||
- ✅ Content negotiation
|
||||
|
||||
## Development
|
||||
|
||||
### Adding New Endpoints
|
||||
|
||||
1. **Create the endpoint** in the appropriate controller
|
||||
2. **Add route configuration** in `RoutingConfig.kt`
|
||||
3. **Update Postman collection** with new requests
|
||||
4. **Add integration tests** for the new functionality
|
||||
5. **Update this documentation**
|
||||
|
||||
### OpenAPI Annotations
|
||||
|
||||
Use OpenAPI annotations to enhance documentation:
|
||||
|
||||
```kotlin
|
||||
@OpenAPITag(name = "Horses", description = "Horse registry operations")
|
||||
fun Route.horseRoutes() {
|
||||
route("/api/horses") {
|
||||
@OpenAPIResponse("200", [OpenAPIContent(HorseDto::class)])
|
||||
@OpenAPIResponse("404", [OpenAPIContent(ErrorDto::class)])
|
||||
get {
|
||||
// Implementation
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
| Variable | Description | Default |
|
||||
|----------|-------------|---------|
|
||||
| `SERVER_PORT` | API Gateway port | `8080` |
|
||||
| `DATABASE_URL` | Database connection URL | `jdbc:h2:mem:test` |
|
||||
| `JWT_SECRET` | JWT signing secret | Generated |
|
||||
| `CORS_ORIGINS` | Allowed CORS origins | `*` |
|
||||
|
||||
### Application Configuration
|
||||
|
||||
The API Gateway can be configured via `application.conf`:
|
||||
|
||||
```hocon
|
||||
ktor {
|
||||
application {
|
||||
modules = [ at.mocode.gateway.ApplicationKt.module ]
|
||||
}
|
||||
|
||||
deployment {
|
||||
port = 8080
|
||||
port = ${?SERVER_PORT}
|
||||
}
|
||||
}
|
||||
|
||||
database {
|
||||
url = "jdbc:h2:mem:test"
|
||||
url = ${?DATABASE_URL}
|
||||
user = "sa"
|
||||
password = ""
|
||||
}
|
||||
```
|
||||
|
||||
## Monitoring and Logging
|
||||
|
||||
### Health Checks
|
||||
|
||||
The `/health` endpoint provides status information for all bounded contexts:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"status": "UP",
|
||||
"contexts": {
|
||||
"authentication": "UP",
|
||||
"master-data": "UP",
|
||||
"horse-registry": "UP"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Logging
|
||||
|
||||
The API Gateway uses structured logging with the following levels:
|
||||
- `ERROR` - System errors and exceptions
|
||||
- `WARN` - Business logic warnings
|
||||
- `INFO` - Request/response logging
|
||||
- `DEBUG` - Detailed debugging information
|
||||
|
||||
## Security
|
||||
|
||||
### Authentication & Authorization
|
||||
|
||||
- **JWT-based authentication** for stateless security
|
||||
- **Role-based access control** (RBAC) for fine-grained permissions
|
||||
- **Password hashing** using bcrypt
|
||||
- **Token expiration** and refresh mechanisms
|
||||
|
||||
### CORS Configuration
|
||||
|
||||
Cross-Origin Resource Sharing (CORS) is configured to allow:
|
||||
- **Specific origins** for production environments
|
||||
- **All HTTP methods** (GET, POST, PUT, DELETE, OPTIONS)
|
||||
- **Custom headers** including Authorization
|
||||
|
||||
### Input Validation
|
||||
|
||||
All API endpoints implement:
|
||||
- **Request body validation** using Kotlin serialization
|
||||
- **Parameter validation** for path and query parameters
|
||||
- **Business rule validation** in use case layers
|
||||
- **SQL injection prevention** through parameterized queries
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **Port already in use**
|
||||
```bash
|
||||
# Check what's using port 8080
|
||||
lsof -i :8080
|
||||
# Kill the process or use a different port
|
||||
SERVER_PORT=8081 ./gradlew :api-gateway:run
|
||||
```
|
||||
|
||||
2. **Database connection issues**
|
||||
```bash
|
||||
# Check database configuration
|
||||
# Verify connection string and credentials
|
||||
# Ensure database server is running
|
||||
```
|
||||
|
||||
3. **Authentication failures**
|
||||
```bash
|
||||
# Verify JWT token is valid and not expired
|
||||
# Check Authorization header format: "Bearer <token>"
|
||||
# Ensure user has required permissions
|
||||
```
|
||||
|
||||
### Debug Mode
|
||||
|
||||
Enable debug logging for troubleshooting:
|
||||
|
||||
```bash
|
||||
# Run with debug logging
|
||||
./gradlew :api-gateway:run --debug
|
||||
|
||||
# Or set log level in application.conf
|
||||
logger.level = DEBUG
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
When contributing to the API:
|
||||
|
||||
1. **Follow REST conventions** for endpoint design
|
||||
2. **Maintain backward compatibility** when possible
|
||||
3. **Update documentation** for any API changes
|
||||
4. **Add comprehensive tests** for new functionality
|
||||
5. **Use consistent error handling** patterns
|
||||
|
||||
## Support
|
||||
|
||||
For API support and questions:
|
||||
- **Documentation**: This file and Swagger UI
|
||||
- **Issues**: Create GitHub issues for bugs
|
||||
- **Testing**: Use Postman collection for manual testing
|
||||
- **Monitoring**: Check `/health` endpoint for system status
|
||||
Reference in New Issue
Block a user