diff --git a/database_migrations/000026_mock_events.down.sql b/database_migrations/000026_mock_events.down.sql
new file mode 100644
index 0000000..40e1309
--- /dev/null
+++ b/database_migrations/000026_mock_events.down.sql
@@ -0,0 +1,63 @@
+BEGIN;
+
+
+--- event processing
+
+DROP TRIGGER amazon_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_amazon_event;
+
+DROP TRIGGER big_cartel_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_big_cartel_event;
+
+DROP TRIGGER ebay_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_ebay_event;
+
+DROP TRIGGER ecwid_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_ecwid_event;
+
+DROP TRIGGER etsy_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_etsy_event;
+
+DROP TRIGGER shopify_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_shopify_event;
+
+DROP TRIGGER square_online_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_square_online_event;
+
+DROP TRIGGER squarespace_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_squarespace_event;
+
+DROP TRIGGER tiktok_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_tiktok_event;
+
+DROP TRIGGER walmart_marketplace_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_walmart_marketplace_event;
+
+DROP TRIGGER wix_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_wix_event;
+
+DROP TRIGGER woo_commerce_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_woo_commerce_event;
+
+DROP TRIGGER zoho_store_events ON mock.raw_shop_events;
+DROP FUNCTION mock.process_raw_zoho_event;
+
+-- event tables
+
+DROP TABLE mock.shop_amazon_events;
+DROP TABLE mock.shop_big_cartel_events;
+DROP TABLE mock.shop_ebay_events;
+DROP TABLE mock.shop_ecwid_events;
+DROP TABLE mock.shop_etsy_events;
+DROP TABLE mock.shop_shopify_events;
+DROP TABLE mock.shop_square_online_events;
+DROP TABLE mock.shop_squarespace_events;
+DROP TABLE mock.shop_tiktok_events;
+DROP TABLE mock.shop_walmart_marketplace_events;
+DROP TABLE mock.shop_wix_events;
+DROP TABLE mock.shop_woo_commerce_events;
+DROP TABLE mock.shop_zoho_events;
+DROP TABLE mock.raw_shop_events;
+
+
+COMMIT;
diff --git a/database_migrations/000026_mock_events.up.sql b/database_migrations/000026_mock_events.up.sql
new file mode 100644
index 0000000..82e26c0
--- /dev/null
+++ b/database_migrations/000026_mock_events.up.sql
@@ -0,0 +1,465 @@
+BEGIN;
+
+
+-- raw store events
+
+CREATE TABLE mock.raw_shop_events (
+ platform TEXT NOT NULL,
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+ raw_payload JSONB NOT NULL,
+ parsed BOOLEAN NOT NULL DEFAULT FALSE,
+
+ PRIMARY KEY (platform, store_id, event_id, event_timestamp)
+);
+
+
+-- processed event tables
+
+CREATE TABLE mock.shop_amazon_events (
+ platform TEXT NOT NULL DEFAULT 'amazon' CHECK (platform = 'amazon'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_big_cartel_events (
+ platform TEXT NOT NULL DEFAULT 'big_cartel' CHECK (platform = 'big_cartel'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_ebay_events (
+ platform TEXT NOT NULL DEFAULT 'ebay' CHECK (platform = 'ebay'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_ecwid_events (
+ platform TEXT NOT NULL DEFAULT 'ecwid' CHECK (platform = 'ecwid'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_etsy_events (
+ platform TEXT NOT NULL DEFAULT 'etsy' CHECK (platform = 'etsy'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_shopify_events (
+ platform TEXT NOT NULL DEFAULT 'shopify' CHECK (platform = 'shopify'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_square_online_events (
+ platform TEXT NOT NULL DEFAULT 'square_online' CHECK (platform = 'square_online'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_squarespace_events (
+ platform TEXT NOT NULL DEFAULT 'squarespace' CHECK (platform = 'squarespace'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_tiktok_events (
+ platform TEXT NOT NULL DEFAULT 'tiktok' CHECK (platform = 'tiktok'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_walmart_marketplace_events (
+ platform TEXT NOT NULL DEFAULT 'walmart_marketplace' CHECK (platform = 'walmart_marketplace'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_wix_events (
+ platform TEXT NOT NULL DEFAULT 'wix' CHECK (platform = 'wix'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_woo_commerce_events (
+ platform TEXT NOT NULL DEFAULT 'woo_commerce' CHECK (platform = 'woo_commerce'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+CREATE TABLE mock.shop_zoho_events (
+ platform TEXT NOT NULL DEFAULT 'zoho' CHECK (platform = 'zoho'),
+ store_id TEXT NOT NULL,
+ event_timestamp TIMESTAMPTZ NOT NULL,
+ event_id TEXT NOT NULL,
+
+ PRIMARY KEY (store_id, event_id, event_timestamp),
+ FOREIGN KEY (platform, store_id, event_id, event_timestamp) REFERENCES mock.raw_shop_events
+);
+
+
+--- event processing
+
+CREATE OR REPLACE FUNCTION mock.process_raw_amazon_event() RETURNS TRIGGER AS $process_raw_amazon_event$
+ BEGIN
+ INSERT INTO mock.shop_amazon_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_amazon_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER amazon_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'amazon')
+ EXECUTE FUNCTION mock.process_raw_amazon_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_big_cartel_event() RETURNS TRIGGER AS $process_raw_big_cartel_event$
+ BEGIN
+ INSERT INTO mock.shop_big_cartel_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_big_cartel_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER big_cartel_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'big_cartel')
+ EXECUTE FUNCTION mock.process_raw_big_cartel_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_ebay_event() RETURNS TRIGGER AS $process_raw_ebay_event$
+ BEGIN
+ INSERT INTO mock.shop_ebay_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_ebay_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER ebay_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'ebay')
+ EXECUTE FUNCTION mock.process_raw_ebay_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_ecwid_event() RETURNS TRIGGER AS $process_raw_ecwid_event$
+ BEGIN
+ INSERT INTO mock.shop_ecwid_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_ecwid_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER ecwid_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'ecwid')
+ EXECUTE FUNCTION mock.process_raw_ecwid_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_etsy_event() RETURNS TRIGGER AS $process_raw_etsy_event$
+ BEGIN
+ INSERT INTO mock.shop_etsy_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_etsy_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER etsy_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'etsy')
+ EXECUTE FUNCTION mock.process_raw_etsy_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_shopify_event() RETURNS TRIGGER AS $process_raw_shopify_event$
+ BEGIN
+ INSERT INTO mock.shop_shopify_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_shopify_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER shopify_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'shopify')
+ EXECUTE FUNCTION mock.process_raw_shopify_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_square_online_event() RETURNS TRIGGER AS $process_raw_square_online_event$
+ BEGIN
+ INSERT INTO mock.shop_square_online_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_square_online_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER square_online_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'square_online')
+ EXECUTE FUNCTION mock.process_raw_square_online_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_squarespace_event() RETURNS TRIGGER AS $process_raw_squarespace_event$
+ BEGIN
+ INSERT INTO mock.shop_squarespace_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_squarespace_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER squarespace_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'squarespace')
+ EXECUTE FUNCTION mock.process_raw_squarespace_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_tiktok_event() RETURNS TRIGGER AS $process_raw_tiktok_event$
+ BEGIN
+ INSERT INTO mock.shop_tiktok_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_tiktok_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER tiktok_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'tiktok')
+ EXECUTE FUNCTION mock.process_raw_tiktok_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_walmart_marketplace_event() RETURNS TRIGGER AS $process_raw_walmart_marketplace_event$
+ BEGIN
+ INSERT INTO mock.shop_walmart_marketplace_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_walmart_marketplace_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER walmart_marketplace_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'walmart_marketplace')
+ EXECUTE FUNCTION mock.process_raw_walmart_marketplace_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_wix_event() RETURNS TRIGGER AS $process_raw_wix_event$
+ BEGIN
+ INSERT INTO mock.shop_wix_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_wix_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER wix_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'wix')
+ EXECUTE FUNCTION mock.process_raw_wix_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_woo_commerce_event() RETURNS TRIGGER AS $process_raw_woo_commerce_event$
+ BEGIN
+ INSERT INTO mock.shop_woo_commerce_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_woo_commerce_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER woo_commerce_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'woo_commerce')
+ EXECUTE FUNCTION mock.process_raw_woo_commerce_event();
+
+
+CREATE OR REPLACE FUNCTION mock.process_raw_zoho_event() RETURNS TRIGGER AS $process_raw_zoho_event$
+ BEGIN
+ INSERT INTO mock.shop_zoho_events (
+ platform,
+ store_id,
+ event_timestamp,
+ event_id
+ )
+ SELECT
+ NEW.platform,
+ NEW.store_id,
+ NEW.event_timestamp,
+ NEW.event_id;
+ RETURN NULL;
+ END;
+$process_raw_zoho_event$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE TRIGGER zoho_store_events
+ AFTER INSERT ON mock.raw_shop_events
+ FOR EACH ROW
+ WHEN (NEW.platform = 'zoho')
+ EXECUTE FUNCTION mock.process_raw_zoho_event();
+
+
+COMMIT;
diff --git a/diagrams/database_schema_mock.svg b/diagrams/database_schema_mock.svg
index e8c2191..74e5e3b 100644
--- a/diagrams/database_schema_mock.svg
+++ b/diagrams/database_schema_mock.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/diagrams/database_schema_mock.uml b/diagrams/database_schema_mock.uml
index 1927ed5..cb767ac 100644
--- a/diagrams/database_schema_mock.uml
+++ b/diagrams/database_schema_mock.uml
@@ -9,6 +9,16 @@ entity "**accounts**" {
*""user_id"": //text [FK]//
}
+entity "**raw_shop_events**" {
+ + ""platform"": //text [PK]//
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""raw_payload"": //jsonb //
+ *""parsed"": //boolean //
+}
+
entity "**shop_amazon**" {
+ ""account_id"": //integer [PK][FK]//
+ ""shop_id"": //text [PK]//
@@ -17,6 +27,14 @@ entity "**shop_amazon**" {
*""name"": //text //
}
+entity "**shop_amazon_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_amazon_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -63,6 +81,14 @@ entity "**shop_big_cartel**" {
*""name"": //text //
}
+entity "**shop_big_cartel_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_big_cartel_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -109,6 +135,14 @@ entity "**shop_ebay**" {
*""name"": //text //
}
+entity "**shop_ebay_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_ebay_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -155,6 +189,14 @@ entity "**shop_ecwid**" {
*""name"": //text //
}
+entity "**shop_ecwid_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_ecwid_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -201,6 +243,14 @@ entity "**shop_etsy**" {
*""name"": //text //
}
+entity "**shop_etsy_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_etsy_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -247,6 +297,14 @@ entity "**shop_shopify**" {
*""name"": //text //
}
+entity "**shop_shopify_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_shopify_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -293,6 +351,14 @@ entity "**shop_square_online**" {
*""name"": //text //
}
+entity "**shop_square_online_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_square_online_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -339,6 +405,14 @@ entity "**shop_squarespace**" {
*""name"": //text //
}
+entity "**shop_squarespace_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_squarespace_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -385,6 +459,14 @@ entity "**shop_tiktok**" {
*""name"": //text //
}
+entity "**shop_tiktok_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_tiktok_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -431,6 +513,14 @@ entity "**shop_walmart_marketplace**" {
*""name"": //text //
}
+entity "**shop_walmart_marketplace_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_walmart_marketplace_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -477,6 +567,14 @@ entity "**shop_wix**" {
*""name"": //text //
}
+entity "**shop_wix_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_wix_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -523,6 +621,14 @@ entity "**shop_woo_commerce**" {
*""name"": //text //
}
+entity "**shop_woo_commerce_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_woo_commerce_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -569,6 +675,14 @@ entity "**shop_zoho**" {
*""name"": //text //
}
+entity "**shop_zoho_events**" {
+ + ""store_id"": //text [PK]//
+ + ""event_timestamp"": //timestamp with time zone [PK][FK]//
+ + ""event_id"": //text [PK]//
+ --
+ *""platform"": //text //
+}
+
entity "**shop_zoho_listings**" {
+ ""shop_id"": //text [PK][FK]//
+ ""listing_id"": //text [PK]//
@@ -654,6 +768,8 @@ entity "**sync_groups**" {
"**shop_amazon**" }-- "**public.oauth_users**"
+"**shop_amazon_events**" ||-|| "**raw_shop_events**"
+
"**shop_amazon_listings**" }-- "**accounts**"
"**shop_amazon_listings**" ||-|| "**shop_amazon**"
@@ -684,6 +800,8 @@ entity "**sync_groups**" {
"**shop_big_cartel**" }-- "**public.oauth_users**"
+"**shop_big_cartel_events**" ||-|| "**raw_shop_events**"
+
"**shop_big_cartel_listings**" }-- "**accounts**"
"**shop_big_cartel_listings**" ||-|| "**shop_big_cartel**"
@@ -714,6 +832,8 @@ entity "**sync_groups**" {
"**shop_ebay**" }-- "**public.oauth_users**"
+"**shop_ebay_events**" ||-|| "**raw_shop_events**"
+
"**shop_ebay_listings**" }-- "**accounts**"
"**shop_ebay_listings**" ||-|| "**shop_ebay**"
@@ -744,6 +864,8 @@ entity "**sync_groups**" {
"**shop_ecwid**" }-- "**public.oauth_users**"
+"**shop_ecwid_events**" ||-|| "**raw_shop_events**"
+
"**shop_ecwid_listings**" }-- "**accounts**"
"**shop_ecwid_listings**" ||-|| "**shop_ecwid**"
@@ -774,6 +896,8 @@ entity "**sync_groups**" {
"**shop_etsy**" }-- "**public.oauth_users**"
+"**shop_etsy_events**" ||-|| "**raw_shop_events**"
+
"**shop_etsy_listings**" }-- "**accounts**"
"**shop_etsy_listings**" ||-|| "**shop_etsy**"
@@ -804,6 +928,8 @@ entity "**sync_groups**" {
"**shop_shopify**" }-- "**public.oauth_users**"
+"**shop_shopify_events**" ||-|| "**raw_shop_events**"
+
"**shop_shopify_listings**" }-- "**accounts**"
"**shop_shopify_listings**" ||-|| "**shop_shopify**"
@@ -834,6 +960,8 @@ entity "**sync_groups**" {
"**shop_square_online**" }-- "**public.oauth_users**"
+"**shop_square_online_events**" ||-|| "**raw_shop_events**"
+
"**shop_square_online_listings**" }-- "**accounts**"
"**shop_square_online_listings**" ||-|| "**shop_square_online**"
@@ -864,6 +992,8 @@ entity "**sync_groups**" {
"**shop_squarespace**" }-- "**public.oauth_users**"
+"**shop_squarespace_events**" ||-|| "**raw_shop_events**"
+
"**shop_squarespace_listings**" }-- "**accounts**"
"**shop_squarespace_listings**" ||-|| "**shop_squarespace**"
@@ -894,6 +1024,8 @@ entity "**sync_groups**" {
"**shop_tiktok**" }-- "**public.oauth_users**"
+"**shop_tiktok_events**" ||-|| "**raw_shop_events**"
+
"**shop_tiktok_listings**" }-- "**accounts**"
"**shop_tiktok_listings**" ||-|| "**shop_tiktok**"
@@ -924,6 +1056,8 @@ entity "**sync_groups**" {
"**shop_walmart_marketplace**" }-- "**public.oauth_users**"
+"**shop_walmart_marketplace_events**" ||-|| "**raw_shop_events**"
+
"**shop_walmart_marketplace_listings**" }-- "**accounts**"
"**shop_walmart_marketplace_listings**" ||-|| "**shop_walmart_marketplace**"
@@ -954,6 +1088,8 @@ entity "**sync_groups**" {
"**shop_wix**" }-- "**public.oauth_users**"
+"**shop_wix_events**" ||-|| "**raw_shop_events**"
+
"**shop_wix_listings**" }-- "**accounts**"
"**shop_wix_listings**" ||-|| "**shop_wix**"
@@ -984,6 +1120,8 @@ entity "**sync_groups**" {
"**shop_woo_commerce**" }-- "**public.oauth_users**"
+"**shop_woo_commerce_events**" ||-|| "**raw_shop_events**"
+
"**shop_woo_commerce_listings**" }-- "**accounts**"
"**shop_woo_commerce_listings**" ||-|| "**shop_woo_commerce**"
@@ -1014,6 +1152,8 @@ entity "**sync_groups**" {
"**shop_zoho**" }-- "**public.oauth_users**"
+"**shop_zoho_events**" ||-|| "**raw_shop_events**"
+
"**shop_zoho_listings**" }-- "**accounts**"
"**shop_zoho_listings**" ||-|| "**shop_zoho**"
diff --git a/styles/index.css b/styles/index.css
index a5cb07d..fd63b68 100644
--- a/styles/index.css
+++ b/styles/index.css
@@ -197,6 +197,29 @@
.bottom-0 {
bottom: calc(var(--spacing) * 0);
}
+ .grid-table-\[1fr_1fr_1fr_1fr_1fr_1fr\] {
+ &:is(table) {
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;
+ & > :is(thead, tbody, tfoot) {
+ grid-column-start: 1;
+ grid-column-end: -1;
+ display: grid;
+ grid-template-columns: subgrid;
+ & > tr {
+ grid-column-start: 1;
+ grid-column-end: -1;
+ display: grid;
+ grid-template-columns: subgrid;
+ & > th, & > td {
+ grid-column: span 1;
+ align-content: center;
+ text-align: center;
+ }
+ }
+ }
+ }
+ }
.grid-table-\[1fr_1fr_1fr_1fr_1fr_1fr_1fr\] {
&:is(table) {
display: grid;
@@ -289,6 +312,9 @@
.mt-\[3em\] {
margin-top: 3em;
}
+ .mb-0 {
+ margin-bottom: calc(var(--spacing) * 0);
+ }
.mb-\[0\.5em\] {
margin-bottom: 0.5em;
}
@@ -301,6 +327,9 @@
.mb-\[3em\] {
margin-bottom: 3em;
}
+ .ml-\[0\.5em\] {
+ margin-left: 0.5em;
+ }
.ml-\[1em\] {
margin-left: 1em;
}
@@ -370,6 +399,9 @@
.flex-shrink {
flex-shrink: 1;
}
+ .flex-grow {
+ flex-grow: 1;
+ }
.flex-grow-\[1\] {
flex-grow: 1;
}
@@ -385,6 +417,12 @@
.basis-full {
flex-basis: 100%;
}
+ .border-collapse {
+ border-collapse: collapse;
+ }
+ .transform {
+ transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
+ }
.animate-pulse {
animation: var(--animate-pulse);
}
@@ -495,6 +533,15 @@
.border-\[gray\] {
border-color: gray;
}
+ .border-\[red\] {
+ border-color: red;
+ }
+ .border-\[white\] {
+ border-color: white;
+ }
+ .border-accent {
+ border-color: var(--accent);
+ }
.border-border {
border-color: var(--border);
}
@@ -507,6 +554,9 @@
.border-sidebar-border {
border-color: var(--sidebar-border);
}
+ .bg-\[red\] {
+ background-color: red;
+ }
.bg-accent {
background-color: var(--accent);
}
@@ -519,6 +569,9 @@
.bg-card {
background-color: var(--card);
}
+ .bg-none {
+ background-image: none;
+ }
.p-\[0\.5em\] {
padding: 0.5em;
}
@@ -558,6 +611,9 @@
.font-display {
font-family: var(--display-family);
}
+ .font-text {
+ font-family: var(--text-family);
+ }
.text-lg {
font-size: var(--text-lg);
line-height: var(--tw-leading, var(--text-lg--line-height));
@@ -573,6 +629,10 @@
.text-\[1\.5em\] {
font-size: 1.5em;
}
+ .font-\[1\.5em\] {
+ --tw-font-weight: 1.5em;
+ font-weight: 1.5em;
+ }
.font-bold {
--tw-font-weight: var(--font-weight-bold);
font-weight: var(--font-weight-bold);
@@ -584,6 +644,12 @@
.text-nowrap {
text-wrap: nowrap;
}
+ .text-wrap {
+ text-wrap: wrap;
+ }
+ .text-inherit {
+ color: inherit;
+ }
.capitalize {
text-transform: capitalize;
}
@@ -593,13 +659,24 @@
.underline {
text-decoration-line: underline;
}
+ .outline {
+ outline-style: var(--tw-outline-style);
+ outline-width: 1px;
+ }
.outline-1 {
outline-style: var(--tw-outline-style);
outline-width: 1px;
}
+ .outline-\[1px\] {
+ outline-style: var(--tw-outline-style);
+ outline-width: 1px;
+ }
.outline-\(--table-tfoot\) {
outline-color: var(--table-tfoot);
}
+ .outline-\[red\] {
+ outline-color: red;
+ }
.filter {
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
}
@@ -613,6 +690,16 @@
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
transition-duration: var(--tw-duration, var(--default-transition-duration));
}
+ .\*\:bg-background {
+ :is(& > *) {
+ background-color: var(--background);
+ }
+ }
+ .\*\*\:bg-background {
+ :is(& *) {
+ background-color: var(--background);
+ }
+ }
.not-open\:mb-\[1em\] {
&:not(*:is([open], :popover-open, :open)) {
margin-bottom: 1em;
@@ -1167,6 +1254,26 @@
}
}
}
+@property --tw-rotate-x {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-rotate-y {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-rotate-z {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-skew-x {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-skew-y {
+ syntax: "*";
+ inherits: false;
+}
@property --tw-border-style {
syntax: "*";
inherits: false;
@@ -1249,26 +1356,6 @@
inherits: false;
initial-value: 1;
}
-@property --tw-rotate-x {
- syntax: "*";
- inherits: false;
-}
-@property --tw-rotate-y {
- syntax: "*";
- inherits: false;
-}
-@property --tw-rotate-z {
- syntax: "*";
- inherits: false;
-}
-@property --tw-skew-x {
- syntax: "*";
- inherits: false;
-}
-@property --tw-skew-y {
- syntax: "*";
- inherits: false;
-}
@property --tw-content {
syntax: "*";
initial-value: "";
@@ -1286,6 +1373,11 @@
@layer properties {
@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
*, ::before, ::after, ::backdrop {
+ --tw-rotate-x: initial;
+ --tw-rotate-y: initial;
+ --tw-rotate-z: initial;
+ --tw-skew-x: initial;
+ --tw-skew-y: initial;
--tw-border-style: solid;
--tw-font-weight: initial;
--tw-outline-style: solid;
@@ -1305,11 +1397,6 @@
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-scale-z: 1;
- --tw-rotate-x: initial;
- --tw-rotate-y: initial;
- --tw-rotate-z: initial;
- --tw-skew-x: initial;
- --tw-skew-y: initial;
--tw-content: "";
--tw-leading: initial;
}