## 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>
50 lines
2.2 KiB
SQL
50 lines
2.2 KiB
SQL
-- Migration 052: SEO Settings Table
|
|
-- Key/value store for SEO Orchestrator configuration
|
|
|
|
CREATE TABLE IF NOT EXISTS seo_settings (
|
|
id SERIAL PRIMARY KEY,
|
|
key TEXT UNIQUE NOT NULL,
|
|
value JSONB NOT NULL,
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
updated_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
-- Create index on key for fast lookups
|
|
CREATE INDEX IF NOT EXISTS idx_seo_settings_key ON seo_settings(key);
|
|
|
|
-- Seed with default settings
|
|
INSERT INTO seo_settings (key, value) VALUES
|
|
-- Section 1: Global Content Generation Settings
|
|
('primary_prompt_template', '"You are a cannabis industry content expert. Generate SEO-optimized content for {{page_type}} pages about {{subject}}. Focus on: {{focus_areas}}. Maintain a {{tone}} tone and keep content {{length}}."'),
|
|
('regeneration_prompt_template', '"Regenerate the following SEO content with fresh perspectives. Original topic: {{subject}}. Improve upon: {{improvement_areas}}. Maintain compliance with cannabis industry standards."'),
|
|
('default_content_length', '"medium"'),
|
|
('tone_voice', '"informational"'),
|
|
|
|
-- Section 2: Automatic Refresh Rules
|
|
('auto_refresh_interval', '"weekly"'),
|
|
('trigger_pct_product_change', 'true'),
|
|
('trigger_pct_brand_change', 'true'),
|
|
('trigger_new_stores', 'true'),
|
|
('trigger_market_shift', 'false'),
|
|
('webhook_url', '""'),
|
|
('notify_on_trigger', 'false'),
|
|
|
|
-- Section 3: Page-Level Defaults
|
|
('default_title_template', '"{{state_name}} Dispensaries | Find Cannabis Near You | CannaiQ"'),
|
|
('default_meta_description_template', '"Discover the best dispensaries in {{state_name}}. Browse {{dispensary_count}}+ licensed retailers, compare prices, and find cannabis products near you."'),
|
|
('default_slug_template', '"dispensaries-{{state_code_lower}}"'),
|
|
('default_og_image_template', '"/images/seo/og-{{state_code_lower}}.jpg"'),
|
|
('enable_ai_images', 'false'),
|
|
|
|
-- Section 4: Crawl / Dataset Configuration
|
|
('primary_data_provider', '"cannaiq"'),
|
|
('fallback_data_provider', '"dutchie"'),
|
|
('min_data_freshness_hours', '24'),
|
|
('stale_data_behavior', '"allow_with_warning"')
|
|
ON CONFLICT (key) DO NOTHING;
|
|
|
|
-- Record migration
|
|
INSERT INTO schema_migrations (version, name, applied_at)
|
|
VALUES ('052', 'seo_settings', NOW())
|
|
ON CONFLICT (version) DO NOTHING;
|