almeira-web/dripzone-app/src/app/api/users/route.ts

120 lines
4.3 KiB
TypeScript

import { NextResponse } from 'next/server';
import { dataService, isCarlosAdmin } from '@/lib/data-service';
import { User } from '@/types';
export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const phone = searchParams.get('phone');
const id = searchParams.get('id');
if (phone) {
const cleanPhone = phone.replace(/\D/g, '');
const user = dataService.getUsers().find((u) => u.phone.replace(/\D/g, '') === cleanPhone);
const existingOrders = dataService.getOrders().filter(
(o) => o.customerPhone.replace(/\D/g, '') === cleanPhone
);
const hasCompletedPreviousOrder = Boolean(
(user && (user.totalOrders || 0) > 0) ||
existingOrders.some((o) => o.status === 'dispatched' || o.status === 'deposit_received' || o.status === 'supplier_notified')
);
const requiresShippingDeposit = !hasCompletedPreviousOrder;
const depositAmount = requiresShippingDeposit ? 10000 : 0;
const depositReason = requiresShippingDeposit
? 'Garantía de separación requerida para primer pedido'
: 'Cliente distinguido exento de anticipo (100% Contraentrega)';
const isCarlos = isCarlosAdmin(cleanPhone);
const userRole = isCarlos ? 'admin' : (user?.role || 'customer');
return NextResponse.json({
success: true,
isFirstPurchase: isCarlos ? false : !hasCompletedPreviousOrder,
requiresShippingDeposit: isCarlos ? false : requiresShippingDeposit,
depositAmount: isCarlos ? 0 : depositAmount,
depositReason: isCarlos ? 'Super Administrador DripZone' : depositReason,
phoneVerified: isCarlos ? true : (user ? user.phoneVerified === true : false),
user: user
? {
...user,
role: userRole,
phoneVerified: isCarlos ? true : user.phoneVerified,
requiresShippingDeposit: isCarlos ? false : requiresShippingDeposit,
depositReason: isCarlos ? 'Super Administrador DripZone' : depositReason,
}
: isCarlos
? {
id: 'usr-admin-carlos',
name: 'Administrador',
email: 'carlos.andres.lasso@gmail.com',
phone: cleanPhone,
city: 'Cali',
address: 'Sede Principal / Cali',
role: 'admin',
isActive: true,
phoneVerified: true,
requiresShippingDeposit: false,
depositReason: 'Super Administrador DripZone',
totalOrders: 0,
}
: null,
});
}
if (id) {
const user = dataService.getUserById(id);
return NextResponse.json({ success: true, user });
}
const users = dataService.getUsers();
return NextResponse.json({ success: true, users });
}
export async function POST(request: Request) {
try {
const body = await request.json();
const newUser: User = {
id: `usr-${Date.now()}`,
name: body.name,
email: body.email,
phone: body.phone,
city: body.city || 'Cali',
address: body.address || '',
role: body.role || 'customer',
isActive: body.isActive !== false,
createdAt: new Date().toISOString().split('T')[0],
totalOrders: 0,
};
const saved = dataService.addUser(newUser);
return NextResponse.json({ success: true, user: saved });
} catch (error: any) {
return NextResponse.json({ success: false, error: error.message }, { status: 400 });
}
}
export async function PUT(request: Request) {
try {
const { id, updates } = await request.json();
const updated = dataService.updateUser(id, updates);
if (!updated) {
return NextResponse.json({ success: false, error: 'Usuario no encontrado' }, { status: 404 });
}
return NextResponse.json({ success: true, user: updated });
} catch (error: any) {
return NextResponse.json({ success: false, error: error.message }, { status: 400 });
}
}
export async function DELETE(request: Request) {
try {
const { searchParams } = new URL(request.url);
const id = searchParams.get('id');
if (!id) {
return NextResponse.json({ success: false, error: 'ID requerido' }, { status: 400 });
}
const deleted = dataService.deleteUser(id);
return NextResponse.json({ success: deleted });
} catch (error: any) {
return NextResponse.json({ success: false, error: error.message }, { status: 400 });
}
}