Files
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

85 lines
2.2 KiB
TypeScript

// app/api/invites/accept/route.ts
import { NextRequest, NextResponse } from "next/server"
import { getServerSession } from "next-auth"
import { authOptions } from "@/lib/auth/config"
import { prisma } from "@/lib/prisma"
export async function POST(request: NextRequest) {
try {
const session = await getServerSession(authOptions)
if (!session) {
return NextResponse.json({ error: "Não autenticado" }, { status: 401 })
}
const { inviteCode } = await request.json()
if (!inviteCode) {
return NextResponse.json({ error: "Código de convite inválido" }, { status: 400 })
}
// Buscar convite
const invite = await prisma.invite.findUnique({
where: { token: inviteCode }
})
if (!invite) {
return NextResponse.json({ error: "Convite não encontrado" }, { status: 404 })
}
// Buscar workspace
const workspace = invite.workspaceId
? await prisma.workspace.findUnique({ where: { id: invite.workspaceId } })
: null
if (!workspace) {
return NextResponse.json({ error: "Workspace não encontrado" }, { status: 404 })
}
// Verificar se está expirado
if (invite.expiresAt < new Date()) {
return NextResponse.json({ error: "Convite expirado" }, { status: 400 })
}
// Verificar se já foi aceito
if (invite.status !== "PENDING") {
return NextResponse.json({ error: "Convite já foi utilizado" }, { status: 400 })
}
// Verificar se o email confere
if (invite.email !== session.user.email) {
return NextResponse.json({ error: "Este convite não é para você" }, { status: 403 })
}
// Atualizar convite
await prisma.invite.update({
where: { id: invite.id },
data: {
status: "ACCEPTED",
acceptedAt: new Date()
}
})
// Ativar workspace
await prisma.workspace.update({
where: { id: invite.workspaceId! },
data: { status: "ACTIVE" }
})
return NextResponse.json({
success: true,
workspace: {
id: workspace.id,
slug: workspace.slug
}
})
} catch (error: any) {
console.error("Erro ao aceitar convite:", error)
return NextResponse.json(
{ error: "Erro ao aceitar convite" },
{ status: 500 }
)
}
}