172 lines
5.7 KiB
PL/PgSQL
172 lines
5.7 KiB
PL/PgSQL
-- Table pour les bannières du carousel (gérée par super admin)
|
|
CREATE TABLE IF NOT EXISTS banners (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
image_url TEXT NOT NULL,
|
|
link_url TEXT,
|
|
title TEXT,
|
|
"order" INTEGER DEFAULT 0,
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
);
|
|
|
|
-- Table pour les super admins
|
|
CREATE TABLE IF NOT EXISTS admins (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
email TEXT NOT NULL UNIQUE,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
);
|
|
|
|
-- Table pour les signatures des utilisateurs
|
|
CREATE TABLE IF NOT EXISTS user_signatures (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE UNIQUE,
|
|
email TEXT,
|
|
first_name TEXT,
|
|
last_name TEXT,
|
|
job_title TEXT,
|
|
company TEXT,
|
|
phone TEXT,
|
|
mobile TEXT,
|
|
website TEXT,
|
|
address TEXT,
|
|
photo_url TEXT,
|
|
logo_url TEXT,
|
|
linkedin TEXT,
|
|
twitter TEXT,
|
|
facebook TEXT,
|
|
instagram TEXT,
|
|
primary_color TEXT DEFAULT '#3498db',
|
|
secondary_color TEXT DEFAULT '#2c3e50',
|
|
accent_color TEXT DEFAULT '#5dade2',
|
|
photo_shape TEXT DEFAULT 'hexagon',
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
);
|
|
|
|
-- Index pour optimiser les requêtes
|
|
CREATE INDEX IF NOT EXISTS idx_banners_active ON banners(is_active, "order");
|
|
CREATE INDEX IF NOT EXISTS idx_admins_user_id ON admins(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_user_signatures_user_id ON user_signatures(user_id);
|
|
|
|
-- Fonction pour mettre à jour updated_at automatiquement
|
|
CREATE OR REPLACE FUNCTION update_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Trigger pour mettre à jour updated_at sur banners
|
|
DROP TRIGGER IF EXISTS banners_updated_at ON banners;
|
|
CREATE TRIGGER banners_updated_at
|
|
BEFORE UPDATE ON banners
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_updated_at();
|
|
|
|
-- Trigger pour mettre à jour updated_at sur user_signatures
|
|
DROP TRIGGER IF EXISTS user_signatures_updated_at ON user_signatures;
|
|
CREATE TRIGGER user_signatures_updated_at
|
|
BEFORE UPDATE ON user_signatures
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_updated_at();
|
|
|
|
-- RLS (Row Level Security)
|
|
ALTER TABLE banners ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE admins ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE user_signatures ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- Politique: Tout le monde peut lire les bannières actives
|
|
CREATE POLICY "Bannières actives visibles par tous" ON banners
|
|
FOR SELECT USING (is_active = true);
|
|
|
|
-- Politique: Les admins peuvent TOUT lire (même inactives)
|
|
CREATE POLICY "Admins peuvent tout lire" ON banners
|
|
FOR SELECT USING (
|
|
EXISTS (
|
|
SELECT 1 FROM admins WHERE user_id = auth.uid()
|
|
)
|
|
);
|
|
|
|
-- Politique: Les admins peuvent insérer
|
|
CREATE POLICY "Admins peuvent inserer" ON banners
|
|
FOR INSERT WITH CHECK (
|
|
EXISTS (
|
|
SELECT 1 FROM admins WHERE user_id = auth.uid()
|
|
)
|
|
);
|
|
|
|
-- Politique: Les admins peuvent modifier
|
|
CREATE POLICY "Admins peuvent modifier" ON banners
|
|
FOR UPDATE USING (
|
|
EXISTS (
|
|
SELECT 1 FROM admins WHERE user_id = auth.uid()
|
|
)
|
|
);
|
|
|
|
-- Politique: Les admins peuvent supprimer
|
|
CREATE POLICY "Admins peuvent supprimer" ON banners
|
|
FOR DELETE USING (
|
|
EXISTS (
|
|
SELECT 1 FROM admins WHERE user_id = auth.uid()
|
|
)
|
|
);
|
|
|
|
-- Politique: Un utilisateur peut vérifier s'il est admin (lecture de sa propre entrée)
|
|
CREATE POLICY "Users peuvent verifier leur statut admin" ON admins
|
|
FOR SELECT USING (user_id = auth.uid());
|
|
|
|
-- ==========================================
|
|
-- POLITIQUES POUR user_signatures
|
|
-- ==========================================
|
|
|
|
-- Utilisateurs peuvent lire leur propre signature
|
|
CREATE POLICY "Users peuvent lire leur signature" ON user_signatures
|
|
FOR SELECT USING (user_id = auth.uid());
|
|
|
|
-- Utilisateurs peuvent créer leur propre signature
|
|
CREATE POLICY "Users peuvent creer leur signature" ON user_signatures
|
|
FOR INSERT WITH CHECK (user_id = auth.uid());
|
|
|
|
-- Utilisateurs peuvent modifier leur propre signature
|
|
CREATE POLICY "Users peuvent modifier leur signature" ON user_signatures
|
|
FOR UPDATE USING (user_id = auth.uid());
|
|
|
|
-- Admins peuvent lire TOUTES les signatures
|
|
CREATE POLICY "Admins peuvent lire toutes signatures" ON user_signatures
|
|
FOR SELECT USING (
|
|
EXISTS (SELECT 1 FROM admins WHERE user_id = auth.uid())
|
|
);
|
|
|
|
-- Admins peuvent modifier TOUTES les signatures
|
|
CREATE POLICY "Admins peuvent modifier toutes signatures" ON user_signatures
|
|
FOR UPDATE USING (
|
|
EXISTS (SELECT 1 FROM admins WHERE user_id = auth.uid())
|
|
);
|
|
|
|
-- Admins peuvent créer des signatures pour n'importe qui
|
|
CREATE POLICY "Admins peuvent creer signatures" ON user_signatures
|
|
FOR INSERT WITH CHECK (
|
|
EXISTS (SELECT 1 FROM admins WHERE user_id = auth.uid())
|
|
);
|
|
|
|
-- Admins peuvent supprimer des signatures
|
|
CREATE POLICY "Admins peuvent supprimer signatures" ON user_signatures
|
|
FOR DELETE USING (
|
|
EXISTS (SELECT 1 FROM admins WHERE user_id = auth.uid())
|
|
);
|
|
|
|
-- Insérer l'admin principal
|
|
INSERT INTO admins (user_id, email) VALUES
|
|
('27f80c55-f045-4e6c-9751-56f5c86b71a2', 'admin@navier.net')
|
|
ON CONFLICT (email) DO NOTHING;
|
|
|
|
-- Insérer quelques bannières par défaut (à personnaliser)
|
|
INSERT INTO banners (image_url, link_url, title, "order", is_active) VALUES
|
|
('https://via.placeholder.com/600x150/3498db/ffffff?text=Promotion+1', 'https://example.com/promo1', 'Promotion 1', 1, true),
|
|
('https://via.placeholder.com/600x150/e74c3c/ffffff?text=Promotion+2', 'https://example.com/promo2', 'Promotion 2', 2, true),
|
|
('https://via.placeholder.com/600x150/2ecc71/ffffff?text=Promotion+3', 'https://example.com/promo3', 'Promotion 3', 3, true)
|
|
ON CONFLICT DO NOTHING;
|