FROM node:22-alpine AS builder
WORKDIR /app

# Required by Prisma at build time
RUN apk add --no-cache openssl

COPY package*.json ./
RUN npm install --legacy-peer-deps

COPY . .
RUN test -d prisma/schema && find prisma/schema -maxdepth 2 -type f | sort
RUN npx prisma generate
RUN npm run build

FROM node:22-alpine
WORKDIR /app

# Required by Prisma at runtime
RUN apk add --no-cache openssl

COPY --from=builder /app/dist ./dist
COPY --from=builder /app/prisma ./prisma
COPY --from=builder /app/src/generated ./src/generated
COPY package*.json prisma.config.ts docker-entrypoint.sh ./
RUN chmod +x docker-entrypoint.sh

# Install prod deps + the Prisma CLI (devDep) so `migrate deploy` works at startup.
# Installing prisma via npm sets up the .bin symlink correctly so its .wasm
# siblings resolve at runtime.
RUN npm install --omit=dev --legacy-peer-deps \
  && npm install prisma --no-save --legacy-peer-deps \
  && npm cache clean --force

# Pre-create uploads root (also mount target for the prod volume).
# Subfolders (avatars, documents, etc.) are created on demand by LocalStorage.
RUN mkdir -p /app/uploads

EXPOSE 3006
CMD ["sh", "./docker-entrypoint.sh"]
