Files
PDI-MAKER/init-db.sql
Sergio Correa 0524656198 🚀 Initial commit - PDIMaker v1.0.0
Sistema completo de gestão de PDI com:
- Autenticação com email/senha e Google OAuth
- Workspaces privados isolados
- Sistema de convites com código único
- Interface profissional com Next.js 14
- Backend NestJS com PostgreSQL
- Docker com Nginx e SSL

Desenvolvido por Sergio Correa
2025-11-19 02:09:04 +00:00

81 lines
2.9 KiB
PL/PgSQL

-- Schema PDIMaker
-- Criação de tabelas do sistema
-- Tipos ENUM
CREATE TYPE "Role" AS ENUM ('EMPLOYEE', 'MANAGER', 'HR_ADMIN');
CREATE TYPE "WorkspaceStatus" AS ENUM ('ACTIVE', 'ARCHIVED', 'PENDING_INVITE');
CREATE TYPE "InviteStatus" AS ENUM ('PENDING', 'ACCEPTED', 'EXPIRED', 'CANCELLED');
CREATE TYPE "JournalVisibility" AS ENUM ('PUBLIC', 'PRIVATE', 'SUMMARY');
CREATE TYPE "GoalType" AS ENUM ('TECHNICAL', 'SOFT_SKILL', 'LEADERSHIP', 'CAREER');
CREATE TYPE "GoalStatus" AS ENUM ('NOT_STARTED', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED');
CREATE TYPE "ActionStatus" AS ENUM ('PENDING', 'IN_PROGRESS', 'DONE', 'BLOCKED');
CREATE TYPE "AssessmentType" AS ENUM ('PERSONALITY', 'BEHAVIORAL', 'MOTIVATIONAL', 'VOCATIONAL', 'CUSTOM');
CREATE TYPE "OneOnOneStatus" AS ENUM ('SCHEDULED', 'COMPLETED', 'CANCELLED');
-- Tabela de Usuários
CREATE TABLE IF NOT EXISTS "users" (
"id" TEXT PRIMARY KEY,
"email" TEXT UNIQUE NOT NULL,
"name" TEXT NOT NULL,
"avatar" TEXT,
"role" "Role" DEFAULT 'EMPLOYEE',
"googleId" TEXT UNIQUE,
"createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"lastLoginAt" TIMESTAMP
);
CREATE INDEX idx_users_email ON "users"("email");
-- Tabela de Workspaces
CREATE TABLE IF NOT EXISTS "workspaces" (
"id" TEXT PRIMARY KEY,
"slug" TEXT UNIQUE NOT NULL,
"employeeId" TEXT NOT NULL REFERENCES "users"("id"),
"managerId" TEXT NOT NULL REFERENCES "users"("id"),
"hrId" TEXT REFERENCES "users"("id"),
"status" "WorkspaceStatus" DEFAULT 'ACTIVE',
"config" JSONB,
"createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE UNIQUE INDEX idx_workspace_employee_manager ON "workspaces"("employeeId", "managerId");
CREATE INDEX idx_workspaces_slug ON "workspaces"("slug");
CREATE INDEX idx_workspaces_employee ON "workspaces"("employeeId");
CREATE INDEX idx_workspaces_manager ON "workspaces"("managerId");
-- Tabela de Convites
CREATE TABLE IF NOT EXISTS "invites" (
"id" TEXT PRIMARY KEY,
"email" TEXT NOT NULL,
"role" "Role" NOT NULL,
"token" TEXT UNIQUE NOT NULL,
"invitedBy" TEXT NOT NULL,
"workspaceId" TEXT REFERENCES "workspaces"("id"),
"status" "InviteStatus" DEFAULT 'PENDING',
"expiresAt" TIMESTAMP NOT NULL,
"acceptedAt" TIMESTAMP,
"createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_invites_email ON "invites"("email");
CREATE INDEX idx_invites_token ON "invites"("token");
-- Função para gerar IDs únicos (cuid)
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE OR REPLACE FUNCTION generate_cuid() RETURNS TEXT AS $$
DECLARE
timestamp_part TEXT;
counter_part TEXT;
random_part TEXT;
BEGIN
timestamp_part := to_hex(extract(epoch from now())::bigint);
counter_part := lpad(to_hex((random() * 65535)::int), 4, '0');
random_part := encode(gen_random_bytes(12), 'hex');
RETURN 'c' || timestamp_part || counter_part || random_part;
END;
$$ LANGUAGE plpgsql;