# base
# ----
FROM node:24-bookworm-slim as base

RUN npm install --global corepack

# We tried to make the Dockerfile as lean as possible. In some cases, that
# means we excluded a dependency your project needs.
# By far the most common is Python. If you're running into build errors
# because `python3` isn't available, add `python3 make gcc \` before the
# `openssl \` line below and in other stages as necessary:
RUN apt-get update && apt-get install -y \
  openssl \
  && rm -rf /var/lib/apt/lists/*

USER node
WORKDIR /home/node/app

COPY --chown=node:node package*.json .
COPY --chown=node:node api/package.json api/
COPY --chown=node:node web/package.json web/

RUN --mount=type=cache,target=/home/node/.npm,uid=1000 \
  npm ci

COPY --chown=node:node cedar.toml* redwood.toml* ./
COPY --chown=node:node graphql.config.cjs .
COPY --chown=node:node .env.defaults .env.defaults

# api build
# ---------
FROM base as api_build

COPY --chown=node:node api api
RUN npx --yes cedar build api

# web prerender build
# -------------------
FROM api_build as web_build_with_prerender

COPY --chown=node:node web web
RUN npx --yes cedar build web

# web build
# ---------
FROM base as web_build

COPY --chown=node:node web web
RUN npx --yes cedar build web --no-prerender

# api serve
# ---------
FROM node:24-bookworm-slim as api_serve

RUN npm install --global corepack

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

USER node
WORKDIR /home/node/app

# npm doesn't have a workspace focus command, so we copy all workspace
# package.json files and install production deps for all workspaces.
COPY --chown=node:node package*.json .
COPY --chown=node:node api/package.json api/
COPY --chown=node:node web/package.json web/

RUN --mount=type=cache,target=/home/node/.npm,uid=1000 \
  npm ci --omit=dev

COPY --chown=node:node cedar.toml* redwood.toml* ./
COPY --chown=node:node graphql.config.cjs .
COPY --chown=node:node .env.defaults .env.defaults

COPY --chown=node:node --from=api_build /home/node/app/api/dist /home/node/app/api/dist
COPY --chown=node:node --from=api_build /home/node/app/api/db /home/node/app/api/db
COPY --chown=node:node --from=api_build /home/node/app/node_modules/.prisma /home/node/app/node_modules/.prisma

ENV NODE_ENV=production

CMD ["node_modules/.bin/cedarjs-server", "api"]

# web serve
# ---------
FROM node:24-bookworm-slim as web_serve

RUN npm install --global corepack

USER node
WORKDIR /home/node/app

COPY --chown=node:node package*.json .
COPY --chown=node:node api/package.json api/
COPY --chown=node:node web/package.json web/

RUN --mount=type=cache,target=/home/node/.npm,uid=1000 \
  npm ci --omit=dev

COPY --chown=node:node cedar.toml* redwood.toml* ./
COPY --chown=node:node graphql.config.cjs .
COPY --chown=node:node .env.defaults .env.defaults

COPY --chown=node:node --from=web_build /home/node/app/web/dist /home/node/app/web/dist

ENV NODE_ENV=production \
  API_PROXY_TARGET=http://api:8911

# We use the shell form here for variable expansion.
CMD node_modules/.bin/cedar-web-server --api-proxy-target $API_PROXY_TARGET

# console
# -------
FROM base as console

COPY --chown=node:node api api
COPY --chown=node:node web web
COPY --chown=node:node scripts scripts
