257 lines
6.8 KiB
TypeScript
257 lines
6.8 KiB
TypeScript
import { prisma } from "~/lib/db.server";
|
|
import type { CreateCarDatasetData, UpdateCarDatasetData } from "~/types/database";
|
|
|
|
// Get all unique manufacturers
|
|
export async function getManufacturers() {
|
|
try {
|
|
const manufacturers = await prisma.carDataset.findMany({
|
|
where: { isActive: true },
|
|
select: { manufacturer: true },
|
|
distinct: ['manufacturer'],
|
|
orderBy: { manufacturer: 'asc' },
|
|
});
|
|
|
|
return manufacturers.map(item => item.manufacturer);
|
|
} catch (error) {
|
|
console.error("Error fetching manufacturers:", error);
|
|
throw new Error("فشل في جلب الشركات المصنعة");
|
|
}
|
|
}
|
|
|
|
// Get all models for a specific manufacturer
|
|
export async function getModelsByManufacturer(manufacturer: string) {
|
|
try {
|
|
const models = await prisma.carDataset.findMany({
|
|
where: {
|
|
manufacturer,
|
|
isActive: true
|
|
},
|
|
select: { model: true, bodyType: true },
|
|
orderBy: { model: 'asc' },
|
|
});
|
|
|
|
return models;
|
|
} catch (error) {
|
|
console.error("Error fetching models:", error);
|
|
throw new Error("فشل في جلب الموديلات");
|
|
}
|
|
}
|
|
|
|
// Get body type for a specific manufacturer and model
|
|
export async function getBodyType(manufacturer: string, model: string) {
|
|
try {
|
|
const carData = await prisma.carDataset.findFirst({
|
|
where: {
|
|
manufacturer,
|
|
model,
|
|
isActive: true
|
|
},
|
|
select: { bodyType: true },
|
|
});
|
|
|
|
return carData?.bodyType || null;
|
|
} catch (error) {
|
|
console.error("Error fetching body type:", error);
|
|
throw new Error("فشل في جلب نوع الهيكل");
|
|
}
|
|
}
|
|
|
|
// Get all car dataset entries with pagination
|
|
export async function getCarDataset(
|
|
searchQuery: string = "",
|
|
page: number = 1,
|
|
limit: number = 50,
|
|
manufacturer?: string
|
|
) {
|
|
try {
|
|
const offset = (page - 1) * limit;
|
|
|
|
const where = {
|
|
AND: [
|
|
manufacturer ? { manufacturer } : {},
|
|
searchQuery ? {
|
|
OR: [
|
|
{ manufacturer: { contains: searchQuery, mode: 'insensitive' as const } },
|
|
{ model: { contains: searchQuery, mode: 'insensitive' as const } },
|
|
{ bodyType: { contains: searchQuery, mode: 'insensitive' as const } },
|
|
]
|
|
} : {}
|
|
]
|
|
};
|
|
|
|
const [carDataset, total] = await Promise.all([
|
|
prisma.carDataset.findMany({
|
|
where,
|
|
orderBy: [
|
|
{ manufacturer: 'asc' },
|
|
{ model: 'asc' }
|
|
],
|
|
skip: offset,
|
|
take: limit,
|
|
}),
|
|
prisma.carDataset.count({ where })
|
|
]);
|
|
|
|
const totalPages = Math.ceil(total / limit);
|
|
|
|
return {
|
|
carDataset,
|
|
total,
|
|
totalPages,
|
|
};
|
|
} catch (error) {
|
|
console.error("Error fetching car dataset:", error);
|
|
throw new Error("فشل في جلب بيانات السيارات");
|
|
}
|
|
}
|
|
|
|
// Create a new car dataset entry
|
|
export async function createCarDataset(data: CreateCarDatasetData) {
|
|
try {
|
|
const carDataset = await prisma.carDataset.create({
|
|
data: {
|
|
manufacturer: data.manufacturer.trim(),
|
|
model: data.model.trim(),
|
|
bodyType: data.bodyType.trim(),
|
|
isActive: data.isActive ?? true,
|
|
},
|
|
});
|
|
|
|
return { success: true, carDataset };
|
|
} catch (error: any) {
|
|
console.error("Error creating car dataset:", error);
|
|
|
|
if (error.code === 'P2002') {
|
|
return {
|
|
success: false,
|
|
error: "هذا الموديل موجود بالفعل لهذه الشركة المصنعة"
|
|
};
|
|
}
|
|
|
|
return {
|
|
success: false,
|
|
error: "فشل في إنشاء بيانات السيارة"
|
|
};
|
|
}
|
|
}
|
|
|
|
// Update a car dataset entry
|
|
export async function updateCarDataset(id: number, data: UpdateCarDatasetData) {
|
|
try {
|
|
const carDataset = await prisma.carDataset.update({
|
|
where: { id },
|
|
data: {
|
|
...(data.manufacturer && { manufacturer: data.manufacturer.trim() }),
|
|
...(data.model && { model: data.model.trim() }),
|
|
...(data.bodyType && { bodyType: data.bodyType.trim() }),
|
|
...(data.isActive !== undefined && { isActive: data.isActive }),
|
|
},
|
|
});
|
|
|
|
return { success: true, carDataset };
|
|
} catch (error: any) {
|
|
console.error("Error updating car dataset:", error);
|
|
|
|
if (error.code === 'P2002') {
|
|
return {
|
|
success: false,
|
|
error: "هذا الموديل موجود بالفعل لهذه الشركة المصنعة"
|
|
};
|
|
}
|
|
|
|
if (error.code === 'P2025') {
|
|
return {
|
|
success: false,
|
|
error: "بيانات السيارة غير موجودة"
|
|
};
|
|
}
|
|
|
|
return {
|
|
success: false,
|
|
error: "فشل في تحديث بيانات السيارة"
|
|
};
|
|
}
|
|
}
|
|
|
|
// Delete a car dataset entry
|
|
export async function deleteCarDataset(id: number) {
|
|
try {
|
|
await prisma.carDataset.delete({
|
|
where: { id },
|
|
});
|
|
|
|
return { success: true };
|
|
} catch (error: any) {
|
|
console.error("Error deleting car dataset:", error);
|
|
|
|
if (error.code === 'P2025') {
|
|
return {
|
|
success: false,
|
|
error: "بيانات السيارة غير موجودة"
|
|
};
|
|
}
|
|
|
|
return {
|
|
success: false,
|
|
error: "فشل في حذف بيانات السيارة"
|
|
};
|
|
}
|
|
}
|
|
|
|
// Get car dataset entry by ID
|
|
export async function getCarDatasetById(id: number) {
|
|
try {
|
|
const carDataset = await prisma.carDataset.findUnique({
|
|
where: { id },
|
|
});
|
|
|
|
return carDataset;
|
|
} catch (error) {
|
|
console.error("Error fetching car dataset by ID:", error);
|
|
throw new Error("فشل في جلب بيانات السيارة");
|
|
}
|
|
}
|
|
|
|
// Bulk import car dataset
|
|
export async function bulkImportCarDataset(data: CreateCarDatasetData[]) {
|
|
try {
|
|
const results = await prisma.$transaction(async (tx) => {
|
|
const created = [];
|
|
const errors = [];
|
|
|
|
for (const item of data) {
|
|
try {
|
|
const carDataset = await tx.carDataset.create({
|
|
data: {
|
|
manufacturer: item.manufacturer.trim(),
|
|
model: item.model.trim(),
|
|
bodyType: item.bodyType.trim(),
|
|
isActive: item.isActive ?? true,
|
|
},
|
|
});
|
|
created.push(carDataset);
|
|
} catch (error: any) {
|
|
if (error.code === 'P2002') {
|
|
errors.push(`${item.manufacturer} ${item.model} - موجود بالفعل`);
|
|
} else {
|
|
errors.push(`${item.manufacturer} ${item.model} - خطأ غير معروف`);
|
|
}
|
|
}
|
|
}
|
|
|
|
return { created, errors };
|
|
});
|
|
|
|
return {
|
|
success: true,
|
|
created: results.created.length,
|
|
errors: results.errors
|
|
};
|
|
} catch (error) {
|
|
console.error("Error bulk importing car dataset:", error);
|
|
return {
|
|
success: false,
|
|
error: "فشل في استيراد بيانات السيارات"
|
|
};
|
|
}
|
|
} |