Report Boycott Company
Method
POST multipart/form-data
Auth
JWT (user)
Stores
Turso (reports), R2 (image)
Response
{ report, user }
| Component | v3 |
|---|---|
| Entry endpoint | n/a |
| Primary store | Directus (source data) |
| Image storage | R2 (via v2 utilities) |
| Auth | x-api-key for admin tools |
System Context
Sequence
Quickstart (v3)
- cURL
- JavaScript
curl -X POST \
-H "Authorization: Bearer <JWT>" \
-F "productName=Organic tea" \
-F "barcode=4800361005500" \
-F "proof=https://example.com/article" \
-F "categories=food,beverage" \
-F "regions=1,2" \
-F "productImage=@/path/to/photo.jpg" \
https://api.example.com/v3/users/<device_id>/report/boycott
const form = new FormData();
form.set('productName', 'Organic tea');
form.set('barcode', '4800361005500');
form.set('proof', 'https://example.com/article');
form.set('categories', 'food,beverage');
form.set('regions', '1,2');
// form.set('productImage', file);
const res = await fetch(`https://api.example.com/v3/users/${deviceId}/report/boycott`, {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
body: form,
});
const data = await res.json();
Differences (v2 vs v3)
- v2: no user-facing report endpoint in this worker; images can be copied via v2 utilities; data originates in Directus.
- v3: full report flow with validation, image upload to R2, Turso persistence, and
report + updated userresponse.
See also
- API reference: submitReportV3
- Data model: Turso Entities
Code references
- Service:
src/services/boycottReport.service.ts(createBoycottReport) - Schema:
src/schemas/report.schema.ts(BoycottReportFormSchema, InsertSchema) - Route:
src/routes/users.ts(POST report handler) - Utils:
src/utils/generic.ts(generateIdfor image key)