Adds a live per-ISBN BooksRun API check to the checkout-time price recheck (Order\PriceRecheck) so a booksrun-sourced offer is verified fresh, not trusted from a potentially day-stale local cache -- fails closed on any problem (API error, no stock), matching Appendix B's "stale supplier cost must never be trusted as final." Live values are written back to the same offer_id row so SupplierOrderJob's later fulfillment-time read sees them too. Also wires a real daily Action Scheduler job (scheduling/dedup/batch-write infrastructure) for BooksRun's FTP inventory feed, but leaves the actual connect+parse step (Import\BooksRunOfferSync::connect_and_parse_feed()) as a deliberate stub -- no FTP access or sample feed exists yet, and guessing at a file format would silently write wrong data once real access arrives. The stub fails loud on the manual CLI trigger, quiet on the scheduled job (no point alarming on an expected, known state). Ingram, BooksRun AutoBuy, production email, and tax/legal/monitoring are explicitly out of scope for this pass -- narrowed by user request. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D2gmgaDVXcRGCwLfdXQajD
64 lines
2.2 KiB
Bash
64 lines
2.2 KiB
Bash
# Copy this to .env.dev / .env.staging / .env.production and fill in real
|
|
# values for that environment, then `chmod 600` it — it holds every API key
|
|
# and both DB passwords in plaintext, same as the secrets/<env>/ files
|
|
# deploy.sh derives from it. The filled-in files are gitignored — never
|
|
# commit them. Same code everywhere; only these values differ (see
|
|
# design doc §01, Environments & deployment).
|
|
#
|
|
# CAVEAT for the API keys below (DB_PASSWORD/DB_ROOT_PASSWORD are exempt —
|
|
# deploy.sh writes those into secrets/<env>/ files that bypass this
|
|
# entirely): docker compose passes these into containers via ${VAR}
|
|
# interpolation, which will silently mangle a value containing `$` followed
|
|
# by a letter (it tries to resolve it as another variable and blanks it out
|
|
# if unset). Avoid `$` in these specific values, or double it ($$) if you
|
|
# must use one — this bit us for real with a generated password once.
|
|
|
|
# --- Site ---
|
|
# (WP_ENVIRONMENT_TYPE is NOT set here — it's hardcoded per environment in
|
|
# docker-compose.{dev,staging,production}.yml so it can't go stale.)
|
|
SITE_DOMAIN=staging.example.com
|
|
SITE_URL=https://staging.example.com
|
|
SITE_TITLE="Bookstore (staging)"
|
|
|
|
# --- WordPress admin bootstrap (used only on first install) ---
|
|
WP_ADMIN_USER=admin
|
|
WP_ADMIN_PASSWORD=changeme
|
|
WP_ADMIN_EMAIL=admin@example.com
|
|
|
|
# --- Database ---
|
|
DB_NAME=bookstore
|
|
DB_USER=bookstore
|
|
DB_PASSWORD=changeme
|
|
DB_ROOT_PASSWORD=changeme
|
|
WP_TABLE_PREFIX=wp_
|
|
|
|
# --- Backups (deploy/backup.sh) ---
|
|
BACKUP_DIR=./backups
|
|
BACKUP_REMOTE=
|
|
BACKUP_RETENTION_DAYS=14
|
|
|
|
# --- Supplier adapters (design doc §04) ---
|
|
# staging: gutenberg_test production: booksrun,ingram
|
|
ACTIVE_SUPPLIER_ADAPTERS=gutenberg_test
|
|
BOOKSRUN_API_KEY=
|
|
# Week 4: bulk FTP inventory feed — placeholders, not yet consumed by any
|
|
# code beyond Import\BooksRunOfferSync::is_ftp_configured()'s empty check.
|
|
BOOKSRUN_FTP_HOST=
|
|
BOOKSRUN_FTP_PORT=
|
|
BOOKSRUN_FTP_USER=
|
|
BOOKSRUN_FTP_PASSWORD=
|
|
BOOKSRUN_FTP_REMOTE_PATH=
|
|
INGRAM_API_KEY=
|
|
INGRAM_ACCOUNT_ID=
|
|
|
|
# --- Payments (Helcim) ---
|
|
HELCIM_API_TOKEN=
|
|
HELCIM_ACCOUNT_ID=
|
|
|
|
# --- Marketing ---
|
|
MAILERLITE_API_KEY=
|
|
|
|
# --- Hardcover (AO3-style tag browsing — genre/mood/content-warning/tag sync) ---
|
|
# Get a token: hardcover.app account settings -> Hardcover API -> New API Key
|
|
HARDCOVER_API_TOKEN=
|