// @ts-nocheck import { NextRequest, NextResponse } from "next/server"; import { Client, Databases, Query } from "node-appwrite"; import { UserRole } from "@/types/auth"; export const runtime = "edge"; // Função para obter cliente Appwrite do servidor function getServerClient() { const client = new Client() .setEndpoint(process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT!) .setProject(process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID!) .setKey(process.env.APPWRITE_API_KEY!); return new Databases(client); } // GET - Listar usuários com filtro por empresa para admins export async function GET(request: NextRequest) { try { const { searchParams } = new URL(request.url); const userRole = searchParams.get("userRole"); const empresaId = searchParams.get("empresaId"); const databases = getServerClient(); const databaseId = process.env.NEXT_PUBLIC_APPWRITE_DATABASE_ID!; const collectionId = process.env.NEXT_PUBLIC_APPWRITE_COLLECTION_USUARIOS_ID!; const queries = []; // Se for admin (admin), filtrar apenas usuários da mesma empresa if (userRole === UserRole.ADMIN && empresaId) { queries.push(Query.contains("empresas_array", empresaId)); } // Não mostrar admins para admins comuns if (userRole === UserRole.ADMIN) { queries.push(Query.notEqual("nivel", UserRole.ADMIN)); } const response = await databases.listDocuments( databaseId, collectionId, queries ); return NextResponse.json({ success: true, data: response.documents, total: response.total, }); } catch (error: any) { console.error("Erro ao listar usuários:", error); return NextResponse.json( { success: false, error: "Erro ao carregar usuários" }, { status: 500 } ); } } // POST - Criar novo usuário (apenas admins) export async function POST(request: NextRequest) { try { const body = await request.json(); const { nome, email, senha, cpf, nivel, empresaId, userRole, // Role do usuário que está criando } = body; // Validações if (!nome || !email || !senha || !cpf || !nivel) { return NextResponse.json( { success: false, error: "Todos os campos são obrigatórios" }, { status: 400 } ); } // Verificar permissões if (userRole !== UserRole.ADMIN && userRole !== UserRole.ADMIN) { return NextResponse.json( { success: false, error: "Permissão insuficiente" }, { status: 403 } ); } // Admin só pode criar employees e delivery if ( userRole === UserRole.ADMIN && ![UserRole.EMPLOYEE, UserRole.DELIVERY].includes(nivel) ) { return NextResponse.json( { success: false, error: "Admins só podem criar employees e delivery", }, { status: 403 } ); } const databases = getServerClient(); const databaseId = process.env.NEXT_PUBLIC_APPWRITE_DATABASE_ID!; const collectionId = process.env.NEXT_PUBLIC_APPWRITE_COLLECTION_USUARIOS_ID!; // Verificar se já existe usuário com este email const existingUsers = await databases.listDocuments( databaseId, collectionId, [Query.equal("email", email)] ); if (existingUsers.documents.length > 0) { return NextResponse.json( { success: false, error: "Já existe um usuário com este email" }, { status: 400 } ); } // Criar conta no Appwrite Auth (isso precisaria ser feito via SDK de servidor) // Por enquanto, vamos simular a criação retornando um ID único const authId = `user_${Date.now()}_${Math.random() .toString(36) .substr(2, 9)}`; // Preparar dados do usuário const usuarioData = { "nome-civil": nome, cpf: cpf, "auth-id-appwrite": authId, email: email, nivel: nivel, enderecos: [], empresas_array: userRole === UserRole.ADMIN ? [empresaId] : [], }; // Criar documento do usuário const response = await databases.createDocument( databaseId, collectionId, "unique()", usuarioData ); return NextResponse.json({ success: true, data: response, message: "Usuário criado com sucesso", }); } catch (error: any) { console.error("Erro ao criar usuário:", error); return NextResponse.json( { success: false, error: "Erro interno do servidor" }, { status: 500 } ); } }