Ilya
80c019b791
CI / test (push) Successful in 27s
Build and Deploy / build-and-deploy (push) Successful in 33s
feat(lessons): уроки + видео (MinIO stream-proxy)
storage/minio.go:
- New() толерантен к пустым creds → Configured()=false, видео-фичи
отдают 503; остальное работает.
- GenerateKey/PutObject/Stat/GetObject(Range)/Delete + ParseRange/
WriteRangeResponse helpers. По паттерну telephony record stream.
- EnsureBucket — best-effort при старте сервиса.
LessonRepository:
- ListByCourse / Get / Create / Update / Delete (возвращает старый
video_key для MinIO-cleanup) / ReorderInCourse через UNNEST.
- SetVideo — отдельный helper для post-upload UPDATE с возвратом
старого key (чтобы handler удалил предыдущее видео при замене).
LessonHandler:
- CRUD с проверкой owner курса (authorizeCourseOwner-helper).
- Reorder батч.
- UploadVideo: multipart "video" + duration_sec из формы.
PutObject в MinIO → SetVideo в БД. При ошибке UPDATE откатываем
объект из MinIO (PutObject + revert). Старый video_key удаляется
best-effort.
- StreamVideo: Range-aware прокси по паттерну telephony.
Content-Disposition: inline + nodownload-заголовки. Гейтит
is_published || owner. MinIO URL клиенту не светится.
- DeleteVideo: чистит video_key + объект из MinIO.
main.go: 8 новых routes (CRUD + reorder + upload + stream + delete).
Storage инициализируется один раз; ENV-fallback логирует «disabled».
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 23:58:05 +03:00
..
2026-05-25 22:43:37 +03:00
2026-05-25 23:58:05 +03:00
2026-05-25 22:43:37 +03:00
2026-05-25 22:43:37 +03:00
2026-05-25 23:58:05 +03:00
2026-05-25 23:58:05 +03:00