Apprends à sauvegarder chaque image générée via Replicate dans Prisma et à retirer un crédit utilisateur de façon atomique avec TypeScript.
L’appel à prisma.image.create()
persiste chaque image générée.
On stocke :
1return await prisma.image.create({2data: {3prompt, // texte saisi par l’utilisateur4user: {5connect: {6email, // relie l’image à l’utilisateur existant7},8},9url, // lien renvoyé par l’API Replicate10},11});
Pourquoi :
User
: simplicité des jointures Prisma.connect
attend une contrainte unique. Ici l’email est unique dans User
.
Chaque appel à Replicate coûte un crédit.
On met à jour le compteur dès que l’image est sauvée.
1export async function deductUserCredits({ email }: { email: string }) {2await prisma.user.update({3where: {4email, // cible le bon utilisateur5},6data: {7credits: { decrement: 1 }, // retire 1 crédit atomiquement8},9});10}
Explications :
prisma.user.update
modifie une ligne précise.{ decrement: 1 }
est atomique : pas de race condition même en
cas d’appels concurrents.Toujours appeler deductUserCredits
après prisma.image.create
pour assurer
que le crédit est seulement retiré si l’enregistrement a réussi.
prisma.image.create
pour persister l’image.deductUserCredits
pour mettre à jour le solde.Ordre indispensable : persistance avant décrément pour éviter de facturer une génération échouée.
Testez vos connaissances avec 4 questions
Quel appel Prisma est utilisé pour persister chaque image générée avant toute autre action ?
Explication : L’appel choisi doit créer une entrée dans la table Image afin de garantir que l’historique est conservé avant tout éventuel décrément de crédits.
Lors du « connect » entre l’image et l’utilisateur, quel champ unique sert de clé de liaison ?
Explication : Le champ doit être unique dans la table User pour que Prisma accepte le « connect ».
Quel opérateur Prisma garantit un décrément de crédits sans condition de concurrence (de façon atomique) ?
Explication : L’opérateur doit modifier la valeur tout en empêchant les race conditions.
Pourquoi l’ordre « persister l’image puis décompter le crédit » est-il crucial ?
Explication : Choisis la raison principale mise en avant dans la leçon.