268 lines
6.7 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { authOptions } from "../../auth/[...nextauth]/route";
import { prisma } from "@/lib/prisma";
export async function GET(
request: Request,
context: { params: Promise<{ id: string }> }
) {
try {
const { params } = context;
const { id } = await params;
const session = await getServerSession(authOptions);
if (!session?.user?.email) {
return NextResponse.json(
{ error: "Oturum bulunamadı" },
{ status: 401 }
);
}
const user = await prisma.user.findFirst({
where: { email: session.user.email },
});
if (!user) {
return NextResponse.json(
{ error: "Kullanıcı bulunamadı" },
{ status: 401 }
);
}
const route = await prisma.route.findFirst({
where: {
id: id,
userId: user.id
},
include: {
addresses: {
orderBy: {
order: 'asc'
}
}
}
});
if (!route) {
return NextResponse.json(
{ error: "Rota bulunamadı" },
{ status: 404 }
);
}
return NextResponse.json(route);
} catch (error) {
console.error("Rota detayları alınırken hata oluştu:", error);
return NextResponse.json(
{ error: "Rota detayları alınırken bir hata oluştu" },
{ status: 500 }
);
}
}
export async function PUT(
request: Request,
context: { params: Promise<{ id: string }> }
) {
try {
const { params } = context;
const { id } = await params;
const session = await getServerSession(authOptions);
if (!session?.user?.email) {
return NextResponse.json(
{ error: "Oturum bulunamadı" },
{ status: 401 }
);
}
const user = await prisma.user.findFirst({
where: { email: session.user.email },
});
if (!user) {
return NextResponse.json(
{ error: "Kullanıcı bulunamadı" },
{ status: 401 }
);
}
const existingRoute = await prisma.route.findFirst({
where: {
id: id,
userId: user.id
},
include: {
addresses: true
}
});
if (!existingRoute) {
return NextResponse.json(
{ error: "Rota bulunamadı veya düzenleme yetkiniz yok" },
{ status: 404 }
);
}
const { name, status, addresses } = await request.json();
// Create a map of existing addresses by street for quick lookup
const existingAddressMap = new Map();
existingRoute.addresses.forEach(address => {
existingAddressMap.set(address.street, address);
});
// Use a transaction to ensure atomicity
const updatedRoute = await prisma.$transaction(async (tx) => {
// Update route properties if provided
const routeUpdate = {
...(name !== undefined && { name }),
...(status !== undefined && { status }),
};
// Update the route if there are properties to update
if (Object.keys(routeUpdate).length > 0) {
await tx.route.update({
where: { id },
data: routeUpdate
});
}
// If addresses are provided, update them
if (addresses && addresses.length > 0) {
// Delete addresses that are no longer present
const newStreetAddresses = addresses.map((a: { street: string }) => a.street);
await tx.address.deleteMany({
where: {
routeId: id,
street: { notIn: newStreetAddresses }
}
});
// Process each address
const addressPromises = addresses.map(async (address: {
street: string;
city?: string;
postcode?: string;
latitude?: number;
longitude?: number;
}, index: number) => {
const existingAddress = existingAddressMap.get(address.street);
if (existingAddress) {
// Update existing address
return tx.address.update({
where: { id: existingAddress.id },
data: {
street: address.street,
city: address.city || '',
postcode: address.postcode || '',
country: 'Switzerland',
order: index,
// Preserve latitude/longitude if not provided
...(address.latitude !== undefined ? { latitude: address.latitude } : {}),
...(address.longitude !== undefined ? { longitude: address.longitude } : {})
}
});
} else {
// Create new address
return tx.address.create({
data: {
street: address.street,
city: address.city || '',
postcode: address.postcode || '',
country: 'Switzerland',
order: index,
latitude: address.latitude,
longitude: address.longitude,
routeId: id
}
});
}
});
await Promise.all(addressPromises);
}
// Return the updated route with sorted addresses
return tx.route.findUnique({
where: { id },
include: {
addresses: {
orderBy: {
order: 'asc'
}
}
}
});
});
return NextResponse.json(updatedRoute);
} catch (error) {
console.error("Rota güncellenirken hata oluştu:", error);
return NextResponse.json(
{ error: "Rota güncellenirken bir hata oluştu" },
{ status: 500 }
);
}
}
export async function DELETE(
request: Request,
context: { params: Promise<{ id: string }> }
) {
try {
const { params } = context;
const { id } = await params;
const session = await getServerSession(authOptions);
if (!session?.user?.email) {
return NextResponse.json(
{ error: "Oturum bulunamadı" },
{ status: 401 }
);
}
const user = await prisma.user.findFirst({
where: { email: session.user.email },
});
if (!user) {
return NextResponse.json(
{ error: "Kullanıcı bulunamadı" },
{ status: 401 }
);
}
const route = await prisma.route.findFirst({
where: {
id: id,
userId: user.id
}
});
if (!route) {
return NextResponse.json(
{ error: "Rota bulunamadı veya silme yetkiniz yok" },
{ status: 404 }
);
}
await prisma.route.delete({
where: {
id: id
}
});
return NextResponse.json({ message: "Rota başarıyla silindi" });
} catch (error) {
console.error("Rota silinirken hata oluştu:", error);
return NextResponse.json(
{ error: "Rota silinirken bir hata oluştu" },
{ status: 500 }
);
}
}