feat: add student learning flow pages

This commit is contained in:
Codex
2026-06-29 13:03:02 +08:00
parent 1bd608f134
commit 2776ce12a5
23 changed files with 681 additions and 18 deletions

View File

@@ -2,6 +2,15 @@ import type { RequestContext } from '../../core/http.js';
import { query } from '../../core/db.js';
import { intParam, tenantIdFrom } from '../../core/request.js';
function stringArrayParam(ctx: RequestContext, name: string, max = 200) {
const repeated = ctx.url.searchParams.getAll(name);
const csv = ctx.url.searchParams.get(name);
const values = [...repeated, ...(csv ? csv.split(',') : [])]
.map(value => value.trim())
.filter(Boolean);
return [...new Set(values)].slice(0, max);
}
function dateOnly(value: unknown) {
if (!value) return null;
if (value instanceof Date && !Number.isNaN(value.getTime())) return value.toISOString().slice(0, 10);
@@ -245,10 +254,15 @@ export async function questionsRoute(ctx: RequestContext) {
const entryId = ctx.url.searchParams.get('entryId');
const contentNodeId = ctx.url.searchParams.get('contentNodeId');
const collectionId = ctx.url.searchParams.get('collectionId');
const questionIds = stringArrayParam(ctx, 'questionIds', 300);
const limit = intParam(ctx, 'limit', 200, 500);
const params: unknown[] = [tenantId];
const filters = ['q.tenant_id = $1', `q.status = 'published'`];
if (questionIds.length) {
params.push(questionIds);
filters.push(`q.id = any($${params.length}::uuid[])`);
}
if (subjectId) {
params.push(subjectId);
filters.push(`q.subject_id = $${params.length}`);