# Live: Add Feed - URL preview/sync + CSV upload (Local Demo Co) **When:** 2026-08-04 **Tenant:** Local Demo Co (`ee246275-dec0-4446-9e83-58d0c16c258a`) **API:** http://127.0.0.1:8080 **Web:** http://127.0.0.1:5174 **Auth:** `Authorization: Bearer dk_demo_local_descrybe_test_key_v1` ## Verdict **PASS** (real HTTP against Local Demo Co; worker running). No fake passes. | Flow | Result | |------|--------| | URL create -> extract-schema (preview) -> map -> sync -> sample process | PASS | | CSV multipart create -> extract-schema -> map -> sync -> sample process | PASS | | Sync before mappings | **400** `no field mappings defined for feed` (expected) | ## Correct order ``` Add Feed (URL or CSV file) -> status = unmapped -> POST .../extract-schema (preview fields) -> PUT .../mappings (status -> mapped; sets options.item_path for XML) -> POST .../sync (raw_products) -> POST .../sync-process-sample (or POST /api/v1/process) ``` Do **not** sync before mappings. FTP/FTPS supplier URLs still return 400 (`ftp/ftps feed sync is not supported yet`). ## Fixes applied during this live run 1. **New feeds start as `unmapped`** (`Create` INSERT in `internal/feeds/service.go`) so Sync stays gated until mapping; PUT mappings flips `unmapped` -> `mapped`. 2. **Feeds UI** (`apps/web/src/routes/feeds/+page.svelte`): after create, navigate to `/feeds/{id}/mapping`; block Sync when status is `unmapped`; sync toast no longer says "Next: map fields" after a successful sync. ## Evidence - URL (HTTPS Enim sample) | Step | HTTP | Notes | |------|------|-------| | `POST /api/v1/feeds` JSON | 201 | Feed `453f6efa-...` (Live URL Test); Enim XML URL | | `POST .../extract-schema` | 200 | 17 fields, `item_path=Export/Item`, preview present | | Sync without map | 400 | `no field mappings defined for feed` | | `PUT .../mappings` | 200 | name/brand/gtin/... | | `POST .../sync` | 202 | **34** products synced, job `completed` | | `POST .../sync-process-sample` (`limit:3`, `skip_sync:true`, `normalize`) | 202 | job `ae90ffc4-...` -> **completed** | ## Evidence - CSV upload | Step | HTTP | Notes | |------|------|-------| | `POST /api/v1/feeds` multipart (`name`, `feed_type=csv`, `file`) | 201 | Feed `8d1d9e53-...`; `options.source_path` + `source_kind=csv` | | `POST .../extract-schema` | 200 | 7 fields (EAN, Title, ...); preview = CSV head | | `PUT .../mappings` | 200 | gtin/name/description/brand/price/stock/main_image | | `POST .../sync` | 202 | **3** products synced | | Sample process | 202 -> completed | job `53fede44-...`; all 3 raw -> `processed`; 3 processed products (quality grade C) | ## Retest after fix (CSV) | Step | Result | |------|--------| | Create | 201, **status=`unmapped`** (`474f5343-...`) | | Sync early | 400 mappings required | | Map | status -> **`mapped`** | | Sync | 202, 1 product | | Sample process | job completed | ## Copy/paste ```powershell $H = @{ Authorization = "Bearer dk_demo_local_descrybe_test_key_v1"; "Content-Type" = "application/json" } $base = "http://127.0.0.1:8080/api/v1" # URL create Invoke-RestMethod -Method POST -Uri "$base/feeds" -Headers $H -Body (@{ name = "My URL feed"; url = "https://www.enim.si/xml/A11109019400_nov/A1nov.xml" feed_type = "xml"; sync_interval_minutes = 1440 } | ConvertTo-Json) # CSV create (curl multipart preferred on Windows) # curl -H "Authorization: Bearer dk_demo_local_descrybe_test_key_v1" ` # -F "name=My CSV feed" -F "feed_type=csv" -F "file=@sample.csv;type=text/csv" ` # http://127.0.0.1:8080/api/v1/feeds # Preview / map / sync / sample (replace FEED_ID) Invoke-RestMethod -Method POST -Uri "$base/feeds/FEED_ID/extract-schema" -Headers $H -Body "{}" # PUT mappings via --data-binary @file.json to avoid PowerShell quote mangling, then: Invoke-RestMethod -Method POST -Uri "$base/feeds/FEED_ID/sync" -Headers $H -Body "{}" Invoke-RestMethod -Method POST -Uri "$base/feeds/FEED_ID/sync-process-sample" -Headers $H -Body (@{ limit = 3; skip_sync = $true; processing_type = "normalize" } | ConvertTo-Json) ``` Worker required: `scripts/run-api.ps1 worker` (or `bin/worker.exe`). ## Related - [e2e-feeds-process-export.md](e2e-feeds-process-export.md) - map -> process -> export on existing demo feeds - [qa-local-demo.md](qa-local-demo.md) - Local Demo Co checklist - [demo-user.md](demo-user.md) - credentials