Files
descrybe/apps/api/sql/schema/003_feeds.sql
T
greeneclipse 8580c996c3 Initial commit of Descrybe v2 without local scratch artifacts.
Drop one-shot tmp/axe scripts and agent i18n scratch so the Gitea tree is deployable.
2026-08-09 22:47:43 +02:00

118 lines
4.4 KiB
SQL

-- +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;