43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
import { createSosSession } from "../../db/sosSession";
|
|
|
|
/** POST /api/sos/session — speichert kompletten SOS-Verlauf für DiGA-Auswertung */
|
|
export default defineEventHandler(async (event) => {
|
|
const user = await requireUser(event);
|
|
const body = await readBody(event);
|
|
|
|
if (!body || !Array.isArray(body.messages)) {
|
|
throw createError({ statusCode: 400, message: "messages required" });
|
|
}
|
|
|
|
// Hard limit gegen Spam: max 200 messages, max 1MB body
|
|
const messages = body.messages.slice(0, 200);
|
|
|
|
const rating =
|
|
typeof body.feedbackRating === "number"
|
|
? Math.max(1, Math.min(5, Math.floor(body.feedbackRating)))
|
|
: null;
|
|
|
|
const session = await createSosSession(user.id, {
|
|
startedAt: body.startedAt,
|
|
endedAt: body.endedAt ?? new Date(),
|
|
durationSec: typeof body.durationSec === "number" ? body.durationSec : null,
|
|
messages,
|
|
gamesPlayed: Array.isArray(body.gamesPlayed)
|
|
? body.gamesPlayed.slice(0, 20)
|
|
: [],
|
|
breathingCount:
|
|
typeof body.breathingCount === "number" ? body.breathingCount : 0,
|
|
wasOvercome: !!body.wasOvercome,
|
|
feedbackBetter:
|
|
typeof body.feedbackBetter === "boolean" ? body.feedbackBetter : null,
|
|
feedbackRating: rating,
|
|
feedbackText:
|
|
typeof body.feedbackText === "string"
|
|
? body.feedbackText.slice(0, 1000)
|
|
: null,
|
|
locale: typeof body.locale === "string" ? body.locale.slice(0, 10) : null,
|
|
});
|
|
|
|
return { id: session.id };
|
|
});
|