Skip to main content

Listening Test Commands

listening_tests

CommandTS wrapperSignature
get_listening_testsgetListeningTest(id, userId)Promise<ListeningTest | null>
list_listening_testslistListeningTests(userId)Promise<ListeningTest[]>
create_listening_testscreateListeningTest(userId, { title?, difficulty?, duration?, status? })Promise<string>
update_listening_testsupdateListeningTest(id, userId, { title?, difficulty?, duration?, status? })Promise<void>
delete_listening_testsdeleteListeningTest(id, userId)Promise<void>

listening_sections

CommandTS wrapper
list_listening_sectionslistListeningSections(userId)
create_listening_sectionscreateListeningSection(userId, { test_id, section_number?, title?, transcript?, audio_url? })
delete_listening_sectionsdeleteListeningSection(id, userId)

listening_question_groups

CommandTS wrapper
list_listening_question_groupslistListeningQuestionGroups(userId)
create_listening_question_groupscreateListeningQuestionGroup(userId, input) — same shape as createReadingQuestionGroup
delete_listening_question_groupsdeleteListeningQuestionGroup(id, userId)

listening_questions

CommandTS wrapper
list_listening_questionslistListeningQuestions(userId)
create_listening_questionscreateListeningQuestion(userId, input) — same fields as reading questions, plus timestamp?: string (audio cue point)
delete_listening_questionsdeleteListeningQuestion(id, userId)

upload_listening_audio (storage command)

export async function uploadListeningAudio(userId: string, file: File): Promise<string> {
const bytes = Array.from(new Uint8Array(await file.arrayBuffer()));
const path = await invoke<string>("upload_listening_audio", {
userId,
file_name: file.name,
file_data: bytes,
});
return convertFileSrc(path);
}
  • Reads the selected File into a raw byte array client-side.
  • Rust (src/core/src/commands/storage.rs) writes the bytes to the app's local storage directory and returns the on-disk path.
  • The wrapper immediately converts that path to a webview-playable asset:// URL via convertFileSrc before returning it — callers get a ready-to-use URL, not a raw filesystem path. See File System & Native Dialog Integration.

Usage notes: call this once per audio file during admin content creation, then store the returned URL on the corresponding listening_sections.audio_url field via createListeningSection/updateListeningTest-adjacent flows.