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
85 lines
2.2 KiB
TypeScript
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 }
|
|
)
|
|
}
|
|
}
|
|
|