feat(simulations): retourner un sujet aléatoire actif avec la production créée

This commit is contained in:
Hermann_Kitio 2026-04-20 06:01:02 +03:00
parent 0680a6382f
commit b6b8c76cc2
2 changed files with 155 additions and 8 deletions

View file

@ -13,11 +13,23 @@ export interface CreateBody {
contenu?: string
}
export interface SujetData {
id: string
consigne: string
role: string | null
contexte: string | null
doc1_titre: string | null
doc1_texte: string | null
doc2_titre: string | null
doc2_texte: string | null
}
export interface CreateResult {
id: string
tache: Tache
mode: Mode
created_at: string
sujet: SujetData | null
}
type CreateError = {
@ -27,6 +39,27 @@ type CreateError = {
status: number
}
// Mappe une Tache frontend vers les filtres de la table sujets.
// Retourne null pour EO_T2_LIVE (interaction live, pas de sujet pré-défini).
function mapTacheToSujetParams(
tache: Tache
): { mode: 'EE' | 'EO'; tacheNumber: number } | null {
switch (tache) {
case 'EE_T1':
return { mode: 'EE', tacheNumber: 1 }
case 'EE_T2':
return { mode: 'EE', tacheNumber: 2 }
case 'EE_T3':
return { mode: 'EE', tacheNumber: 3 }
case 'EO_T1':
return { mode: 'EO', tacheNumber: 1 }
case 'EO_T3':
return { mode: 'EO', tacheNumber: 3 }
case 'EO_T2_LIVE':
return null
}
}
export async function create(
body: CreateBody,
profile: AuthProfile
@ -64,7 +97,24 @@ export async function create(
}
}
// 3. Incrémenter simulations_used si le plan a une limite (via access.ts — Règle D)
// 3. Fetch un sujet aléatoire (non bloquant — sujet: null si introuvable).
// TODO: migrer vers une RPC PostgreSQL si la table sujets dépasse quelques centaines de lignes.
const sujetParams = mapTacheToSujetParams(body.tache)
let sujet: SujetData | null = null
if (sujetParams) {
const { data: sujets, error: sujetError } = await supabase
.from('sujets')
.select('id, consigne, role, contexte, doc1_titre, doc1_texte, doc2_titre, doc2_texte')
.eq('mode', sujetParams.mode)
.eq('tache', sujetParams.tacheNumber)
.eq('actif', true)
if (!sujetError && sujets && sujets.length > 0) {
sujet = sujets[Math.floor(Math.random() * sujets.length)] as SujetData
}
}
// 4. Incrémenter simulations_used si le plan a une limite (via access.ts — Règle D)
const perms = getPlanPermissions(profile.plan as Plan)
if (perms.simulations_lifetime !== null) {
await supabase
@ -73,7 +123,15 @@ export async function create(
.eq('id', profile.id)
}
return { data: data as CreateResult }
return {
data: {
id: data.id,
tache: data.tache as Tache,
mode: data.mode as Mode,
created_at: data.created_at,
sujet,
},
}
}
// EERapport et EORapport ont la même structure depuis l'étape A —