Initial commit: Family Planner application
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>
This commit is contained in:
142
docs/data-contracts.md
Normal file
142
docs/data-contracts.md
Normal file
@@ -0,0 +1,142 @@
|
||||
# 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"}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user