Optimised imoprt earthquakes
This commit is contained in:
parent
8a48857ac0
commit
a8fe047019
@ -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<typeof earthquake> => earthquake !== null
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user