-- ════════════════════════════════════════════════
-- ĐINH LÊ SAFETY - Database Setup Script v2.0
-- Paste toàn bộ vào: Supabase → SQL Editor → Run
-- ════════════════════════════════════════════════
-- [1] Bảng danh mục
CREATE TABLE IF NOT EXISTS categories (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
parent_id TEXT REFERENCES categories(id) ON DELETE CASCADE,
icon TEXT DEFAULT '📦',
description TEXT,
sort_order INT DEFAULT 0,
product_count INT DEFAULT 0
);
-- [2] Bảng sản phẩm
CREATE TABLE IF NOT EXISTS products (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
name TEXT NOT NULL,
category TEXT REFERENCES categories(id) ON DELETE SET NULL,
category_name TEXT,
code TEXT,
price NUMERIC NOT NULL DEFAULT 0,
old_price NUMERIC,
image_url TEXT,
images JSONB DEFAULT '[]',
badge TEXT,
badge_text TEXT,
description TEXT,
specs TEXT,
status TEXT DEFAULT 'in-stock',
featured BOOLEAN DEFAULT false,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- [3] Bảng đơn hàng & liên hệ
CREATE TABLE IF NOT EXISTS orders (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
product_id TEXT,
product_name TEXT,
customer_name TEXT NOT NULL,
customer_phone TEXT NOT NULL,
quantity INT DEFAULT 1,
note TEXT,
status TEXT DEFAULT 'new', -- 'new', 'contacted', 'done'
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- [4] Bảng cài đặt website
CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT
);
-- [5] Đánh giá khách hàng
CREATE TABLE IF NOT EXISTS testimonials (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
name TEXT NOT NULL,
role TEXT,
avatar TEXT,
stars INT DEFAULT 5 CHECK (stars BETWEEN 1 AND 5),
text TEXT NOT NULL,
sort_order INT DEFAULT 0
);
-- [6] Thư viện ảnh
CREATE TABLE IF NOT EXISTS media (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
url TEXT NOT NULL,
filename TEXT,
size_kb INT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- ── Row Level Security ──
ALTER TABLE products ENABLE ROW LEVEL SECURITY;
ALTER TABLE categories ENABLE ROW LEVEL SECURITY;
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
ALTER TABLE settings ENABLE ROW LEVEL SECURITY;
ALTER TABLE testimonials ENABLE ROW LEVEL SECURITY;
ALTER TABLE media ENABLE ROW LEVEL SECURITY;
-- Cho phép đọc công khai (SELECT)
CREATE POLICY "public_read" ON products FOR SELECT USING (true);
CREATE POLICY "public_read" ON categories FOR SELECT USING (true);
CREATE POLICY "public_read" ON settings FOR SELECT USING (true);
CREATE POLICY "public_read" ON testimonials FOR SELECT USING (true);
CREATE POLICY "public_read" ON media FOR SELECT USING (true);
-- Khách hàng được phép tạo đơn hàng (INSERT)
CREATE POLICY "public_insert_orders" ON orders FOR INSERT WITH CHECK (true);
-- Cho phép ghi từ anon key (Admin panel bảo vệ bằng password)
CREATE POLICY "anon_write" ON products FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "anon_write" ON categories FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "anon_write" ON orders FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "anon_write" ON settings FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "anon_write" ON testimonials FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "anon_write" ON media FOR ALL USING (true) WITH CHECK (true);
-- Cho phép upload & quản lý ảnh trong Storage bucket 'products'
CREATE POLICY "Public Upload to products bucket" ON storage.objects FOR ALL USING (bucket_id = 'products') WITH CHECK (bucket_id = 'products');
-- ── Bật Realtime ──
ALTER PUBLICATION supabase_realtime ADD TABLE products;
ALTER PUBLICATION supabase_realtime ADD TABLE settings;
ALTER PUBLICATION supabase_realtime ADD TABLE categories;
ALTER PUBLICATION supabase_realtime ADD TABLE orders;
ALTER PUBLICATION supabase_realtime ADD TABLE testimonials;
-- ── Dữ liệu danh mục mặc định (Hỗ trợ 2 cấp) ──
INSERT INTO categories (id, name, parent_id, icon, sort_order) VALUES
('bao-ve-dau', 'Thiết Bị Bảo Vệ Đầu', null, '🪖', 1),
('bao-ve-mat-mat', 'Thiết Bị Bảo Vệ Mắt - Mặt', null, '🥽', 2),
('bao-ve-tai', 'Thiết Bị Bảo Vệ Tai', null, '👂', 3),
('bao-ve-ho-hap', 'Thiết Bị Bảo Vệ Đường Hô Hấp', null, '😷', 4),
('gang-tay', 'Găng Tay Bảo Hộ Lao Động', null, '🧤', 5),
('trang-phuc', 'Trang Phục Bảo Hộ Lao Động', null, '👷', 6),
('bao-ve-chan', 'Thiết Bị Bảo Vệ Chân', null, '👟', 7),
('chong-dien-giat', 'Thiết bị An toàn chống điện giật', null, '⚡', 8),
('canh-bao-atgt', 'Thiết bị cảnh báo ATGT', null, '🚧', 9),
('ho-tro-sx', 'Thiết bị BHLD hỗ trợ SX, ATLD khác', null, '🔧', 10),
('an-toan-tren-cao', 'Thiết Bị An Toàn Trên Cao', null, '🪢', 11),
('pccc', 'Thiết bị phòng cháy chữa cháy', null, '🧯', 12),
-- Danh mục con mẫu
('mu-bao-ho-ld', 'Mũ Bảo Hộ Lao Động', 'bao-ve-dau', '', 1),
('kinh-bao-ho', 'Kính bảo hộ lao động', 'bao-ve-mat-mat', '', 1),
('nut-tai-chong-on', 'Nút tai chống ồn', 'bao-ve-tai', '', 1),
('gang-tay-cao-su', 'Găng tay cao su', 'gang-tay', '', 1),
('gang-tay-soi', 'Găng tay sợi', 'gang-tay', '', 2)
ON CONFLICT (id) DO NOTHING;
-- ── Cài đặt mặc định ──
INSERT INTO settings (key, value) VALUES
('phone1', '0914.492.356'),
('phone2', '0967.785.386'),
('zalo1', '0914492356'),
('zalo2', '0967785386'),
('email', 'dinhlесafety@gmail.com'),
('address_detail', 'Thái Bình, Việt Nam'),
('facebook', 'https://facebook.com'),
('slogan', 'Giải Pháp Bảo Hộ An Toàn Cho Người Lao Động'),
('hero_title', 'Bảo Hộ Lao Động Chất Lượng Cao'),
('hero_subtitle', 'Hơn 10 năm kinh nghiệm cung cấp thiết bị bảo hộ lao động uy tín tại Thái Bình'),
('stat1_num', '10+'), ('stat1_label', 'Năm Kinh Nghiệm'),
('stat2_num', '5000+'),(''stat2_label', 'Khách Hàng'),
('stat3_num', '1000+'),(''stat3_label', 'Sản Phẩm'),
('seo_title', 'Bảo Hộ Lao Động Đinh Lê Safety - Thái Bình'),
('seo_description','Đinh Lê Safety - Chuyên cung cấp bảo hộ lao động chất lượng cao tại Thái Bình')
ON CONFLICT (key) DO NOTHING;
-- ── Storage Bucket (Tạo thủ công) ──
-- Vào: Supabase → Storage → New Bucket
-- Name: products | Public: ✅ BẬT | Max upload: 5MB