Este guia explica como configurar o Supabase para o projeto EventFlow.
- Acesse https://supabase.com
- Clique em "Start your project" e faça login (pode usar GitHub, Google, etc.)
- Clique em "New Project"
- Preencha:
- Name: EventFlow (ou nome de sua preferência)
- Database Password: Crie uma senha forte (guarde-a!)
- Region: Escolha a mais próxima (ex: South America - São Paulo)
- Clique em "Create new project" e aguarde a criação
- Ative o plugin "chron":
- No menu principal, vá em Integrations
- Procure por "chron - schedule recurring Job in Postgres"
- Clique em Enable chron
Após o projeto ser criado, vá em SQL Editor no menu lateral e execute o seguinte SQL:
-- Criar tabela de eventos
CREATE TABLE eventos (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
nome TEXT NOT NULL,
descricao TEXT,
data_evento TEXT NOT NULL,
horario TEXT NOT NULL,
dia_semana TEXT NOT NULL,
periodo TEXT NOT NULL CHECK (periodo IN ('Matinal', 'Diurno', 'Vespertino', 'Noturno')),
link TEXT NOT NULL,
imagem TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Criar índice para ordenação por data
CREATE INDEX idx_eventos_data ON eventos(data_evento);
-- Habilitar Row Level Security (RLS)
ALTER TABLE eventos ENABLE ROW LEVEL SECURITY;
-- Política para permitir leitura pública (qualquer um pode ver eventos)
CREATE POLICY "Eventos são públicos para leitura" ON eventos
FOR SELECT
USING (true);
-- Política para permitir inserção apenas por usuários autenticados
CREATE POLICY "Usuários autenticados podem criar eventos" ON eventos
FOR INSERT
WITH CHECK (auth.role() = 'authenticated');
-- Política para permitir atualização apenas por usuários autenticados
CREATE POLICY "Usuários autenticados podem atualizar eventos" ON eventos
FOR UPDATE
USING (auth.role() = 'authenticated');
-- Política para permitir exclusão apenas por usuários autenticados
CREATE POLICY "Usuários autenticados podem deletar eventos" ON eventos
FOR DELETE
USING (auth.role() = 'authenticated');
-- Função para atualizar updated_at automaticamente
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';
-- Trigger para atualizar updated_at
CREATE TRIGGER update_eventos_updated_at
BEFORE UPDATE ON eventos
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();Clique em Run para executar o SQL.
Vá em Storage no menu lateral e:
- Clique em New Bucket
- Preencha:
- Name:
imagens - Marque Public bucket (para imagens públicas)
- Name:
- Clique em Create bucket
Depois, configure as políticas do bucket. Vá em Policies dentro do bucket imagens e adicione:
-- No SQL Editor, execute:
CREATE POLICY "Imagens são públicas" ON storage.objects
FOR SELECT
USING (bucket_id = 'imagens');CREATE POLICY "Usuários autenticados podem fazer upload" ON storage.objects
FOR INSERT
WITH CHECK (bucket_id = 'imagens' AND auth.role() = 'authenticated');CREATE POLICY "Usuários autenticados podem deletar imagens" ON storage.objects
FOR DELETE
USING (bucket_id = 'imagens' AND auth.role() = 'authenticated');OU configure via interface:
- Vá em Storage > imagens > Policies
- Clique em "New Policy"
- Selecione "For full customization"
- Configure cada política conforme necessário
Vá em Authentication > Users no menu lateral e clique em Add User:
- Preencha:
- Email: seu-email@exemplo.com
- Password: sua-senha-segura
- Marque a opção Auto Confirm User
- Clique em Create User
Vá em Settings > API no menu lateral:
- Copie a Project URL (ex:
https://abc123.supabase.co) - Copie a anon public key (em Project API keys)
Crie ou edite o arquivo .env na raiz do projeto:
VITE_SUPABASE_URL=https://seu-projeto.supabase.co
VITE_SUPABASE_ANON_KEY=sua-anon-key-aquiIMPORTANTE: Nunca commite o arquivo .env no Git! Ele já está no .gitignore.
-
Inicie o servidor de desenvolvimento:
pnpm dev
-
Acesse
http://localhost:5173para ver a página pública -
Acesse
http://localhost:5173/adminpara fazer login com o usuário criado
No SQL Editor do Supabase, execute:
INSERT INTO eventos (nome, descricao, data_evento, horario, dia_semana, periodo, link, imagem) VALUES
('Workshop de React', 'Aprenda React do zero ao avançado com projetos práticos.', '15/02/2025', '19:00', 'Sábado', 'Noturno', 'https://exemplo.com/react', NULL),
('Meetup de JavaScript', 'Encontro da comunidade JS para networking e palestras.', '20/02/2025', '18:30', 'Quinta-feira', 'Vespertino', 'https://exemplo.com/js', NULL),
('Conferência de Tech', 'O maior evento de tecnologia do ano com palestrantes internacionais.', '01/03/2025', '09:00', 'Sábado', 'Matinal', 'https://exemplo.com/tech', NULL);| Campo | Tipo | Descrição |
|---|---|---|
| id | UUID | Identificador único (gerado automaticamente) |
| nome | TEXT | Nome do evento |
| descricao | TEXT | Descrição detalhada do evento (opcional) |
| data_evento | TEXT | Data no formato "DD/MM/YYYY" |
| horario | TEXT | Horário no formato "HH:MM" |
| dia_semana | TEXT | Dia da semana por extenso |
| periodo | TEXT | Matinal, Diurno, Vespertino ou Noturno |
| link | TEXT | URL para participação/inscrição |
| imagem | TEXT | URL da imagem do evento (opcional) |
| modalidade | TEXT | Presencial, Online ou Híbrido (opcional) |
| endereco | TEXT | Endereço do evento (opcional) |
| cidade | TEXT | Cidade do evento (opcional) |
| estado | TEXT | Estado (UF) do evento (opcional) |
| created_at | TIMESTAMP | Data de criação (automático) |
| updated_at | TIMESTAMP | Data de atualização (automático) |
| Campo | Tipo | Descrição |
|---|---|---|
| id | UUID | Identificador único (gerado automaticamente) |
| nome | TEXT | Nome da tag (ex: React, Node.js) |
| cor | TEXT | Cor em hexadecimal (ex: #2563eb) |
| created_at | TIMESTAMP | Data de criação (automático) |
| updated_at | TIMESTAMP | Data de atualização (automático) |
| Campo | Tipo | Descrição |
|---|---|---|
| evento_id | UUID | Referência ao evento (CASCADE ao deletar) |
| tag_id | UUID | Referência à tag (CASCADE ao deletar) |
O bucket imagens armazena as imagens dos eventos:
- Limite: 5MB por arquivo
- Formatos: PNG, JPG, JPEG, GIF, WebP
- Acesso: Público para leitura
- Upload/Delete: Apenas usuários autenticados
As imagens são salvas com nome único gerado automaticamente para evitar conflitos.
As políticas de segurança configuradas garantem que:
- Leitura: Qualquer pessoa pode ver os eventos (público)
- Criação/Edição/Exclusão: Apenas usuários autenticados (admins)
- Imagens: Públicas para visualização, upload/delete apenas por admins
src/
├── lib/
│ └── supabase.js # Cliente Supabase
├── services/
│ ├── authService.js # Serviço de autenticação
│ ├── eventService.js # Serviço de eventos (CRUD + Upload)
│ ├── contributorService.js # Serviço de contribuintes
│ └── tagService.js # Serviço de tags (CRUD + associação)
├── admin/
│ ├── Login.jsx # Login com Supabase Auth
│ ├── Dashboard.jsx # Dashboard com CRUD e Upload
│ └── Admin.css # Estilos do admin
└── App.jsx # App público com Supabase
- Upload de Imagem: Arraste ou clique para fazer upload direto no Supabase Storage
- URL de Imagem: Também pode colar URL externa de imagem
- Descrição: Campo de texto para descrever o evento
- Preview: Visualização da imagem antes de salvar
- Tags de Tecnologia: CRUD de tags com cor customizada e associação N:N com eventos
- Modalidade: Presencial, Online ou Híbrido para cada evento
- Localização: Endereço, cidade e estado com link para Google Maps
# Instalar dependências
pnpm install
# Iniciar desenvolvimento
pnpm dev
# Build para produção
pnpm build
# Preview do build
pnpm previewPara mais informações sobre o Supabase: