photum/backend/internal/db/schema.sql
NANDO9322 7f1d4144db feat(api): Implementado novas tabelas ,refatorado a autenticação e aprimorado a documentação Swagger
- Implementado CRUDs para: cursos, empresas, anos_formaturas, tipos_servicos, tipos_eventos
- Implementado lógica de precificação de eventos (precos_tipos_eventos)
- Refatorado a autenticação: Simplificar o payload de cadastro/login (somente e-mail/senha), função padrão 'profissional'
- Corrigido o middleware de autenticação: Resolvido a incompatibilidade de tipo UUID vs String (corrigir erro 500)
- Aprimorado o Swagger: Adicionado structs nomeados, validação de duplicatas (409 Conflict) e segurança BearerAuth
- Atualizar o esquema do banco de dados: Adicionar tabelas e restrições
2025-12-09 17:05:19 -03:00

146 lines
6 KiB
SQL

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE usuarios (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
email VARCHAR(255) UNIQUE NOT NULL,
senha_hash VARCHAR(255) NOT NULL,
role VARCHAR(50) NOT NULL DEFAULT 'profissional',
ativo BOOLEAN NOT NULL DEFAULT TRUE,
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE funcoes_profissionais (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
nome VARCHAR(50) UNIQUE NOT NULL,
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
INSERT INTO funcoes_profissionais (nome) VALUES
('Fotógrafo'),
('Cinegrafista'),
('Recepcionista'),
('Fixo Photum'),
('Controle');
CREATE TABLE cadastro_profissionais (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
usuario_id UUID REFERENCES usuarios(id) ON DELETE SET NULL,
nome VARCHAR(255) NOT NULL,
funcao_profissional_id UUID REFERENCES funcoes_profissionais(id) ON DELETE SET NULL,
endereco VARCHAR(255),
cidade VARCHAR(100),
uf CHAR(2),
whatsapp VARCHAR(20),
cpf_cnpj_titular VARCHAR(20),
banco VARCHAR(100),
agencia VARCHAR(20),
conta_pix VARCHAR(120),
carro_disponivel BOOLEAN DEFAULT FALSE,
tem_estudio BOOLEAN DEFAULT FALSE,
qtd_estudio INT,
tipo_cartao VARCHAR(50),
observacao TEXT,
qual_tec INT,
educacao_simpatia INT,
desempenho_evento INT,
disp_horario INT,
media NUMERIC(3,2),
tabela_free VARCHAR(50),
extra_por_equipamento BOOLEAN DEFAULT FALSE,
equipamentos TEXT,
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE refresh_tokens (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
usuario_id UUID NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE,
token_hash VARCHAR(255) NOT NULL,
user_agent VARCHAR(255),
ip VARCHAR(45),
expira_em TIMESTAMPTZ NOT NULL,
revogado BOOLEAN NOT NULL DEFAULT FALSE,
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Cursos Table
CREATE TABLE cursos (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
nome VARCHAR(100) UNIQUE NOT NULL,
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
INSERT INTO cursos (nome) VALUES
('Administração Empresas'), ('Agronomia'), ('Arquitetura / Urbanismo'), ('Biomedicina'), ('Comunicação'), ('Contábeis'),
('Direito'), ('Economia'), ('Educação Física'), ('EFI I/EFI II'), ('EI/EFI'), ('EF II/EM'), ('EFI(5º ano)'), ('EFII'),
('EI'), ('EM'), ('EM / TEC'), ('Enfermagem'), ('Eng. Ambiental'), ('Eng. Elétrica'), ('Engenharia'), ('Estética'),
('Farmácia'), ('Fisioterapia'), ('Gastronomia'), ('Historia'), ('Jornalismo'), ('Med. Veterinária'), ('Medicina'),
('Nutrição'), ('Odontologia'), ('Outro'), ('Pedagogia'), ('Publicidade'), ('Superior Diversos'), ('Tec. Diversos'),
('Termomecânica'), ('Unificados'), ('Tec. Enfermagem'), ('Quimica'), ('EFI / EF II / EM'), ('Psicologia'),
('Terapia Ocupacinal'), ('R.I');
-- Empresas Table
CREATE TABLE empresas (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
nome VARCHAR(100) UNIQUE NOT NULL,
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
INSERT INTO empresas (nome) VALUES
('Arte Formaturas'), ('JR Formaturas'), ('Perfil'), ('Photum'), ('Populi Formaturas'), ('Prime'), ('Smart'), ('Viva SP'),
('Antares'), ('Forcamp'), ('PNI'), ('Fábio Ribeiro'), ('Told - B2_(CAMPINAS)'), ('Told - B2_(RECIFE)'),
('NOVO - Told - B2_(SP)'), ('NOVO - Told - RUB_(SP)'), ('NOVO - TOLD'), ('Alpha Digital'), ('Golden'), ('Festa da Beca'),
('Ponta Eventos'), ('Toy SP'), ('MVP Formaturas'), ('RUB');
-- Anos Formaturas Table
CREATE TABLE anos_formaturas (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
ano_semestre VARCHAR(20) UNIQUE NOT NULL, -- Ex: 2019.2
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
INSERT INTO anos_formaturas (ano_semestre) VALUES
('2019.2'), ('2020.1'), ('2020.2'), ('2021.1'), ('2021.2'), ('2022.1'), ('2022.2'), ('2023.1'), ('2023.2'),
('2024.1'), ('2024.2'), ('2025.1'), ('2025.2'), ('2026.1'), ('2026.2'), ('2027.1'), ('2027.2'), ('2028.1'),
('2028.2'), ('2029.1'), ('2029.2');
-- Tipos Servicos Table
CREATE TABLE tipos_servicos (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
nome VARCHAR(50) UNIQUE NOT NULL,
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
INSERT INTO tipos_servicos (nome) VALUES
('Fotógrafo'), ('Recepcionista'), ('Cinegrafista'), ('Coordenação'), ('Ponto de Foto'), ('Ponto de ID'), ('Estúdio'),
('Outro'), ('Controle');
-- Tipos Eventos Table
CREATE TABLE tipos_eventos (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
nome VARCHAR(100) UNIQUE NOT NULL,
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
INSERT INTO tipos_eventos (nome) VALUES
('Identificação'), ('Baile'), ('Colação'), ('Col/Baile (mesmo local)'), ('Col/Baile (local diferente)'), ('Missa / Culto'),
('Churrasco'), ('Trote'), ('Outro'), ('Balada'), ('Jantar'), ('Festa Junina'), ('Colação Oficial'), ('Family Day'),
('Refeição'), ('Estudio ID e Family Day'), ('Estudio Colação / Baile');
-- Precos Tipos Eventos Table (Junction Table for Pricing)
CREATE TABLE precos_tipos_eventos (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
tipo_evento_id UUID REFERENCES tipos_eventos(id) ON DELETE CASCADE,
funcao_profissional_id UUID REFERENCES funcoes_profissionais(id) ON DELETE CASCADE,
valor NUMERIC(10,2) NOT NULL DEFAULT 0.00,
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE(tipo_evento_id, funcao_profissional_id)
);
-- Initial Pricing Seed (Examples based on image, requires joining IDs which makes raw SQL insert hard without known UUIDs.
-- For simplicity in schema.sql, we'll skip complex dynamic inserts.
-- The user can populate via API or we can write a more complex PL/pgSQL block if absolutely necessary,
-- but usually schema.sql is structure + static data. Dynamic pricing is better handled via admin or separate migration script.
-- Leaving table empty for now, or adding a comment.)