added post insight feature

This commit is contained in:
2026-02-25 15:07:53 +01:00
parent 7c9866c0a6
commit a3ea774b58
9 changed files with 992 additions and 1 deletions

View File

@@ -0,0 +1,122 @@
-- Migration: Add LinkedIn post insights tables (daily snapshots)
-- Description: Stores scraped post stats separately from linkedin_posts
CREATE TABLE IF NOT EXISTS linkedin_post_insights_posts (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
linkedin_account_id UUID REFERENCES linkedin_accounts(id) ON DELETE SET NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
-- Identity
post_urn TEXT NOT NULL,
post_url TEXT,
-- Content
post_text TEXT,
post_date TIMESTAMP WITH TIME ZONE,
author_username TEXT,
-- Latest known totals (optional convenience)
total_reactions INTEGER DEFAULT 0,
likes INTEGER DEFAULT 0,
comments INTEGER DEFAULT 0,
shares INTEGER DEFAULT 0,
reactions_breakdown JSONB DEFAULT '{}'::JSONB,
-- Raw data snapshot
raw_data JSONB,
first_seen_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(user_id, post_urn)
);
CREATE TABLE IF NOT EXISTS linkedin_post_insights_daily (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
post_id UUID NOT NULL REFERENCES linkedin_post_insights_posts(id) ON DELETE CASCADE,
snapshot_date DATE NOT NULL,
total_reactions INTEGER DEFAULT 0,
likes INTEGER DEFAULT 0,
comments INTEGER DEFAULT 0,
shares INTEGER DEFAULT 0,
reactions_breakdown JSONB DEFAULT '{}'::JSONB,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(post_id, snapshot_date)
);
CREATE INDEX IF NOT EXISTS idx_post_insights_posts_user_id ON linkedin_post_insights_posts(user_id);
CREATE INDEX IF NOT EXISTS idx_post_insights_posts_post_date ON linkedin_post_insights_posts(post_date);
CREATE INDEX IF NOT EXISTS idx_post_insights_daily_user_id ON linkedin_post_insights_daily(user_id);
CREATE INDEX IF NOT EXISTS idx_post_insights_daily_snapshot_date ON linkedin_post_insights_daily(snapshot_date);
-- Triggers for updated_at
CREATE OR REPLACE FUNCTION update_linkedin_post_insights_posts_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS update_linkedin_post_insights_posts_updated_at ON linkedin_post_insights_posts;
CREATE TRIGGER update_linkedin_post_insights_posts_updated_at
BEFORE UPDATE ON linkedin_post_insights_posts
FOR EACH ROW
EXECUTE FUNCTION update_linkedin_post_insights_posts_updated_at();
CREATE OR REPLACE FUNCTION update_linkedin_post_insights_daily_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS update_linkedin_post_insights_daily_updated_at ON linkedin_post_insights_daily;
CREATE TRIGGER update_linkedin_post_insights_daily_updated_at
BEFORE UPDATE ON linkedin_post_insights_daily
FOR EACH ROW
EXECUTE FUNCTION update_linkedin_post_insights_daily_updated_at();
-- Enable RLS
ALTER TABLE linkedin_post_insights_posts ENABLE ROW LEVEL SECURITY;
ALTER TABLE linkedin_post_insights_daily ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can view own post insights posts"
ON linkedin_post_insights_posts FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "Users can insert own post insights posts"
ON linkedin_post_insights_posts FOR INSERT
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can update own post insights posts"
ON linkedin_post_insights_posts FOR UPDATE
USING (auth.uid() = user_id);
CREATE POLICY "Users can delete own post insights posts"
ON linkedin_post_insights_posts FOR DELETE
USING (auth.uid() = user_id);
CREATE POLICY "Users can view own post insights daily"
ON linkedin_post_insights_daily FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "Users can insert own post insights daily"
ON linkedin_post_insights_daily FOR INSERT
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can update own post insights daily"
ON linkedin_post_insights_daily FOR UPDATE
USING (auth.uid() = user_id);
CREATE POLICY "Users can delete own post insights daily"
ON linkedin_post_insights_daily FOR DELETE
USING (auth.uid() = user_id);