# syntax=docker/dockerfile:1
# API Parenthèse (Fastify + Prisma). Contexte de build : le dossier backend/.
# Étape 1 : dépendances complètes, client Prisma, compilation TypeScript.
# Étape 2 : image finale avec les seules dépendances de production, plus la CLI Prisma
#           installée à part (nécessaire à `prisma migrate deploy` au démarrage).

FROM node:24-bookworm-slim AS build

# openssl : requis par les moteurs Prisma (cible debian-openssl-3.0.x).
RUN apt-get update \
  && apt-get install -y --no-install-recommends openssl ca-certificates \
  && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY package.json package-lock.json ./
COPY prisma ./prisma
RUN npm ci --no-audit --no-fund
RUN npx prisma generate

COPY tsconfig.json ./
COPY src ./src
RUN npm run build


FROM node:24-bookworm-slim AS runtime

RUN apt-get update \
  && apt-get install -y --no-install-recommends openssl ca-certificates \
  && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Dépendances de production seules.
COPY package.json package-lock.json ./
RUN npm ci --omit=dev --no-audit --no-fund \
  && npm cache clean --force

# CLI Prisma : c'est une devDependency, donc absente de l'installation précédente. Elle est installée
# dans un dossier séparé, à la version exacte du package-lock, pour ne pas toucher à node_modules
# (un `npm install --omit=dev prisma` dans /app l'ignorerait, puisqu'elle est déclarée en dev).
RUN PRISMA_VERSION="$(node -p "require('./package-lock.json').packages['node_modules/prisma'].version")" \
  && mkdir -p /opt/prisma \
  && cd /opt/prisma \
  && echo '{"private":true}' > package.json \
  && npm install --no-audit --no-fund "prisma@${PRISMA_VERSION}" \
  && npm cache clean --force

# Client Prisma généré à l'étape 1 (même image de base, même cible de moteur).
COPY --from=build /app/node_modules/.prisma ./node_modules/.prisma
# Schéma + migrations : indispensables à `prisma migrate deploy`.
COPY prisma ./prisma
COPY --from=build /app/dist ./dist

RUN mkdir -p /app/storage/media && chown -R node:node /app/storage

ENV NODE_ENV=production \
    PORT=4000 \
    MEDIA_STORAGE_PATH=/app/storage/media \
    CHECKPOINT_DISABLE=1 \
    PATH=/opt/prisma/node_modules/.bin:$PATH

USER node
EXPOSE 4000

# Applique les migrations en attente puis démarre l'API.
CMD ["sh", "-c", "prisma migrate deploy && exec node dist/server.js"]
