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.

2 min read

Enregistrer l’image en base

L’appel à prisma.image.create() persiste chaque image générée.
On stocke :

  1. le prompt utilisé,
  2. l’utilisateur qui a passé la requête (connexion via son email),
  3. l’URL de l’image déjà optimisée (WebP).
src/lib/images.server.ts
1
return await prisma.image.create({
2
data: {
3
prompt, // texte saisi par l’utilisateur
4
user: {
5
connect: {
6
email, // relie l’image à l’utilisateur existant
7
},
8
},
9
url, // lien renvoyé par l’API Replicate
10
},
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.

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.

src/lib/credits.server.ts
1
export async function deductUserCredits({ email }: { email: string }) {
2
await prisma.user.update({
3
where: {
4
email, // cible le bon utilisateur
5
},
6
data: {
7
credits: { decrement: 1 }, // retire 1 crédit atomiquement
8
},
9
});
10
}

Explications :

  • prisma.user.update modifie une ligne précise.
  • L’opérateur { decrement: 1 } est atomique : pas de race condition même en cas d’appels concurrents.

Etapes côté route (rappel rapide)

  1. Vérifie le JWT dans le cookie (middleware d’auth).
  2. Appelle Replicate et récupère l’URL en WebP.
  3. prisma.image.create pour persister l’image.
  4. deductUserCredits pour 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

1Question 1 sur 4

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.

2Question 2 sur 4

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 ».

3Question 3 sur 4

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.

4Question 4 sur 4

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.