Files
homepage/src/routes/api/fitness/measurements/+server.ts
T
Alexander 98c67070f6 perf: parallelize DB queries across routes, clean up fitness UI
Parallelize sequential DB queries in 11 API routes and page loaders
using Promise.all — measurements/latest, stats/overview, goal streak,
exercises, sessions, task stats, monthly expenses, icon page, offline-db.

Move calorie tracking out of /fitness/measure (now under /fitness/nutrition
only). Remove fade-in entrance animations from nutrition page.

Progressive streak computation: scan 3 months first, widen only if needed.

Bump versions to 1.1.1 / 0.2.1.
2026-04-06 13:12:29 +02:00

53 lines
1.6 KiB
TypeScript

import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { requireAuth } from '$lib/server/middleware/auth';
import { dbConnect } from '$utils/db';
import { BodyMeasurement } from '$models/BodyMeasurement';
export const GET: RequestHandler = async ({ url, locals }) => {
const user = await requireAuth(locals);
await dbConnect();
const limit = parseInt(url.searchParams.get('limit') || '50');
const offset = parseInt(url.searchParams.get('offset') || '0');
const from = url.searchParams.get('from');
const to = url.searchParams.get('to');
const query: Record<string, unknown> = { createdBy: user.nickname };
if (from || to) {
const dateFilter: Record<string, Date> = {};
if (from) dateFilter.$gte = new Date(from);
if (to) dateFilter.$lte = new Date(to);
query.date = dateFilter;
}
const [measurements, total] = await Promise.all([
BodyMeasurement.find(query).sort({ date: -1 }).skip(offset).limit(limit).lean(),
BodyMeasurement.countDocuments(query)
]);
return json({ measurements, total, limit, offset });
};
export const POST: RequestHandler = async ({ request, locals }) => {
const user = await requireAuth(locals);
await dbConnect();
const data = await request.json();
const { date, weight, bodyFatPercent, caloricIntake, measurements, notes } = data;
const measurement = new BodyMeasurement({
date: date ? new Date(date) : new Date(),
weight,
bodyFatPercent,
caloricIntake,
measurements,
notes,
createdBy: user.nickname
});
await measurement.save();
return json({ measurement }, { status: 201 });
};