pipedrive / src /app /api /contacts /route.ts
ppEmiliano's picture
Add full CRM application with HF Spaces Docker deployment
ea8dde3
Raw
History Blame Contribute Delete
2.62 kB
import { NextRequest, NextResponse } from "next/server";
import { db } from "@/lib/db";
import { contacts, companies } from "@/lib/db/schema";
import { contactSchema } from "@/lib/validators";
import { auth } from "@/lib/auth";
import { eq, desc } from "drizzle-orm";
export async function GET(req: NextRequest) {
const session = await auth();
if (!session?.user?.id) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
const search = req.nextUrl.searchParams.get("search") || "";
const companyId = req.nextUrl.searchParams.get("companyId");
const page = parseInt(req.nextUrl.searchParams.get("page") || "1");
const limit = parseInt(req.nextUrl.searchParams.get("limit") || "20");
const offset = (page - 1) * limit;
const userId = parseInt(session.user.id);
let results = db
.select({
id: contacts.id,
firstName: contacts.firstName,
lastName: contacts.lastName,
email: contacts.email,
phone: contacts.phone,
jobTitle: contacts.jobTitle,
companyId: contacts.companyId,
companyName: companies.name,
createdAt: contacts.createdAt,
updatedAt: contacts.updatedAt,
})
.from(contacts)
.leftJoin(companies, eq(contacts.companyId, companies.id))
.where(eq(contacts.userId, userId))
.orderBy(desc(contacts.createdAt))
.all();
if (companyId) {
results = results.filter((c) => c.companyId === parseInt(companyId));
}
if (search) {
const s = search.toLowerCase();
results = results.filter(
(c) =>
c.firstName.toLowerCase().includes(s) ||
c.lastName.toLowerCase().includes(s) ||
(c.email && c.email.toLowerCase().includes(s)) ||
(c.companyName && c.companyName.toLowerCase().includes(s))
);
}
const total = results.length;
const paged = results.slice(offset, offset + limit);
return NextResponse.json({ data: paged, total, page, limit });
}
export async function POST(req: NextRequest) {
const session = await auth();
if (!session?.user?.id) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
const body = await req.json();
const parsed = contactSchema.safeParse(body);
if (!parsed.success) return NextResponse.json({ error: parsed.error.flatten() }, { status: 400 });
const now = new Date().toISOString();
const contact = db
.insert(contacts)
.values({
...parsed.data,
email: parsed.data.email || null,
userId: parseInt(session.user.id),
createdAt: now,
updatedAt: now,
})
.returning()
.get();
return NextResponse.json(contact, { status: 201 });
}