-- +goose Up CREATE TABLE input_feeds ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), company_id UUID NOT NULL REFERENCES companies(id) ON DELETE CASCADE, name TEXT NOT NULL, url TEXT, feed_type TEXT NOT NULL DEFAULT 'xml', status TEXT NOT NULL DEFAULT 'active', sync_interval_minutes INT NOT NULL DEFAULT 60, last_synced_at TIMESTAMPTZ, auth_config JSONB NOT NULL DEFAULT '{}'::jsonb, options JSONB NOT NULL DEFAULT '{}'::jsonb, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX input_feeds_company_id_idx ON input_feeds(company_id); ALTER TABLE raw_products ADD CONSTRAINT raw_products_feed_id_fkey FOREIGN KEY (feed_id) REFERENCES input_feeds(id) ON DELETE SET NULL; ALTER TABLE processed_products ADD CONSTRAINT processed_products_feed_id_fkey FOREIGN KEY (feed_id) REFERENCES input_feeds(id) ON DELETE SET NULL; CREATE TABLE feed_mappings ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), feed_id UUID NOT NULL REFERENCES input_feeds(id) ON DELETE CASCADE, company_id UUID NOT NULL REFERENCES companies(id) ON DELETE CASCADE, version INT NOT NULL DEFAULT 1, mappings JSONB NOT NULL DEFAULT '[]'::jsonb, is_active BOOLEAN NOT NULL DEFAULT true, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX feed_mappings_feed_id_idx ON feed_mappings(feed_id); CREATE TABLE feed_sync_jobs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), feed_id UUID NOT NULL REFERENCES input_feeds(id) ON DELETE CASCADE, company_id UUID NOT NULL REFERENCES companies(id) ON DELETE CASCADE, status TEXT NOT NULL DEFAULT 'pending', started_at TIMESTAMPTZ, completed_at TIMESTAMPTZ, products_synced INT NOT NULL DEFAULT 0, error TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX feed_sync_jobs_feed_id_idx ON feed_sync_jobs(feed_id); CREATE INDEX feed_sync_jobs_company_id_idx ON feed_sync_jobs(company_id); ALTER TABLE raw_products ADD CONSTRAINT raw_products_sync_job_id_fkey FOREIGN KEY (sync_job_id) REFERENCES feed_sync_jobs(id) ON DELETE SET NULL; CREATE TABLE export_feeds ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), company_id UUID NOT NULL REFERENCES companies(id) ON DELETE CASCADE, name TEXT NOT NULL, source_feed_id UUID REFERENCES input_feeds(id) ON DELETE SET NULL, format TEXT NOT NULL DEFAULT 'xml', public_token TEXT NOT NULL UNIQUE DEFAULT encode(gen_random_bytes(16), 'hex'), template JSONB NOT NULL DEFAULT '{}'::jsonb, filters JSONB NOT NULL DEFAULT '{}'::jsonb, is_active BOOLEAN NOT NULL DEFAULT true, last_generated_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX export_feeds_company_id_idx ON export_feeds(company_id); CREATE INDEX export_feeds_public_token_idx ON export_feeds(public_token); CREATE TABLE feed_tags ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), company_id UUID NOT NULL REFERENCES companies(id) ON DELETE CASCADE, name TEXT NOT NULL, color TEXT NOT NULL DEFAULT '#888888', created_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE (company_id, name) ); CREATE TABLE feed_tag_mappings ( feed_id UUID NOT NULL REFERENCES input_feeds(id) ON DELETE CASCADE, tag_id UUID NOT NULL REFERENCES feed_tags(id) ON DELETE CASCADE, PRIMARY KEY (feed_id, tag_id) ); CREATE TABLE schema_extraction_tasks ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), feed_id UUID NOT NULL REFERENCES input_feeds(id) ON DELETE CASCADE, company_id UUID NOT NULL REFERENCES companies(id) ON DELETE CASCADE, status TEXT NOT NULL DEFAULT 'pending', progress INT NOT NULL DEFAULT 0, error TEXT, completed_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX schema_extraction_tasks_feed_id_idx ON schema_extraction_tasks(feed_id); -- +goose Down DROP TABLE IF EXISTS schema_extraction_tasks; DROP TABLE IF EXISTS feed_tag_mappings; DROP TABLE IF EXISTS feed_tags; DROP TABLE IF EXISTS export_feeds; ALTER TABLE raw_products DROP CONSTRAINT IF EXISTS raw_products_sync_job_id_fkey; DROP TABLE IF EXISTS feed_sync_jobs; DROP TABLE IF EXISTS feed_mappings; ALTER TABLE processed_products DROP CONSTRAINT IF EXISTS processed_products_feed_id_fkey; ALTER TABLE raw_products DROP CONSTRAINT IF EXISTS raw_products_feed_id_fkey; DROP TABLE IF EXISTS input_feeds;