Удалить локальную CRM и Prisma, обновить Docker Compose и автодеплой Gitea
All checks were successful
Auto Deploy / deploy (push) Successful in 47s

This commit is contained in:
deonisii
2026-04-19 00:03:26 +03:00
parent e37b503187
commit 71ec905860
25 changed files with 92 additions and 2254 deletions

View File

@@ -1,38 +0,0 @@
import { NextResponse } from "next/server";
import { createSessionToken, getAdminCredentials, getSessionCookieName } from "@/lib/auth";
type LoginPayload = {
email?: string;
password?: string;
};
export async function POST(request: Request) {
try {
const body = (await request.json()) as LoginPayload;
const email = body.email?.trim().toLowerCase() || "";
const password = body.password?.trim() || "";
const admin = getAdminCredentials();
if (email !== admin.email.toLowerCase() || password !== admin.password) {
return NextResponse.json({ error: "Неверный email или пароль" }, { status: 401 });
}
const token = await createSessionToken(email);
const response = NextResponse.json({ success: true });
response.cookies.set({
name: getSessionCookieName(),
value: token,
httpOnly: true,
secure: true,
sameSite: "lax",
path: "/",
maxAge: 60 * 60 * 24 * 7,
});
return response;
} catch {
return NextResponse.json({ error: "Ошибка авторизации" }, { status: 500 });
}
}

View File

@@ -1,18 +0,0 @@
import { NextResponse } from "next/server";
import { getSessionCookieName } from "@/lib/auth";
export async function POST() {
const response = NextResponse.json({ success: true });
response.cookies.set({
name: getSessionCookieName(),
value: "",
httpOnly: true,
secure: true,
sameSite: "lax",
path: "/",
maxAge: 0,
});
return response;
}

View File

@@ -1,43 +0,0 @@
import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
const allowedStatuses = [
"NEW",
"IN_PROGRESS",
"CALL_SCHEDULED",
"WON",
"LOST",
] as const;
type LeadStatus = (typeof allowedStatuses)[number];
type PatchPayload = {
status?: LeadStatus;
};
export async function PATCH(
request: Request,
context: { params: Promise<{ id: string }> }
) {
try {
const { id } = await context.params;
const body = (await request.json()) as PatchPayload;
if (!body.status || !allowedStatuses.includes(body.status)) {
return NextResponse.json({ error: "Некорректный статус" }, { status: 400 });
}
const lead = await prisma.lead.update({
where: { id },
data: { status: body.status },
});
return NextResponse.json({ success: true, lead });
} catch (error) {
console.error("PATCH /api/leads/[id] error:", error);
return NextResponse.json(
{ error: "Не удалось обновить статус" },
{ status: 500 }
);
}
}

View File

@@ -1,45 +0,0 @@
import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
type LeadPayload = {
company?: string;
phone?: string;
email?: string;
message?: string;
};
export async function POST(request: Request) {
try {
const body = (await request.json()) as LeadPayload;
const company = body.company?.trim();
const phone = body.phone?.trim();
const email = body.email?.trim().toLowerCase();
const message = body.message?.trim() || "";
if (!company || !phone || !email) {
return NextResponse.json(
{ error: "Компания, телефон и email обязательны" },
{ status: 400 }
);
}
const lead = await prisma.lead.create({
data: {
company,
phone,
email,
message,
source: "website",
},
});
return NextResponse.json({ success: true, leadId: lead.id }, { status: 201 });
} catch (error) {
console.error("POST /api/leads error:", error);
return NextResponse.json(
{ error: "Не удалось сохранить заявку" },
{ status: 500 }
);
}
}

View File

@@ -1,10 +0,0 @@
import { prisma } from "@/lib/prisma";
export async function GET() {
const leads = await prisma.lead.findMany();
return Response.json({
ok: true,
count: leads.length,
});
}