Enregistrer l’image IA et décompter les crédits avec Prisma
Apprends à sauvegarder chaque image générée via Replicate dans Prisma et à retirer un crédit utilisateur de façon atomique avec TypeScript.
Enregistrer l’image en base
L’appel à prisma.image.create() persiste chaque image générée.
On stocke :
- le prompt utilisé,
- l’utilisateur qui a passé la requête (connexion via son email),
- l’URL de l’image déjà optimisée (WebP).
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 :
- Garder l’historique : l’utilisateur retrouve facilement ses images.
- Faire un audit rapide : tu sais quel prompt consomme le plus de crédits.
- Liaison directe avec la table
User: simplicité des jointures Prisma.
Note
connect attend une contrainte unique. Ici l’email est unique dans User.
Décompter un crédit après génération
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.updatemodifie une ligne précise.- L’opérateur
{ decrement: 1 }est atomique : pas de race condition même en cas d’appels concurrents.
Important
Toujours appeler deductUserCredits après prisma.image.create pour assurer
que le crédit est seulement retiré si l’enregistrement a réussi.
Etapes côté route (rappel rapide)
- Vérifie le JWT dans le cookie (middleware d’auth).
- Appelle Replicate et récupère l’URL en WebP.
prisma.image.createpour persister l’image.deductUserCreditspour mettre à jour le solde.
Ordre indispensable : persistance avant décrément pour éviter de facturer une génération échouée.
Quiz
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.