Add private health tracker (owner-only)
- health schema: vaccinations, body_measurements, workouts, nutrition_daily, sleep (generated hours), medications, hair_progress, appointments - migration with updated_at triggers; grants to personal_app only - /trackers/health overview with add/edit/delete, owner-gated (404 otherwise), noindex + private no-store, hidden from listings for non-owners - owner-only JSON/CSV import endpoint and scripts/health-import.ts
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import type { Handle } from '@sveltejs/kit/hooks';
|
||||
import { building } from '$app/env';
|
||||
import { auth } from '#lib/server/auth.js';
|
||||
import { isOwner, isOwnerOnlyPath } from '#lib/server/owner.js';
|
||||
import { error } from '@sveltejs/kit';
|
||||
|
||||
export const handle: Handle = async ({ event, resolve }) => {
|
||||
// Match the endpoint path here: the dev proxy may terminate HTTPS before Vite.
|
||||
@@ -9,5 +11,22 @@ export const handle: Handle = async ({ event, resolve }) => {
|
||||
const session = building ? null : await auth.api.getSession({ headers: event.request.headers });
|
||||
event.locals.user = session?.user ?? null;
|
||||
event.locals.session = session?.session ?? null;
|
||||
return resolve(event);
|
||||
// Owner-only areas (health tracker). Page loads, __data.json and the import endpoint
|
||||
// 404 for non-owners in the route itself (layout load / endpoint), which renders the
|
||||
// same 404 page as an unknown URL. As a backstop, any other method (form actions,
|
||||
// which skip layout loads) is refused here before a route runs.
|
||||
const ownerOnly = isOwnerOnlyPath(event.url.pathname);
|
||||
if (
|
||||
ownerOnly &&
|
||||
!isOwner(event) &&
|
||||
event.request.method !== 'GET' &&
|
||||
event.request.method !== 'HEAD'
|
||||
)
|
||||
error(404, 'Not Found');
|
||||
const response = await resolve(event);
|
||||
if (ownerOnly) {
|
||||
response.headers.set('x-robots-tag', 'noindex, nofollow, noarchive');
|
||||
response.headers.set('cache-control', 'private, no-store');
|
||||
}
|
||||
return response;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user