6.0 KiB
6.0 KiB
Intervention with All Data - Implementation Summary
Overview
Created a comprehensive createInterventionalldata method in the InterventionController that handles creating an intervention along with all related entities (deceased, client, contact, location, documents) in a single atomic transaction.
Files Created/Modified
1. Form Request
File: app/Http/Requests/StoreInterventionWithAllDataRequest.php
- Comprehensive validation for all entities
- Step-level error grouping (deceased, client, contact, location, documents, intervention)
- French error messages
- File validation for document uploads
2. Controller Method
File: app/Http/Controllers/Api/InterventionController.php
- Added
createInterventionalldata()method - Database transaction wrapping all operations
- Step-by-step creation flow:
- Create deceased
- Create client
- Create contact (if provided)
- Prepare location data
- Create intervention
- Handle document uploads
- Automatic rollback on any error
- Comprehensive logging
3. API Route
File: routes/api.php
- Added endpoint:
POST /api/interventions/with-all-data - Protected by authentication middleware
4. Repository Improvements
Files:
app/Repositories/DeceasedRepositoryInterface.php(created)app/Repositories/DeceasedRepository.php(updated)
Changes:
- DeceasedRepository now extends BaseRepository
- Implements BaseRepositoryInterface
- Inherits transaction support from BaseRepository
- Consistent with other repository implementations
API Endpoint
POST /api/interventions/with-all-data
Request Structure:
{
"deceased": {
"last_name": "Required",
"first_name": "Optional",
"birth_date": "Optional",
"death_date": "Optional",
"place_of_death": "Optional",
"notes": "Optional"
},
"client": {
"name": "Required",
"vat_number": "Optional",
"siret": "Optional",
"email": "Optional",
"phone": "Optional",
"billing_address_line1": "Optional",
"billing_postal_code": "Optional",
"billing_city": "Optional",
"billing_country_code": "Optional",
"notes": "Optional",
"is_active": "Optional"
},
"contact": {
"first_name": "Optional",
"last_name": "Optional",
"email": "Optional",
"phone": "Optional",
"role": "Optional"
},
"location": {
"name": "Optional",
"address": "Optional",
"city": "Optional",
"postal_code": "Optional",
"country_code": "Optional",
"access_instructions": "Optional",
"notes": "Optional"
},
"documents": [
{
"file": "File upload",
"name": "Required",
"description": "Optional"
}
],
"intervention": {
"type": "Required",
"scheduled_at": "Optional",
"duration_min": "Optional",
"status": "Optional",
"assigned_practitioner_id": "Optional",
"order_giver": "Optional",
"notes": "Optional",
"created_by": "Optional"
}
}
Success Response (201):
{
"message": "Intervention créée avec succès",
"data": {
"intervention": { ... },
"deceased": { ... },
"client": { ... },
"contact_id": 123,
"documents_count": 2
}
}
Error Response (422 - Validation):
{
"message": "Données invalides",
"errors": {
"deceased": ["Le nom de famille est obligatoire."],
"client": ["Le nom du client est obligatoire."],
"intervention": ["Le type d'intervention est obligatoire."]
}
}
Transaction Flow
DB::beginTransaction()
1. Create Deceased
2. Create Client
3. Create Contact (if provided)
4. Prepare Location Notes
5. Create Intervention
6. Handle Document Uploads (pending implementation)
DB::commit()
Error Handling
Validation Errors
- Caught separately with proper HTTP status (422)
- Grouped by step for better UX
- French error messages
General Errors
- Caught with proper HTTP status (500)
- Full exception logged with trace
- Input data logged (excluding files)
- Transaction automatically rolled back
Data Integrity
- BaseRepository Transaction Support: All repository create operations use transactions
- Controller-level Transaction: Main transaction wraps all operations
- Automatic Rollback: Any exception triggers automatic rollback
- Validation Before Transaction: All data validated before any DB operations
Benefits
- Atomicity: All-or-nothing operation - prevents partial data creation
- Data Integrity: No orphaned records if any step fails
- Performance: Single HTTP request for complex operation
- User Experience: One form instead of multiple steps
- Validation: Comprehensive client and server-side validation
- Logging: Full audit trail for debugging
Next Steps
- Document Upload Implementation: Complete file upload and storage logic
- Location Model: Consider creating a proper Location model instead of notes
- Client Location Association: Link interventions to actual locations
- File Storage: Implement proper file storage with intervention folders
- Email Notifications: Add notifications to relevant parties
- Audit Trail: Add more detailed logging for compliance
Testing
To test the endpoint:
# Create intervention with all data
curl -X POST http://localhost/api/interventions/with-all-data \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d @intervention-data.json
Notes
- All date fields should use ISO format (Y-m-d H:i:s)
- Document files should be sent as multipart/form-data
- Location data is currently appended to intervention notes (can be enhanced)
- Contact creation is optional - only created if data provided
- Default status is "demande" if not specified