1. Tabela usuarios
CREATE TABLE public.usuarios (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
nome TEXT,
email TEXT NOT NULL UNIQUE,
senha TEXT NOT NULL,
telefone TEXT,
avatar_url TEXT,
papel TEXT,
empresa_ref BIGINT,
user_id UUID REFERENCES auth.users(id),
created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
CONSTRAINT usuarios_empresa_ref_fkey FOREIGN KEY (empresa_ref) REFERENCES empresa (id)
);
2. Tabela produtos
CREATE TABLE public.produtos (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
nome TEXT NOT NULL,
descricao TEXT,
preco NUMERIC(10,2),
categoria TEXT,
imagem_principal TEXT,
link_afiliado TEXT,
tipo TEXT DEFAULT 'proprio',
ativo BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
);
3. Tabela fotos_produtos
CREATE TABLE public.fotos_produtos (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
produto_id BIGINT NOT NULL REFERENCES produtos(id) ON DELETE CASCADE,
url TEXT NOT NULL
);
4. Tabela avaliacoes
CREATE TABLE public.avaliacoes (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
produto_id BIGINT NOT NULL REFERENCES produtos(id) ON DELETE CASCADE,
usuario_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
nota INTEGER CHECK (nota >= 1 AND nota <= 5),
comentario TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
UNIQUE (produto_id, usuario_id)
);
5. Tabela pedidos
CREATE TABLE pedidos (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
usuario_id UUID REFERENCES auth.users(id),
status TEXT DEFAULT 'pendente',
total NUMERIC(10,2),
created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
);
6. Tabela itens_pedido
CREATE TABLE itens_pedido (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
pedido_id BIGINT REFERENCES pedidos(id) ON DELETE CASCADE,
produto_id BIGINT REFERENCES produtos(id),
quantidade INTEGER,
preco_unitario NUMERIC(10,2)
);
7. View vw_media_avaliacoes
CREATE VIEW vw_media_avaliacoes AS
SELECT
p.id AS produto_id,
p.nome,
COUNT(a.id) AS total_avaliacoes,
ROUND(AVG(a.nota)::numeric, 2) AS media_estrela
FROM produtos p
LEFT JOIN avaliacoes a ON a.produto_id = p.id
GROUP BY p.id, p.nome;
8. View vw_total_usuarios
CREATE VIEW vw_total_usuarios AS
SELECT COUNT(*) AS total_usuarios FROM usuarios;
9. View vw_total_produtos
CREATE VIEW vw_total_produtos AS
SELECT COUNT(*) AS total_produtos FROM produtos;
10. View vw_total_produtos_por_categoria
CREATE VIEW vw_total_produtos_por_categoria AS
SELECT categoria, COUNT(*) AS total FROM produtos GROUP BY categoria;
11. View vw_total_produtos_novos
CREATE VIEW vw_total_produtos_novos AS
SELECT COUNT(*) AS total_novos FROM produtos WHERE tipo = 'novo';
12. View vw_total_produtos_usados
CREATE VIEW vw_total_produtos_usados AS
SELECT COUNT(*) AS total_usados FROM produtos WHERE tipo = 'usado';
13. View vw_total_produtos_vendidos
CREATE VIEW vw_total_produtos_vendidos AS
SELECT SUM(quantidade) AS total_vendidos FROM itens_pedido;
🎯 Testes de Inserção e Limpeza
-- Inserts de teste
-- Usuário de exemplo
INSERT INTO usuarios (nome, email, senha, telefone, avatar_url, papel)
VALUES
('João Admin', 'admin@teste.com', 'senha123', '69999999999', 'https://exemplo.com/avatar1.png', 'admin'),
('Maria Usuária', 'maria@teste.com', 'senha456', '69999999988', 'https://exemplo.com/avatar2.png', 'user');
-- Produtos de exemplo
INSERT INTO produtos (nome, descricao, preco, categoria, imagem_principal, tipo)
VALUES
('Fone de Ouvido', 'Fone com Bluetooth e som limpo', 199.99, 'Eletrônicos', 'https://exemplo.com/fone.jpg', 'novo'),
('Notebook Usado', 'Notebook semi-novo com SSD', 2499.90, 'Informática', 'https://exemplo.com/notebook.jpg', 'usado');
-- Fotos dos produtos
INSERT INTO fotos_produtos (produto_id, url)
VALUES
(1, 'https://exemplo.com/fone1.jpg'),
(1, 'https://exemplo.com/fone2.jpg'),
(2, 'https://exemplo.com/notebook1.jpg');
-- Avaliações
INSERT INTO avaliacoes (produto_id, usuario_id, nota, comentario)
VALUES
(1, '00000000-0000-0000-0000-000000000000', 5, 'Produto ótimo!'),
(2, '00000000-0000-0000-0000-000000000000', 4, 'Bom custo-benefício.');
-- Pedidos
INSERT INTO pedidos (usuario_id, status, total)
VALUES
('00000000-0000-0000-0000-000000000000', 'pago', 199.99);
-- Itens do pedido
INSERT INTO itens_pedido (pedido_id, produto_id, quantidade, preco_unitario)
VALUES
(1, 1, 1, 199.99);
-- Limpar dados de teste (DELETE)
-- ATENÇÃO: Use com cuidado em ambiente real
-- DELETE FROM itens_pedido;
-- DELETE FROM pedidos;
-- DELETE FROM avaliacoes;
-- DELETE FROM fotos_produtos;
-- DELETE FROM produtos;
-- DELETE FROM usuarios;