Files
UAS-SIG-d1041231006/sistem-km-next/scripts/upload_subdistricts.js
T
2026-06-10 19:36:52 +07:00

76 lines
2.4 KiB
JavaScript

const fs = require('fs');
const { createClient } = require('@supabase/supabase-js');
// Parse .env.local
const envFile = fs.readFileSync('.env.local', 'utf8');
const envVars = {};
envFile.split('\n').forEach(line => {
const match = line.match(/^([^=]+)=(.*)$/);
if (match) envVars[match[1]] = match[2];
});
async function main() {
const supabaseUrl = envVars.NEXT_PUBLIC_SUPABASE_URL;
const supabaseKey = envVars.SUPABASE_SERVICE_ROLE_KEY;
if (!supabaseUrl || !supabaseKey) {
console.error('Missing Supabase credentials in .env.local');
process.exit(1);
}
const supabase = createClient(supabaseUrl, supabaseKey);
// 1. Upload Sub-districts
console.log('Reading GeoJSON...');
const geojsonRaw = fs.readFileSync('src/lib/Admin_Kecamatan.json', 'utf8');
const geojson = JSON.parse(geojsonRaw);
for (const feature of geojson.features) {
const name = feature.properties?.Ket;
if (!name) continue;
let geom = feature.geometry;
if (geom.type === 'Polygon') {
geom = {
type: 'MultiPolygon',
coordinates: [geom.coordinates]
};
}
console.log(`Uploading ${name}...`);
// Supabase auto-casts GeoJSON objects to PostGIS geometry during insert
const { error } = await supabase.from('sub_districts').upsert(
{ name: name, geom: geom },
{ onConflict: 'name' }
);
if (error) {
console.error(`Failed to upload ${name}:`, error.message);
} else {
console.log(`Success: ${name}`);
}
}
// 2. Trigger updates on existing households to populate the sub_district column
console.log('Triggering updates on existing households to populate sub_district...');
const { data: households, error: fetchErr } = await supabase.from('households').select('id, location');
if (fetchErr) {
console.error('Error fetching households:', fetchErr);
} else if (households && households.length > 0) {
console.log(`Found ${households.length} households. Updating...`);
for (const hh of households) {
// Touching the row will fire the trigger
const { error: upErr } = await supabase.from('households').update({ location: hh.location }).eq('id', hh.id);
if (upErr) console.error(`Error updating HH ${hh.id}:`, upErr.message);
}
console.log('Completed household updates.');
} else {
console.log('No households found to update.');
}
console.log('Migration complete.');
}
main();