Skip to content

Feat/media storage s3 - #28

Merged
ASSONDJI merged 2 commits into
mainfrom
feat/media-storage-s3
Jul 13, 2026
Merged

Feat/media storage s3#28
ASSONDJI merged 2 commits into
mainfrom
feat/media-storage-s3

Conversation

@ASSONDJI

@ASSONDJI ASSONDJI commented Jul 13, 2026

Copy link
Copy Markdown
Owner

feat(mobile): file de requeue des erreurs + ecran de fin de lecon

  • QuizScreen : les questions ratees sont remises a la fin de la file
    plutot que definitivement passees (modele Duolingo) -- corrige un bug
    potentiel ou une lecon ne pouvait jamais se terminer via cet ecran,
    puisque le backend exige desormais qu'une question ait au moins une
    tentative correcte avant completion
  • LessonCompleteScreen : affiche l'XP gagne (diff avant/apres), le niveau
    et le streak, avec un court polling pour laisser le temps a l'evenement
    RabbitMQ asynchrone d'etre traite cote recommendation-service
  • lastKnownProgressionSnapshotProvider : capture la progression avant
    d'entrer dans une lecon pour permettre ce calcul de diff
  • Corrige la navigation du bouton Continuer (retournait a la racine au
    lieu de la liste des lecons de la langue en cours)

feat(content-service): stockage S3 (Supabase Storage) pour audio/images

  • MediaStorageService : upload vers un bucket S3-compatible (AWS SDK v2,
    fonctionne avec n'importe quel provider S3-compatible -- Supabase ici,
    gratuit sans carte bancaire requise, contrairement a Cloudflare R2)
  • S3Config/S3Properties : endpoint, credentials et bucket lus depuis des
    variables d'environnement (SUPABASE_S3_*), jamais commitees
  • Nouveaux endpoints POST /words/{wordId}/audio et /words/{wordId}/image
    (multipart/form-data), mettent a jour Word.audioUrl/imageUrl avec l'URL
    publique retournee par Supabase
  • Migration V3 : ajoute image_url a la table words
  • Teste de bout en bout : upload d'un vrai fichier audio Yemba (dataset
    YembaTones) via l'API Gateway, URL publique confirmee accessible (200,
    232 Ko) sans authentification -- debloque a la fois l'audio Yemba et
    les futures illustrations generees par API

Summary by CodeRabbit

  • New Features

    • Added audio and image upload support for vocabulary words.
    • Word details now include an illustration URL when available.
    • Added adaptive quiz progression that revisits incorrectly answered questions.
    • Added a lesson completion screen showing earned XP, level, and streak.
    • Quiz completion now returns learners to the relevant lessons.
  • Bug Fixes

    • Improved quiz navigation and lesson context handling.
    • Added safer progression tracking while transitioning into quizzes.

ASSONDJI added 2 commits July 13, 2026 03:48
- QuizScreen : les questions ratees sont remises a la fin de la file
  plutot que definitivement passees (modele Duolingo) -- corrige un bug
  potentiel ou une lecon ne pouvait jamais se terminer via cet ecran,
  puisque le backend exige desormais qu'une question ait au moins une
  tentative correcte avant completion
- LessonCompleteScreen : affiche l'XP gagne (diff avant/apres), le niveau
  et le streak, avec un court polling pour laisser le temps a l'evenement
  RabbitMQ asynchrone d'etre traite cote recommendation-service
- lastKnownProgressionSnapshotProvider : capture la progression avant
  d'entrer dans une lecon pour permettre ce calcul de diff
- Corrige la navigation du bouton Continuer (retournait a la racine au
  lieu de la liste des lecons de la langue en cours)
- MediaStorageService : upload vers un bucket S3-compatible (AWS SDK v2,
  fonctionne avec n'importe quel provider S3-compatible -- Supabase ici,
  gratuit sans carte bancaire requise, contrairement a Cloudflare R2)
- S3Config/S3Properties : endpoint, credentials et bucket lus depuis des
  variables d'environnement (SUPABASE_S3_*), jamais commitees
- Nouveaux endpoints POST /words/{wordId}/audio et /words/{wordId}/image
  (multipart/form-data), mettent a jour Word.audioUrl/imageUrl avec l'URL
  publique retournee par Supabase
- Migration V3 : ajoute image_url a la table words
- Teste de bout en bout : upload d'un vrai fichier audio Yemba (dataset
  YembaTones) via l'API Gateway, URL publique confirmee accessible (200,
  232 Ko) sans authentification -- debloque a la fois l'audio Yemba et
  les futures illustrations generees par API
