feat(simulations): retourner un sujet aléatoire actif avec la production créée
This commit is contained in:
parent
0680a6382f
commit
b6b8c76cc2
2 changed files with 155 additions and 8 deletions
|
|
@ -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 —
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue