176 lines
5.1 KiB
TypeScript
176 lines
5.1 KiB
TypeScript
'use server';
|
|
|
|
import db from '@/prisma/db';
|
|
import { getInjection } from '@/di/container';
|
|
import {
|
|
AuthenticationError,
|
|
UnauthenticatedError,
|
|
} from '@/src/entities/errors/auth';
|
|
import { NotFoundError } from '@/src/entities/errors/common';
|
|
|
|
|
|
/**
|
|
* Initialize district data in the database from GeoJSON
|
|
* This would be run during setup or to sync GeoJSON with the database
|
|
*/
|
|
// export async function initializeDistrictsFromGeoJSON() {
|
|
// const instrumentationService = getInjection('IInstrumentationService');
|
|
// return await instrumentationService.instrumentServerAction(
|
|
// 'InitializeDistricts',
|
|
// { recordResponse: true },
|
|
// async () => {
|
|
// try {
|
|
// // Create batch of districts from GeoJSON
|
|
// const districtsToCreate = districtsGeoJson.features
|
|
// .filter(
|
|
// (feature) => feature.properties && feature.properties.kode_kec
|
|
// )
|
|
// .map((feature) => {
|
|
// // Calculate center point for the district
|
|
// const centroid = calculateCentroid(feature.geometry as any);
|
|
|
|
// return {
|
|
// id: feature.properties!.kode_kec,
|
|
// name: feature.properties!.nama || feature.properties!.kecamatan,
|
|
// code: feature.properties!.kode_kec,
|
|
// region: 'Jember',
|
|
// province: feature.properties!.provinsi || 'Jawa Timur',
|
|
// geometry: JSON.stringify(feature.geometry),
|
|
// center_latitude: centroid[1],
|
|
// center_longitude: centroid[0],
|
|
// };
|
|
// });
|
|
|
|
// // Create districts in batches to avoid timeouts
|
|
// const batchSize = 10;
|
|
// for (let i = 0; i < districtsToCreate.length; i += batchSize) {
|
|
// const batch = districtsToCreate.slice(i, i + batchSize);
|
|
|
|
// await Promise.all(
|
|
// batch.map((district) =>
|
|
// db.districts.upsert({
|
|
// where: { id: district.id },
|
|
// update: district,
|
|
// create: district,
|
|
// })
|
|
// )
|
|
// );
|
|
// }
|
|
|
|
// return {
|
|
// success: true,
|
|
// message: `Successfully initialized ${districtsToCreate.length} districts`,
|
|
// };
|
|
// } catch (err) {
|
|
// const crashReporterService = getInjection('ICrashReporterService');
|
|
// crashReporterService.report(err);
|
|
// throw new Error(
|
|
// 'An error happened while initializing districts. The developers have been notified.'
|
|
// );
|
|
// }
|
|
// }
|
|
// );
|
|
// }
|
|
|
|
/**
|
|
* Get all district information from database
|
|
*/
|
|
export async function getAllDistricts() {
|
|
const instrumentationService = getInjection('IInstrumentationService');
|
|
return await instrumentationService.instrumentServerAction(
|
|
'GetAllDistricts',
|
|
{ recordResponse: true },
|
|
async () => {
|
|
try {
|
|
const districts = await db.districts.findMany({
|
|
where: {
|
|
geographics: {
|
|
some: {
|
|
year: {
|
|
equals: 2024,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
include: {
|
|
geographics: {
|
|
select: {
|
|
id: true,
|
|
latitude: true,
|
|
longitude: true,
|
|
address: true,
|
|
land_area: true,
|
|
},
|
|
},
|
|
},
|
|
orderBy: {
|
|
name: 'asc',
|
|
},
|
|
});
|
|
|
|
return districts;
|
|
} catch (err) {
|
|
const crashReporterService = getInjection('ICrashReporterService');
|
|
crashReporterService.report(err);
|
|
throw new Error(
|
|
'An error happened while fetching districts. The developers have been notified.'
|
|
);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get district information by ID
|
|
*/
|
|
export async function getDistrictById(id: string) {
|
|
const instrumentationService = getInjection('IInstrumentationService');
|
|
return await instrumentationService.instrumentServerAction(
|
|
'GetDistrictById',
|
|
{ recordResponse: true },
|
|
async () => {
|
|
try {
|
|
const district = await db.districts.findUnique({
|
|
where: {
|
|
id,
|
|
geographics: {
|
|
some: {
|
|
year: {
|
|
equals: 2024,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
include: {
|
|
geographics: {
|
|
select: {
|
|
id: true,
|
|
latitude: true,
|
|
longitude: true,
|
|
address: true,
|
|
land_area: true,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
if (!district) {
|
|
throw new NotFoundError(`District with ID ${id} not found`);
|
|
}
|
|
|
|
return district;
|
|
} catch (err) {
|
|
if (err instanceof NotFoundError) {
|
|
throw err;
|
|
}
|
|
|
|
const crashReporterService = getInjection('ICrashReporterService');
|
|
crashReporterService.report(err);
|
|
throw new Error(
|
|
'An error happened while fetching district data. The developers have been notified.'
|
|
);
|
|
}
|
|
}
|
|
);
|
|
}
|