76 lines
2.4 KiB
JavaScript
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();
|