fix: resolve frontend/backend integration bugs

- Rename skincare route prefix /skin-snapshots → /skincare to match API client
- Add redirect_slashes=False to FastAPI app; change collection routes from "/" to ""
  to eliminate 307 redirects on POST/GET without trailing slash
- Fix redirect() inside try/catch in products/new and routines/new server actions
  (SvelteKit redirect() throws and was being caught as a 500 error)
- Eagerly load inventory and steps relationships via explicit SELECT + model_dump(mode="json"),
  working around SQLModel 0.0.37 not serializing Relationship fields in response_model
- Add field_validator for product_effect_profile to coerce DB-returned dict → ProductEffectProfile,
  eliminating Pydantic serializer warning
- Update all tests to use routes without trailing slash

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Piotr Oleszczyk 2026-02-26 21:53:17 +01:00
parent 8d4f9d1fc6
commit 9bf94a979c
11 changed files with 85 additions and 68 deletions

View file

@ -26,8 +26,9 @@ export const actions: Actions = {
.map((t) => t.trim())
.filter(Boolean) ?? [];
let product;
try {
const product = await createProduct({
product = await createProduct({
name,
brand,
category,
@ -36,9 +37,9 @@ export const actions: Actions = {
leave_on,
targets
});
redirect(303, `/products/${product.id}`);
} catch (e) {
return fail(500, { error: (e as Error).message });
}
redirect(303, `/products/${product.id}`);
}
};

View file

@ -17,11 +17,12 @@ export const actions: Actions = {
return fail(400, { error: 'Date and AM/PM are required' });
}
let routine;
try {
const routine = await createRoutine({ routine_date, part_of_day, notes: notes || undefined });
redirect(303, `/routines/${routine.id}`);
routine = await createRoutine({ routine_date, part_of_day, notes: notes || undefined });
} catch (e) {
return fail(500, { error: (e as Error).message });
}
redirect(303, `/routines/${routine.id}`);
}
};