- Add missing nav keys to types.ts, de.ts, en.ts (sessions, buddies, stats, wishlist) - Add LanguageSwitcher back to authenticated header - Create /sessions page with SessionList - Create /buddies page with BuddyList - Create /stats page with StatsDashboard - Create /wishlist placeholder page
50 lines
1.4 KiB
PL/PgSQL
50 lines
1.4 KiB
PL/PgSQL
-- App Banners Table for dynamic hero content on home page
|
|
|
|
CREATE TABLE IF NOT EXISTS app_banners (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
title TEXT NOT NULL,
|
|
image_url TEXT NOT NULL, -- 16:9 Banner Image
|
|
link_target TEXT, -- e.g., '/sessions'
|
|
cta_text TEXT DEFAULT 'Open',
|
|
is_active BOOLEAN DEFAULT false,
|
|
created_at TIMESTAMPTZ DEFAULT now(),
|
|
updated_at TIMESTAMPTZ DEFAULT now()
|
|
);
|
|
|
|
-- Only one banner should be active at a time (optional constraint)
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_app_banners_active
|
|
ON app_banners (is_active)
|
|
WHERE is_active = true;
|
|
|
|
-- RLS Policies
|
|
ALTER TABLE app_banners ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- Everyone can view active banners
|
|
CREATE POLICY "Anyone can view active banners"
|
|
ON app_banners FOR SELECT
|
|
USING (is_active = true);
|
|
|
|
-- Admins can manage all banners
|
|
CREATE POLICY "Admins can manage banners"
|
|
ON app_banners FOR ALL
|
|
USING (
|
|
EXISTS (
|
|
SELECT 1 FROM admin_users
|
|
WHERE admin_users.user_id = auth.uid()
|
|
)
|
|
);
|
|
|
|
-- Trigger for updated_at
|
|
CREATE OR REPLACE FUNCTION update_app_banners_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = now();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER trigger_app_banners_updated_at
|
|
BEFORE UPDATE ON app_banners
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_app_banners_updated_at();
|