Fix category-crawler-jobs store lookup query

- Fix column name from s.dutchie_plus_url to s.dutchie_url
- Add availability tracking and product freshness APIs
- Add crawl script for sequential dispensary processing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Kelly
2025-12-01 00:07:00 -07:00
parent 20a7b69537
commit 9d8972aa86
15 changed files with 11604 additions and 42 deletions

View File

@@ -0,0 +1,52 @@
-- Migration 024: Product Availability Tracking
-- Adds normalized availability status and transition tracking
-- Add availability columns to products table
ALTER TABLE products ADD COLUMN IF NOT EXISTS availability_status VARCHAR(20) DEFAULT 'unknown';
ALTER TABLE products ADD COLUMN IF NOT EXISTS availability_raw JSONB;
ALTER TABLE products ADD COLUMN IF NOT EXISTS last_seen_in_stock_at TIMESTAMPTZ;
ALTER TABLE products ADD COLUMN IF NOT EXISTS last_seen_out_of_stock_at TIMESTAMPTZ;
-- Add comment for clarity
COMMENT ON COLUMN products.availability_status IS 'Normalized status: in_stock, out_of_stock, limited, unknown';
COMMENT ON COLUMN products.availability_raw IS 'Raw availability payload from provider for debugging';
COMMENT ON COLUMN products.last_seen_in_stock_at IS 'Last time product was seen in stock';
COMMENT ON COLUMN products.last_seen_out_of_stock_at IS 'Last time product was seen out of stock';
-- Create indexes for availability queries
CREATE INDEX IF NOT EXISTS idx_products_availability_status ON products(availability_status);
CREATE INDEX IF NOT EXISTS idx_products_availability_by_store ON products(store_id, availability_status) WHERE store_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_products_availability_by_dispensary ON products(dispensary_id, availability_status) WHERE dispensary_id IS NOT NULL;
-- Backfill availability_status from existing in_stock column
UPDATE products
SET availability_status = CASE
WHEN in_stock = true THEN 'in_stock'
WHEN in_stock = false THEN 'out_of_stock'
ELSE 'unknown'
END
WHERE availability_status = 'unknown' OR availability_status IS NULL;
-- Set last_seen_in_stock_at for currently in-stock products
UPDATE products
SET last_seen_in_stock_at = COALESCE(last_seen_at, updated_at, NOW())
WHERE in_stock = true AND last_seen_in_stock_at IS NULL;
-- Set last_seen_out_of_stock_at for currently out-of-stock products
UPDATE products
SET last_seen_out_of_stock_at = COALESCE(last_seen_at, updated_at, NOW())
WHERE in_stock = false AND last_seen_out_of_stock_at IS NULL;
-- Add availability tracking to dispensary_crawl_jobs
ALTER TABLE dispensary_crawl_jobs ADD COLUMN IF NOT EXISTS in_stock_count INTEGER;
ALTER TABLE dispensary_crawl_jobs ADD COLUMN IF NOT EXISTS out_of_stock_count INTEGER;
ALTER TABLE dispensary_crawl_jobs ADD COLUMN IF NOT EXISTS limited_count INTEGER;
ALTER TABLE dispensary_crawl_jobs ADD COLUMN IF NOT EXISTS unknown_count INTEGER;
ALTER TABLE dispensary_crawl_jobs ADD COLUMN IF NOT EXISTS availability_changed_count INTEGER;
-- Add availability tracking to crawl_jobs (store-based)
ALTER TABLE crawl_jobs ADD COLUMN IF NOT EXISTS in_stock_count INTEGER;
ALTER TABLE crawl_jobs ADD COLUMN IF NOT EXISTS out_of_stock_count INTEGER;
ALTER TABLE crawl_jobs ADD COLUMN IF NOT EXISTS limited_count INTEGER;
ALTER TABLE crawl_jobs ADD COLUMN IF NOT EXISTS unknown_count INTEGER;
ALTER TABLE crawl_jobs ADD COLUMN IF NOT EXISTS availability_changed_count INTEGER;