From a8fe047019282578d9717fa29a7001fe4e15ceec Mon Sep 17 00:00:00 2001 From: Tim Howitz Date: Mon, 26 May 2025 14:40:06 +0100 Subject: [PATCH] Optimised imoprt earthquakes --- src/app/api/import-earthquakes/route.ts | 98 ++++++++++++------------- 1 file changed, 48 insertions(+), 50 deletions(-) diff --git a/src/app/api/import-earthquakes/route.ts b/src/app/api/import-earthquakes/route.ts index fc17bf9..e43a09e 100644 --- a/src/app/api/import-earthquakes/route.ts +++ b/src/app/api/import-earthquakes/route.ts @@ -42,63 +42,61 @@ export async function POST() { const failedImports: { row: CsvRow; reason: string }[] = []; - // Fetch all observatories once to avoid repeated queries + // Fetch all observatories and users once const observatories = await prisma.observatory.findMany({ select: { id: true, latitude: true, longitude: true }, }); + const creators = await prisma.user.findMany({ + where: { role: { in: ["SCIENTIST", "ADMIN"] } }, + }); - const earthquakes = await Promise.all( - records.map(async (row) => { - const creators = await prisma.user.findMany({ - where: { role: { in: ["SCIENTIST", "ADMIN"] } }, - }); - const randomCreator = creators.length > 0 ? creators[getRandomNumber(0, creators.length - 1)] : null; + const earthquakes = records.map((row) => { + const randomCreator = creators.length > 0 ? creators[getRandomNumber(0, creators.length - 1)] : null; - if (!randomCreator) { - failedImports.push({ row, reason: `RandomCreator: ${randomCreator}` }); - return null; + if (!randomCreator) { + failedImports.push({ row, reason: `No creator found` }); + return null; + } + + const eqLat = parseFloat(row.Latitude); + const eqLon = parseFloat(row.Longitude); + + // Find observatories within distance threshold + let nearbyObservatories = observatories + .map((obs) => ({ + id: obs.id, + distance: getDistance(eqLat, eqLon, obs.latitude, obs.longitude), + })) + .filter((obs) => obs.distance <= DISTANCE_THRESHOLD_KM) + .map((obs) => ({ id: obs.id })); + + // If no observatories within range, find the nearest one + if (nearbyObservatories.length === 0) { + const nearest = observatories.reduce( + (min, obs) => { + const distance = getDistance(eqLat, eqLon, obs.latitude, obs.longitude); + return distance < min.distance ? { id: obs.id, distance } : min; + }, + { id: -1, distance: Infinity } + ); + if (nearest.id !== -1) { + nearbyObservatories = [{ id: nearest.id }]; } + } - const eqLat = parseFloat(row.Latitude); - const eqLon = parseFloat(row.Longitude); - - // Find observatories within distance threshold - let nearbyObservatories = observatories - .map((obs) => ({ - id: obs.id, - distance: getDistance(eqLat, eqLon, obs.latitude, obs.longitude), - })) - .filter((obs) => obs.distance <= DISTANCE_THRESHOLD_KM) - .map((obs) => ({ id: obs.id })); - - // If no observatories within range, find the nearest one - if (nearbyObservatories.length === 0) { - const nearest = observatories.reduce( - (min, obs) => { - const distance = getDistance(eqLat, eqLon, obs.latitude, obs.longitude); - return distance < min.distance ? { id: obs.id, distance } : min; - }, - { id: -1, distance: Infinity } - ); - if (nearest.id !== -1) { - nearbyObservatories = [{ id: nearest.id }]; - } - } - - return { - date: new Date(row.Date), - code: row.Code, - magnitude: parseFloat(row.Magnitude), - type: row.Type, - latitude: eqLat, - longitude: eqLon, - location: row.Location, - depth: row.Depth, - creatorId: randomCreator.id, - observatories: { connect: nearbyObservatories }, - }; - }) - ); + return { + date: new Date(row.Date), + code: row.Code, + magnitude: parseFloat(row.Magnitude), + type: row.Type, + latitude: eqLat, + longitude: eqLon, + location: row.Location, + depth: row.Depth, + creatorId: randomCreator.id, + observatories: { connect: nearbyObservatories }, + }; + }); const validEarthquakes = earthquakes.filter( (earthquake): earthquake is NonNullable => earthquake !== null