Complete family planning application with: - React frontend with TypeScript - Node.js/Express backend with TypeScript - Python ingestion service for document processing - Planning ingestion service with LLM integration - Shared UI components and type definitions - OAuth integration for calendar synchronization - Comprehensive documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
143 lines
2.3 KiB
Markdown
143 lines
2.3 KiB
Markdown
# Data contracts
|
|
|
|
## API payloads
|
|
|
|
### POST `/api/children`
|
|
|
|
```json
|
|
{
|
|
"fullName": "Alice Durand",
|
|
"colorHex": "#FF7F50",
|
|
"birthDate": "2016-09-12",
|
|
"notes": "Allergie aux arachides"
|
|
}
|
|
```
|
|
|
|
**Response**
|
|
|
|
```json
|
|
{
|
|
"id": "ch_001",
|
|
"fullName": "Alice Durand",
|
|
"colorHex": "#FF7F50",
|
|
"birthDate": "2016-09-12",
|
|
"notes": "Allergie aux arachides",
|
|
"createdAt": "2025-10-11T08:00:00Z"
|
|
}
|
|
```
|
|
|
|
### POST `/api/children/{id}/schedules`
|
|
|
|
Multipart upload (`file`, `metadata`).
|
|
|
|
`metadata` example:
|
|
|
|
```json
|
|
{
|
|
"periodStart": "2025-10-13",
|
|
"periodEnd": "2025-10-19",
|
|
"tags": ["ecole", "sport"]
|
|
}
|
|
```
|
|
|
|
**Response**
|
|
|
|
```json
|
|
{
|
|
"scheduleId": "sc_101",
|
|
"status": "processing",
|
|
"childId": "ch_001"
|
|
}
|
|
```
|
|
|
|
### GET `/api/children/{id}/schedules/{scheduleId}`
|
|
|
|
```json
|
|
{
|
|
"id": "sc_101",
|
|
"childId": "ch_001",
|
|
"periodStart": "2025-10-13",
|
|
"periodEnd": "2025-10-19",
|
|
"activities": [
|
|
{
|
|
"id": "ac_500",
|
|
"title": "Piscine",
|
|
"category": "sport",
|
|
"startDateTime": "2025-10-14T17:00:00Z",
|
|
"endDateTime": "2025-10-14T18:00:00Z",
|
|
"location": "Centre aquatique",
|
|
"reminders": [
|
|
{
|
|
"id": "re_910",
|
|
"offsetMinutes": 120,
|
|
"channel": "push"
|
|
}
|
|
],
|
|
"metadata": {
|
|
"bring": "maillot, bonnet"
|
|
}
|
|
}
|
|
],
|
|
"sourceFileUrl": "https://storage/planning.pdf",
|
|
"status": "ready"
|
|
}
|
|
```
|
|
|
|
## Ingestion contract
|
|
|
|
### Request
|
|
|
|
```json
|
|
{
|
|
"scheduleId": "sc_101",
|
|
"childId": "ch_001",
|
|
"filePath": "s3://bucket/planning.pdf",
|
|
"options": {
|
|
"language": "fr",
|
|
"timezone": "Europe/Paris"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Response
|
|
|
|
```json
|
|
{
|
|
"scheduleId": "sc_101",
|
|
"status": "completed",
|
|
"activities": [
|
|
{
|
|
"title": "Gym",
|
|
"startDate": "2025-10-15",
|
|
"startTime": "17:30",
|
|
"endTime": "18:30",
|
|
"category": "sport",
|
|
"confidence": 0.88,
|
|
"reminders": [
|
|
{"offsetMinutes": 60, "channel": "push"}
|
|
],
|
|
"notes": "Tenue sportive + bouteille d eau"
|
|
}
|
|
],
|
|
"warnings": [
|
|
"Could not detect teacher name"
|
|
],
|
|
"rawText": "Mardi: Gym 17h30-18h30..."
|
|
}
|
|
```
|
|
|
|
## WebSocket feed (future)
|
|
|
|
```json
|
|
{
|
|
"type": "schedule.updated",
|
|
"payload": {
|
|
"scheduleId": "sc_101",
|
|
"childId": "ch_001",
|
|
"updates": [
|
|
{"activityId": "ac_500", "field": "startDateTime", "value": "2025-10-14T16:50:00Z"}
|
|
]
|
|
}
|
|
}
|
|
```
|