fix(learner): narrow lesson target result for the type checker
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
96c147e3a2
commit
478ebeb255
1 file changed
+2
-2
@@ -45,7 +45,7 @@ export function userDataRoutes(ctx: ServerContext): Feature["routes"] {
|
|||||||
if (!b || !STATES.includes(b.state as ProgressState)) return badRequest("state must be not-started, in-progress or done");
|
if (!b || !STATES.includes(b.state as ProgressState)) return badRequest("state must be not-started, in-progress or done");
|
||||||
if (b.positionSeconds !== undefined && (typeof b.positionSeconds !== "number" || !Number.isFinite(b.positionSeconds) || b.positionSeconds < 0)) return badRequest("positionSeconds must be a non-negative number");
|
if (b.positionSeconds !== undefined && (typeof b.positionSeconds !== "number" || !Number.isFinite(b.positionSeconds) || b.positionSeconds < 0)) return badRequest("positionSeconds must be a non-negative number");
|
||||||
const t = await target(user.id, user, courseId, lessonId);
|
const t = await target(user.id, user, courseId, lessonId);
|
||||||
if ("error" in t) return t.error;
|
if (t.error) return t.error;
|
||||||
const prior = t.progress[lessonId];
|
const prior = t.progress[lessonId];
|
||||||
// A position report ("in-progress") never undoes "done"; only an explicit not-started does.
|
// A position report ("in-progress") never undoes "done"; only an explicit not-started does.
|
||||||
const state = prior?.state === "done" && b.state === "in-progress" ? "done" : b.state!;
|
const state = prior?.state === "done" && b.state === "in-progress" ? "done" : b.state!;
|
||||||
@@ -103,7 +103,7 @@ export function userDataRoutes(ctx: ServerContext): Feature["routes"] {
|
|||||||
if (!b || typeof b.code !== "string") return badRequest("code is required");
|
if (!b || typeof b.code !== "string") return badRequest("code is required");
|
||||||
if (b.code.length > MAX_CODE) return badRequest("code is too long");
|
if (b.code.length > MAX_CODE) return badRequest("code is too long");
|
||||||
const t = await target(user.id, user, courseId, lessonId);
|
const t = await target(user.id, user, courseId, lessonId);
|
||||||
if ("error" in t) return t.error;
|
if (t.error) return t.error;
|
||||||
if (t.entry.lesson.type !== "exercise") return badRequest("not an exercise");
|
if (t.entry.lesson.type !== "exercise") return badRequest("not an exercise");
|
||||||
const passed = b.passed === true;
|
const passed = b.passed === true;
|
||||||
await attempts.save({ userId: user.id, courseId, lessonId, track: b.track || "default", code: b.code, result: b.result ?? null, passed, updatedAt: new Date().toISOString() });
|
await attempts.save({ userId: user.id, courseId, lessonId, track: b.track || "default", code: b.code, result: b.result ?? null, passed, updatedAt: new Date().toISOString() });
|
||||||
|
|||||||
Reference in new issue
Block a user