@ASSONDJI ASSONDJI self-assigned this Jul 13, 2026
@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6390b0d3-7d77-4736-8b5e-f7c39e369bbd

📥 Commits

Reviewing files that changed from the base of the PR and between c6e4329 and e1126f0.

📒 Files selected for processing (16)
  • mobile/lib/core/router/app_router.dart
  • mobile/lib/features/gamification/presentation/gamification_providers.dart
  • mobile/lib/features/lessons/presentation/lessons_screen.dart
  • mobile/lib/features/quiz/presentation/lesson_complete_screen.dart
  • mobile/lib/features/quiz/presentation/quiz_screen.dart
  • services/content-service/pom.xml
  • services/content-service/src/main/java/cm/afrilingua/content/ContentServiceApplication.java
  • services/content-service/src/main/java/cm/afrilingua/content/config/S3Config.java
  • services/content-service/src/main/java/cm/afrilingua/content/config/S3Properties.java
  • services/content-service/src/main/java/cm/afrilingua/content/controller/WordController.java
  • services/content-service/src/main/java/cm/afrilingua/content/entity/Word.java
  • services/content-service/src/main/java/cm/afrilingua/content/service/MediaStorageService.java
  • services/content-service/src/main/java/cm/afrilingua/content/service/WordService.java
  • services/content-service/src/main/resources/application.yml
  • services/content-service/src/main/resources/db/migration/V3__add_image_url_to_words.sql
  • services/content-service/src/main/resources/openapi/content-service.yaml

📝 Walkthrough

Walkthrough

The mobile quiz flow now snapshots progression, requeues incorrect questions, and presents completion XP. The content service adds S3-compatible media storage, multipart word upload endpoints, persisted image URLs, and corresponding configuration and API contracts.

Changes

Quiz progression flow

Layer / File(s) Summary
Quiz entry and progression snapshot
mobile/lib/core/router/app_router.dart, mobile/lib/features/gamification/presentation/gamification_providers.dart, mobile/lib/features/lessons/presentation/lessons_screen.dart
Lesson navigation stores progression before opening a quiz and passes the lesson title and language identifier.
Queue-based quiz execution
mobile/lib/features/quiz/presentation/quiz_screen.dart
Quiz questions are managed through a re-queuing flow with updated progress, submission, feedback, and completion handling.
Completion XP resolution
mobile/lib/features/quiz/presentation/lesson_complete_screen.dart
Completion polling computes XP from progression snapshots and provides navigation back to the lessons screen.

Word media upload flow

Layer / File(s) Summary
Media contract and storage configuration
services/content-service/pom.xml, services/content-service/src/main/java/cm/afrilingua/content/config/*, services/content-service/src/main/resources/{application.yml,db/migration/*,openapi/*}, services/content-service/src/main/java/cm/afrilingua/content/entity/Word.java
S3 settings, AWS SDK configuration, database image storage, and multipart API contracts are added.
S3 client and media storage
services/content-service/src/main/java/cm/afrilingua/content/config/S3Config.java, services/content-service/src/main/java/cm/afrilingua/content/service/MediaStorageService.java
An S3 client is configured and media files are uploaded with generated public URLs.
Word upload persistence and API wiring
services/content-service/src/main/java/cm/afrilingua/content/controller/WordController.java, services/content-service/src/main/java/cm/afrilingua/content/service/WordService.java
Audio and image upload endpoints delegate to storage, persist returned URLs, and return updated word DTOs.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant LessonsScreen
  participant GamificationRepository
  participant QuizScreen
  participant LessonCompleteScreen
  LessonsScreen->>GamificationRepository: load progression snapshot
  LessonsScreen->>QuizScreen: open quiz with lesson metadata
  QuizScreen->>QuizScreen: submit and requeue incorrect questions
  QuizScreen->>LessonCompleteScreen: open completion screen
  LessonCompleteScreen->>GamificationRepository: poll updated progression
  GamificationRepository-->>LessonCompleteScreen: progression and XP data
Loading
sequenceDiagram
  participant Client
  participant WordController
  participant WordService
  participant MediaStorageService
  participant S3Client
  Client->>WordController: upload multipart audio or image
  WordController->>WordService: delegate upload
  WordService->>MediaStorageService: store media
  MediaStorageService->>S3Client: putObject
  S3Client-->>MediaStorageService: uploaded object
  MediaStorageService-->>WordService: public URL
  WordService-->>Client: updated Word
Loading

Possibly related PRs

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/media-storage-s3

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ASSONDJI
ASSONDJI merged commit 412337f into main Jul 13, 2026
4 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant