feat(API, database): improve DELETE and GET property handling and enhance logging and error messages
This commit is contained in:
parent
23e9c4a621
commit
f616d73826
3 changed files with 61 additions and 27 deletions
|
@ -1,4 +1,3 @@
|
|||
//Handles DELETE requests for specific properties
|
||||
import { NextRequest, NextResponse } from 'next/server';
|
||||
import { deletePropertyByUrl } from '@/lib/database';
|
||||
|
||||
|
@ -7,36 +6,42 @@ export async function DELETE(
|
|||
request: NextRequest,
|
||||
{ params }: { params: { encodedUrl: string; property: string } }
|
||||
) {
|
||||
const url = decodeURIComponent(params.encodedUrl);
|
||||
const property = decodeURIComponent(params.property);
|
||||
|
||||
console.log('[API] Deleting property', property, 'from URL', url);
|
||||
|
||||
try {
|
||||
if (!property) {
|
||||
const url = decodeURIComponent(params.encodedUrl);
|
||||
const property = decodeURIComponent(params.property);
|
||||
|
||||
console.log('[API] DELETE request - URL:', url, 'Property:', property);
|
||||
|
||||
if (!url || !property) {
|
||||
console.log('[API] Missing required parameters');
|
||||
return NextResponse.json(
|
||||
{ error: 'Property name is required' },
|
||||
{ error: 'URL and property name are required' },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
console.log('[API] Calling deletePropertyByUrl...');
|
||||
await deletePropertyByUrl(url, property);
|
||||
|
||||
console.log('[API] Successfully deleted property:', property);
|
||||
console.log('[API] Successfully deleted property:', property, 'from URL:', url);
|
||||
|
||||
return NextResponse.json(
|
||||
{ message: 'Property deleted', property: property },
|
||||
{
|
||||
message: 'Property deleted successfully',
|
||||
property: property,
|
||||
url: url
|
||||
},
|
||||
{ status: 200 }
|
||||
);
|
||||
} catch (error) {
|
||||
console.log('[API] Delete error:', error);
|
||||
console.error('[API] Delete error:', error);
|
||||
|
||||
return NextResponse.json(
|
||||
{
|
||||
error: 'Failed to delete property',
|
||||
details: error instanceof Error ? error.message : 'Unknown error',
|
||||
property: property,
|
||||
url: url
|
||||
property: params.property,
|
||||
url: params.encodedUrl
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
|
|
|
@ -7,12 +7,12 @@ export async function GET(
|
|||
request: NextRequest,
|
||||
{ params }: { params: Promise<{ encodedUrl: string }> }
|
||||
) {
|
||||
// Await params before accessing properties
|
||||
const resolvedParams = await params;
|
||||
const url = decodeURIComponent(resolvedParams.encodedUrl);
|
||||
console.log('[API] Getting selected properties for URL:', url);
|
||||
|
||||
try {
|
||||
// Await params before accessing properties
|
||||
const resolvedParams = await params;
|
||||
const url = decodeURIComponent(resolvedParams.encodedUrl);
|
||||
console.log('[API] Getting selected properties for URL:', url);
|
||||
|
||||
const properties = await getSelectedProperties(url);
|
||||
console.log('[API] Returning', properties.length, 'properties for URL:', url);
|
||||
|
||||
|
@ -23,6 +23,8 @@ export async function GET(
|
|||
},
|
||||
});
|
||||
} catch (error) {
|
||||
const resolvedParams = await params;
|
||||
const url = decodeURIComponent(resolvedParams.encodedUrl);
|
||||
console.error('[API] Failed to fetch properties for URL:', url, error);
|
||||
|
||||
return NextResponse.json(
|
||||
|
@ -41,11 +43,11 @@ export async function POST(
|
|||
request: NextRequest,
|
||||
{ params }: { params: Promise<{ encodedUrl: string }> }
|
||||
) {
|
||||
// Await params before accessing properties
|
||||
const resolvedParams = await params;
|
||||
const url = decodeURIComponent(resolvedParams.encodedUrl);
|
||||
|
||||
try {
|
||||
// Await params before accessing properties
|
||||
const resolvedParams = await params;
|
||||
const url = decodeURIComponent(resolvedParams.encodedUrl);
|
||||
|
||||
const property: string = await request.json();
|
||||
|
||||
console.log('[API] Adding property', property, 'to URL', url);
|
||||
|
@ -65,14 +67,20 @@ export async function POST(
|
|||
// Add the selected property
|
||||
await addSelectedProperty(url, property);
|
||||
|
||||
console.log('[API] Successfully added property:', property);
|
||||
console.log('[API] Successfully added property:', property, 'to URL:', url);
|
||||
|
||||
return NextResponse.json(
|
||||
{ message: 'Property added', property: property },
|
||||
{
|
||||
message: 'Property added successfully',
|
||||
property: property,
|
||||
url: url
|
||||
},
|
||||
{ status: 200 }
|
||||
);
|
||||
} catch (error) {
|
||||
console.log('[API] Error adding property:', error);
|
||||
const resolvedParams = await params;
|
||||
const url = decodeURIComponent(resolvedParams.encodedUrl);
|
||||
console.error('[API] Error adding property:', error);
|
||||
|
||||
return NextResponse.json(
|
||||
{
|
||||
|
|
|
@ -250,7 +250,7 @@ export async function deleteItemByUrl(url: string, itemId: string): Promise<void
|
|||
|
||||
// Delete property by URL
|
||||
export async function deletePropertyByUrl(url: string, propertyName: string): Promise<void> {
|
||||
console.log(`[DB] Soft deleting property ${propertyName} for URL: ${url}`);
|
||||
console.log(`[DB] Starting soft delete of property ${propertyName} for URL: ${url}`);
|
||||
|
||||
await withTransaction(async (tx) => {
|
||||
// Get URL ID
|
||||
|
@ -259,25 +259,44 @@ export async function deletePropertyByUrl(url: string, propertyName: string): Pr
|
|||
});
|
||||
|
||||
if (!urlRecord) {
|
||||
console.error(`[DB] URL not found: ${url}`);
|
||||
throw new Error(`URL not found: ${url}`);
|
||||
}
|
||||
|
||||
console.log(`[DB] Found URL record with ID: ${urlRecord.id}`);
|
||||
|
||||
// Get property ID
|
||||
const property = await tx.property.findUnique({
|
||||
where: { name: propertyName }
|
||||
});
|
||||
|
||||
if (!property) {
|
||||
console.error(`[DB] Property not found: ${propertyName}`);
|
||||
throw new Error(`Property not found: ${propertyName}`);
|
||||
}
|
||||
|
||||
console.log(`[DB] Found property record with ID: ${property.id}`);
|
||||
|
||||
// Remove from selected properties first
|
||||
const deletedSelectedProperties = await tx.selectedProperty.deleteMany({
|
||||
where: {
|
||||
urlId: urlRecord.id,
|
||||
propertyId: property.id
|
||||
}
|
||||
});
|
||||
|
||||
console.log(`[DB] Removed ${deletedSelectedProperties.count} selected property records`);
|
||||
|
||||
// Get all global item IDs for this URL
|
||||
const items = await tx.item.findMany({
|
||||
where: { urlId: urlRecord.id },
|
||||
select: { globalItemId: true }
|
||||
});
|
||||
|
||||
console.log(`[DB] Found ${items.length} items for URL`);
|
||||
|
||||
// Insert into deleted_properties for each global item
|
||||
let deletedPropertiesCount = 0;
|
||||
for (const item of items) {
|
||||
await tx.deletedProperty.upsert({
|
||||
where: {
|
||||
|
@ -294,9 +313,11 @@ export async function deletePropertyByUrl(url: string, propertyName: string): Pr
|
|||
propertyId: property.id
|
||||
}
|
||||
});
|
||||
deletedPropertiesCount++;
|
||||
}
|
||||
|
||||
console.log(`[DB] Property ${propertyName} soft deleted for URL: ${url}`);
|
||||
console.log(`[DB] Created/updated ${deletedPropertiesCount} deleted property records`);
|
||||
console.log(`[DB] Successfully soft deleted property ${propertyName} for URL: ${url}`);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue