v1.0.61 - Curriculum Delete & Video Not Found Fix
Vastavik Learning v1.0.61 - Release Notes
Welcome to Vastavik Learning v1.0.61! This release fixes the Curriculum Editor delete flow and the “Video not found” error that appeared for every lesson, plus the underlying backend lesson-resolution that was hitting the wrong document.
What's New and Improved
1. Curriculum Editor — Delete for Lessons and Collections
- Per-lesson delete: each lesson row in
String in Java / Functions in Java / Array in Javanow shows a trash button on the right. Tap → confirmDelete lesson "X" from this part?→ optional second confirmAlso delete the linked video file itself?→ the row disappears optimistically, rolls back and shows an alert if the server fails, then refetches. Useshooks/useCourses.ts: add removeLessonFromPart / removePart(optimistic + localStorage +DELETE /admin/courses/{cid}/parts/{pid}/subparts/{sid}?delete_video=true). - Per-collection delete: each part header (
1 String in Java — 4 lessons,2 Functions in Java — 1 lessons,3 Array in Java — 0 lessons) now has Delete Part next to Add Video Lesson (red outline, trash icon). Confirm → deletes the whole part and all its lessons. - Backend: new
DELETE /admin/courses/{courseId}/parts/{partId}/subparts/{subpartId}(cascades nestedlessonssubcollection, optional?delete_video=truefor flatvideos/{id}, theninvalidate_catalog_cache()) andDELETE /admin/courses/{courseId}/parts/{partId}(cascades all subparts + nested lessons) inapp/routers/admin_dashboard.py:1911.
2. “Video not found — pull to refresh Learn and try again” Fixed for Every Lesson
- Root cause:
GET /api/v1/courses/{id}/curriculumreturnslesson_id = subpart.lesson_id or subpart_doc.id. For manually created subparts with nolesson_idfield, the app received the subpart doc ID (e.g.8kdGIQMKX7dCbBv81m1Din your screenshot) as the lesson ID, butdb.get_lesson()only searched flatvideos+collection_group("lessons")— never the subpart itself. - Backend fix:
app/db/firebase.py:472get_lessonnow has step 3 —collection_group("subparts")search: if the subpart doc itself carriesyoutubeUrl/youtubeVideoIdit is returned as a lesson, else its nestedlessonssubcollection is checked (exact id, else first), else the linked flatvideos/{lesson_id}is followed. Addedget_lesson_by_subpart(course, part, subpart)and newGET /api/v1/lessons/by-subpart/{course}/{part}/{subpart}inapp/routers/catalog.py:129that reuses the same premium/normalization path. - App fix:
VideoLessonViewModel.kt:36now triesgetLessonV1(lessonId)(title/desc/whiteboard/code), thengetLessonBySubpart(course, part, subpart)(fixes your “Testing — vid_1789106985472” and all8kd...cases), then legacygetLesson, then one-shotstreamLessons().first()with timeout — never hangs, always clearsisLoadingwith a clear Retry / Back to Learn error instead of a spinner. - If videos still 404 after deploy:
GET /api/v1/health/firestoreon the backend will now reportuse_live_firestore: falsewith an explicit in-memory warning — setFIREBASE_CREDENTIALS_BASE64on Render so uploads persist and are visible to the app's direct Firestore listeners.
3. Version Bump for Hotfix
- App
versionCode 61/versionName 1.0.61(app/build.gradle.kts:21) and CompanionversionCode 28/versionName 1.0.61(companion-codeoss/build.gradle.kts:15).
Release Assets
| Asset | Description | Size |
|---|---|---|
| vastavikLearning-v1.0.61.apk | Main Vastavik Learning Android app (versionCode 61, versionName 1.0.61, minSdk 24, targetSdk 35) | ~59.3 MB |
| vastavik-codeoss-extension.apk | CodeOSS Companion Extension Pack with Monaco/VS Code Web and Ubuntu Terminal (versionCode 28, versionName 1.0.61) | ~13.4 MB |
Upgrade Notes
- Install
vastavikLearning-v1.0.61.apkover your existing build — user data, login session, anduser_profileprefs are preserved. The companion APK is side-by-side. - After upgrading, open Curriculum Editor — every lesson row now has a trash button and every part header has Delete Part. After deleting, pull to refresh Learn (the Refresh button on the Learn row) and the Duolingo path updates instantly.
- If a video still shows “Video not found” after an admin upload, check
GET /api/v1/health/firestoreon the backend — an in-memory warning there means Firestore credentials are missing on Render.
Built with love by the Vastavik Learning Team