## SEO Template Library - Add complete template library with 7 page types (state, city, category, brand, product, search, regeneration) - Add Template Library tab in SEO Orchestrator with accordion-based editors - Add template preview, validation, and variable injection engine - Add API endpoints: /api/seo/templates, preview, validate, generate, regenerate ## Discovery Pipeline - Add promotion.ts for discovery location validation and promotion - Add discover-all-states.ts script for multi-state discovery - Add promotion log migration (067) - Enhance discovery routes and types ## Orchestrator & Admin - Add crawl_enabled filter to stores page - Add API permissions page - Add job queue management - Add price analytics routes - Add markets and intelligence routes - Enhance dashboard and worker monitoring ## Infrastructure - Add migrations for worker definitions, SEO settings, field alignment - Add canonical pipeline for scraper v2 - Update hydration and sync orchestrator - Enhance multi-state query service 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
75 lines
2.5 KiB
SQL
75 lines
2.5 KiB
SQL
-- Migration 072: Create compatibility views for store_products and store_product_snapshots
|
|
-- These views provide backward-compatible column names for API routes
|
|
|
|
-- v_products view - aliases store_products columns to match legacy dutchie_products naming
|
|
CREATE OR REPLACE VIEW v_products AS
|
|
SELECT
|
|
id,
|
|
dispensary_id,
|
|
provider_product_id as external_product_id,
|
|
provider_product_id as dutchie_id,
|
|
name_raw as name,
|
|
brand_name_raw as brand_name,
|
|
category_raw as type,
|
|
subcategory_raw as subcategory,
|
|
strain_type,
|
|
thc_percent as thc,
|
|
cbd_percent as cbd,
|
|
stock_status,
|
|
is_in_stock,
|
|
stock_quantity,
|
|
image_url,
|
|
primary_image_url,
|
|
images,
|
|
effects,
|
|
description,
|
|
is_on_special,
|
|
featured,
|
|
medical_only,
|
|
rec_only,
|
|
external_product_id as external_id,
|
|
provider,
|
|
created_at,
|
|
updated_at
|
|
FROM store_products;
|
|
|
|
-- v_product_snapshots view - aliases store_product_snapshots columns to match legacy naming
|
|
CREATE OR REPLACE VIEW v_product_snapshots AS
|
|
SELECT
|
|
id,
|
|
store_product_id,
|
|
dispensary_id,
|
|
provider,
|
|
provider_product_id,
|
|
crawl_run_id,
|
|
captured_at as crawled_at,
|
|
name_raw,
|
|
brand_name_raw,
|
|
category_raw,
|
|
subcategory_raw,
|
|
-- Convert price_rec (dollars) to rec_min_price_cents (cents)
|
|
CASE WHEN price_rec IS NOT NULL THEN (price_rec * 100)::integer END as rec_min_price_cents,
|
|
CASE WHEN price_rec IS NOT NULL THEN (price_rec * 100)::integer END as rec_max_price_cents,
|
|
CASE WHEN price_rec_special IS NOT NULL THEN (price_rec_special * 100)::integer END as rec_min_special_price_cents,
|
|
CASE WHEN price_med IS NOT NULL THEN (price_med * 100)::integer END as med_min_price_cents,
|
|
CASE WHEN price_med IS NOT NULL THEN (price_med * 100)::integer END as med_max_price_cents,
|
|
CASE WHEN price_med_special IS NOT NULL THEN (price_med_special * 100)::integer END as med_min_special_price_cents,
|
|
is_on_special as special,
|
|
discount_percent,
|
|
is_in_stock,
|
|
stock_quantity,
|
|
stock_status,
|
|
stock_quantity as total_quantity_available,
|
|
thc_percent,
|
|
cbd_percent,
|
|
image_url,
|
|
raw_data as options,
|
|
created_at
|
|
FROM store_product_snapshots;
|
|
|
|
-- Add indexes for the views' underlying tables
|
|
CREATE INDEX IF NOT EXISTS idx_store_products_dispensary ON store_products(dispensary_id);
|
|
CREATE INDEX IF NOT EXISTS idx_store_products_stock ON store_products(stock_status);
|
|
CREATE INDEX IF NOT EXISTS idx_store_snapshots_product ON store_product_snapshots(store_product_id);
|
|
CREATE INDEX IF NOT EXISTS idx_store_snapshots_captured ON store_product_snapshots(captured_at DESC);
|