165 lines
4.5 KiB
TypeScript
165 lines
4.5 KiB
TypeScript
// @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 }
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
|