118 lines
4.4 KiB
SQL
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;
|