# TARGO-BACKEND prisma

# *******************************************************************************************************
# MAJOR PRISMA UPDATE 2026-02-04 => from 6.13 to 7.3. A lot has changed and this read me needs updating.|
# added functionnalities to manage many schema files with many instance of clients and services         |
# added scripts to generate, migrate and manage one or many database at once                            |
# *******************************************************************************************************

Ce document court présente la configuration de Prisma et les conventions à respecter dans `prisma/schema.prisma`.
<source> http://prisma.io/docs/orm/prisma-schema

### `Installation`

npm install prisma @prisma/client --save-dev
npx prisma init

>Le fichier .env est généré à la racine

### `Fichier .env`

<Définissez votre URL de connexion PostgreSQL :

- `DATABASE_URL`="postgresql://<DB_USER>:<DB_PASSWORD>@<HOST>:<PORT>/<DB_NAME>?schema=public"

***

### `Structure de prisma/schema.prisma`

```graphql
generator client {
  provider = "prisma-client-js"
  output   = "../generated/prisma"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

enum Roles {
  USER
  ADMIN
  CUSTOMER
  EMPLOYEE
  # …
}

model User {
  user_id      Int        @id @default(autoincrement())
  first_name   String
  last_name    String
  email        String?    @unique   # le ? de 'String#' indique NULLABLE
  role         Roles      @default(USER)
  created_at   DateTime   @default(now())

  customer      Customers? @relation("UserCustomer")   # back-relation du model/table customers
  

  @@map("users")   # mappe vers la table 'users'
}


```graphql
model Customers {
  customer_id         Int     @id @default(autoincrement())
  user                Users   @relation("UserCustomer", fields: [user_id], references:[user_id])   # foreign key relation
  user_id             Int     @unique   # actual foreign key
  invoice_id          Int     @unique
  role                Roles   @default(CUSTOMER)

  @@map("customers") # mappe vers la table 'customers'
}
```

```graphql
### `Structure de prisma/schema.prisma-legaacy`
generator client {
  provider = "prisma-client-js"
  output   = "../node_modules/@prisma/client-legacy"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL_LEGACY")
}
```
***

### `Conventions`

`Modèles` : nom en PascalCase (singulier) → map vers table lowercase avec @@map("…").

`Not-NULL` : Tout type sans `?` est par default `not-null`. si nullable on doit mettre `?`

`Champs `: snake_case

`Types date/heure `: DateTime.

`Relations `: toujours bidirectionnelles ou explicitez @relation("NomRelation").

`Enums` : définis en PascalCase, sans mapping interne (le mapping de la table se fait sur le type enum, pas sur ses valeurs).


`##4. Commandes utiles`

`Afficher l’aide Prisma`
    npx prisma help

`Générer le client JS`
    npx prisma generate

    npx prisma generate schema=prisma-legacy/schema.prisma

`Créer ou appliquer une migration`
    npx prisma migrate dev --name <titre_de_migration>

`Explorer la base avec Prisma Studio`
    npx prisma studio

`Récupérer le schéma existant depuis la BDD`
    npx prisma db pull