# syntax=docker/dockerfile:1
# Build context: repo root (see deploy/compose.yml).
# Targets: runtime (default, API server) and migrate (prisma migrate deploy).

FROM node:22-bookworm-slim AS base
RUN apt-get update \
 && apt-get install -y --no-install-recommends openssl ca-certificates \
 && rm -rf /var/lib/apt/lists/*
WORKDIR /repo

# ---- all dependencies (build + prisma CLI) ----
FROM base AS deps
COPY package.json package-lock.json ./
COPY packages/shared/package.json packages/shared/
COPY apps/api/package.json apps/api/
RUN npm ci -w @mark/api -w @mark/shared --include-workspace-root

# ---- compile shared + api, generate prisma client ----
FROM deps AS builder
COPY tsconfig.base.json ./
COPY packages/shared packages/shared
COPY apps/api apps/api
RUN npm run build -w @mark/shared \
 && cd apps/api \
 && npx prisma generate \
 && npx nest build

# ---- one-shot migration runner ----
FROM builder AS migrate
WORKDIR /repo/apps/api
CMD ["npx", "prisma", "migrate", "deploy"]

# ---- production-only dependencies ----
FROM base AS prod-deps
COPY package.json package-lock.json ./
COPY packages/shared/package.json packages/shared/
COPY apps/api/package.json apps/api/
RUN npm ci --omit=dev -w @mark/api -w @mark/shared --include-workspace-root

# ---- runtime ----
FROM base AS runtime
ENV NODE_ENV=production
COPY --from=prod-deps /repo/node_modules node_modules
COPY --from=builder /repo/node_modules/.prisma node_modules/.prisma
COPY --from=builder /repo/packages/shared/package.json packages/shared/package.json
COPY --from=builder /repo/packages/shared/dist packages/shared/dist
COPY --from=builder /repo/apps/api/package.json apps/api/package.json
COPY --from=builder /repo/apps/api/dist apps/api/dist
COPY apps/api/scripts apps/api/scripts
# Source files may be mode 600 on the host; the runtime user needs to read them.
RUN chmod -R a+rX /repo
WORKDIR /repo/apps/api
USER node
EXPOSE 3030
CMD ["node", "dist/main.js"]
