RECORDGOD/app
type-two 25127b1b72 feat(intake): connected Google sheet via service account + skip-existing bulk stage
The intake sheet is read straight from the stored Google service account (discotag@…
inventory-sheets, migrated out of WowPlatter's wp_rmp_disc_google_service into the vault) — a
signed JWT (cryptography, no new dep) → Sheets API → private sheet, no public-share needed. Uses
the saved column_mappings (timestamp/release_id/media/sleeve/price/comment, 1-indexed). SKU from
the sheet's locale timestamp '2025-01-30, 14:01:02' → 20250130140102 (matches migrated stock).

Bulk import (both connected + paste-URL paths) now SKIPS SKUs already in inventory, so importing
the 34,752-row form log only stages the genuinely-new rows (live: 2,006 new / 32,746 skipped).
Preview shows new-of-total. Endpoints: GET/POST /admin/intake/gsheet/{preview,import}.

Also: .dockerignore now excludes disc_images/ (volume-mounted, was 916MB) — build context
918MB→1MB, deploy 13min(hung)→24s. The COPY . . was baking the image store into every image.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 10:32:31 +10:00
..
__init__.py feat: RecordGod founding — service scaffold + MariaDB→Postgres migration 2026-06-19 17:18:50 +10:00
admin_routes.py feat(admin): System tab — read-only Postgres health (db size/version/uptime/conns/cache-hit, largest tables, data freshness) 2026-06-23 18:44:44 +10:00
auth.py feat(auth): staff accounts + roles — operators run the store, admins keep the keys 2026-06-23 15:33:19 +10:00
collections_routes.py feat(collections): interactive editor — click-map crate select, genre/style/price/year rules, live match stats, priority 2026-06-22 21:33:15 +10:00
db.py feat: RecordGod founding — service scaffold + MariaDB→Postgres migration 2026-06-19 17:18:50 +10:00
disc_images.py fix(images): /img/r serves local copy else 302 to discogs webp (server-side fetch is CF-blocked); drop unused pillow 2026-06-22 21:48:08 +10:00
intake_routes.py feat(intake): connected Google sheet via service account + skip-existing bulk stage 2026-06-24 10:32:31 +10:00
layout_routes.py feat(shop): P4 wantlist — public 'request a record' page + admin queue 2026-06-23 01:29:00 +10:00
mailer.py feat(pos): rebuild Sales — 3 tabs, smooth checkout + tender/change, print+email receipts 2026-06-23 16:29:42 +10:00
main.py feat(intake): three-source intake — internal lookup + Discogs collection + Google Sheet 2026-06-24 10:05:46 +10:00
mirror.py feat: self-contained enrichment — disc_cache (own catalog copy), no external DB dependency 2026-06-21 13:16:56 +10:00
navigator_routes.py feat(nav): Quick Insert + click-to-pick insert slot (insert-with-shift) 2026-06-23 19:45:42 +10:00
receipts.py feat(pos): receipt logo + Monster Robot template (store name/address/footer) 2026-06-23 17:33:08 +10:00
sales_routes.py feat(shipping): use current AusPost own-packaging rates (RecordGod not live pre-1-Jul, no dating needed) 2026-06-24 01:05:12 +10:00
settings_routes.py feat(intake): connected Google sheet via service account + skip-existing bulk stage 2026-06-24 10:32:31 +10:00
shop_routes.py feat(bridge): RecordGod WP bridge plugin (WowPlatter successor) + thumb on browse/release 2026-06-24 01:43:30 +10:00
square.py feat(pos): Square Terminal payments — push checkout to a paired terminal 2026-06-23 17:57:26 +10:00
vault.py feat: standalone RecordGod web UI — landing, control-room dash, encrypted secrets vault 2026-06-21 12:40:07 +10:00
virtual.py feat(virtual): finish the 3D store port — per-room scoping, decals, portals 2026-06-21 21:00:02 +10:00
wowplatter_v1.py feat: deploy-ready — env-aware Discogs enrichment + Dockerfile 2026-06-21 13:08:49 +10:00