From acecb2b8ee9a2946f5ef02a916e485d11e2131bb Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 2 Dec 2025 11:31:39 -0700 Subject: [PATCH] Add dispensary_crawl_status view to consolidated schema --- backend/migrations/031_consolidate_schema.sql | 57 +++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/backend/migrations/031_consolidate_schema.sql b/backend/migrations/031_consolidate_schema.sql index 270a432c..9631742e 100644 --- a/backend/migrations/031_consolidate_schema.sql +++ b/backend/migrations/031_consolidate_schema.sql @@ -852,6 +852,8 @@ WHERE NOT EXISTS (SELECT 1 FROM public.users WHERE email = 'admin@example.com'); DROP VIEW IF EXISTS public.v_dashboard_stats CASCADE; DROP VIEW IF EXISTS public.v_latest_snapshots CASCADE; +DROP VIEW IF EXISTS public.v_brands CASCADE; +DROP VIEW IF EXISTS public.v_categories CASCADE; DROP VIEW IF EXISTS public.v_product_brands CASCADE; DROP VIEW IF EXISTS public.v_product_categories CASCADE; @@ -874,10 +876,11 @@ SELECT (SELECT COUNT(DISTINCT (type, subcategory)) FROM public.dutchie_products WHERE type IS NOT NULL) as category_count; -- Brands derived from products -CREATE OR REPLACE VIEW public.v_product_brands AS +CREATE OR REPLACE VIEW public.v_brands AS SELECT brand_name, brand_id, + MAX(brand_logo_url) as brand_logo_url, COUNT(*) as product_count, COUNT(DISTINCT dispensary_id) as dispensary_count, ARRAY_AGG(DISTINCT type) FILTER (WHERE type IS NOT NULL) as product_types @@ -887,16 +890,62 @@ GROUP BY brand_name, brand_id ORDER BY product_count DESC; -- Categories derived from products -CREATE OR REPLACE VIEW public.v_product_categories AS +CREATE OR REPLACE VIEW public.v_categories AS SELECT type, subcategory, COUNT(*) as product_count, COUNT(DISTINCT dispensary_id) as dispensary_count, - COUNT(DISTINCT brand_name) as brand_count + AVG(thc) as avg_thc, + MIN(thc) as min_thc, + MAX(thc) as max_thc FROM public.dutchie_products +WHERE type IS NOT NULL GROUP BY type, subcategory -ORDER BY product_count DESC; +ORDER BY type, subcategory; + +-- Dispensary crawl status view (consolidated schema) +DROP VIEW IF EXISTS public.dispensary_crawl_status CASCADE; +CREATE OR REPLACE VIEW public.dispensary_crawl_status AS +SELECT + d.id AS dispensary_id, + COALESCE(d.dba_name, d.name) AS dispensary_name, + d.slug AS dispensary_slug, + d.city, + d.state, + d.menu_url, + d.menu_type, + d.scrape_enabled, + d.last_crawl_at, + d.crawl_status, + d.crawl_error, + cs.cron_expression, + cs.is_active, + cs.priority, + cs.last_run_at, + cs.next_run_at, + cs.last_status AS schedule_last_status, + cs.last_error AS schedule_last_error, + cs.consecutive_failures, + j.id AS latest_job_id, + j.status AS latest_job_status, + j.job_type AS latest_job_type, + j.started_at AS latest_job_started, + j.completed_at AS latest_job_completed, + j.products_found AS latest_products_found, + j.products_created AS latest_products_created, + j.products_updated AS latest_products_updated, + j.error_message AS latest_job_error +FROM public.dispensaries d +LEFT JOIN public.dispensary_crawl_schedule cs ON cs.dispensary_id = d.id +LEFT JOIN LATERAL ( + SELECT * + FROM public.dispensary_crawl_jobs dj + WHERE dj.dispensary_id = d.id + ORDER BY dj.created_at DESC + LIMIT 1 +) j ON true +WHERE d.state = 'AZ'; -- Done! SELECT 'Migration 031 completed successfully' as status;