fix(sync): remove debug file writing and optimize DB queries
This commit is contained in:
135
sync/src/db.ts
135
sync/src/db.ts
@@ -255,61 +255,29 @@ export async function syncToDatabase(
|
||||
|
||||
log(`Members: ${updated} changed, ${unchanged} unchanged, ${forced} forced, ${created} created, ${skipped} skipped`);
|
||||
|
||||
// Build StNr → userId lookup map (single query instead of per-record lookups)
|
||||
const lookupResult = await client.query<{ fdisk_standesbuch_nr: string; user_id: string }>(
|
||||
`SELECT fdisk_standesbuch_nr, user_id FROM mitglieder_profile WHERE fdisk_standesbuch_nr IS NOT NULL`
|
||||
);
|
||||
const stNrToUserId = new Map<string, string>(
|
||||
lookupResult.rows.map(r => [r.fdisk_standesbuch_nr, r.user_id])
|
||||
);
|
||||
log(`Lookup map: ${stNrToUserId.size} StNr→userId mappings`);
|
||||
|
||||
// Upsert Ausbildungen
|
||||
let ausbildungNew = 0;
|
||||
let ausbildungUpdated = 0;
|
||||
let ausbildungSkipped = 0;
|
||||
|
||||
for (const ausb of ausbildungen) {
|
||||
const result = await client.query<{ user_id: string }>(
|
||||
`SELECT user_id FROM mitglieder_profile WHERE fdisk_standesbuch_nr = $1`,
|
||||
[ausb.standesbuchNr]
|
||||
);
|
||||
|
||||
if (result.rows.length === 0) {
|
||||
ausbildungSkipped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
const userId = result.rows[0].user_id;
|
||||
|
||||
const upsertResult = await client.query<{ was_inserted: boolean }>(
|
||||
`INSERT INTO ausbildung (user_id, kursname, kursnummer, kurs_kurzbezeichnung, erfolgscode, kurs_datum, ablaufdatum, ort, bemerkung, fdisk_sync_key)
|
||||
VALUES ($1, $2, $3, $4, $5, $6::date, $7::date, $8, $9, $10)
|
||||
ON CONFLICT (user_id, fdisk_sync_key) DO UPDATE SET
|
||||
kursname = EXCLUDED.kursname,
|
||||
kursnummer = EXCLUDED.kursnummer,
|
||||
kurs_kurzbezeichnung = EXCLUDED.kurs_kurzbezeichnung,
|
||||
erfolgscode = EXCLUDED.erfolgscode,
|
||||
kurs_datum = EXCLUDED.kurs_datum,
|
||||
ablaufdatum = EXCLUDED.ablaufdatum,
|
||||
ort = EXCLUDED.ort,
|
||||
bemerkung = EXCLUDED.bemerkung,
|
||||
updated_at = NOW()
|
||||
RETURNING (xmax = 0) AS was_inserted`,
|
||||
[userId, ausb.kursname, ausb.kursnummer, ausb.kurzbezeichnung, ausb.erfolgscode, ausb.kursDatum, ausb.ablaufdatum, ausb.ort, ausb.bemerkung, ausb.syncKey]
|
||||
);
|
||||
|
||||
if (upsertResult.rows[0]?.was_inserted) {
|
||||
log(`New Ausbildung: ${ausb.standesbuchNr} — ${ausb.kursname}${ausb.kursDatum ? ` (${ausb.kursDatum})` : ''}`);
|
||||
ausbildungNew++;
|
||||
} else {
|
||||
ausbildungUpdated++;
|
||||
}
|
||||
}
|
||||
|
||||
log(`Ausbildungen: ${ausbildungNew} neu, ${ausbildungUpdated} unverändert, ${ausbildungSkipped} übersprungen`);
|
||||
const ausbildungStats = await syncAusbildungen(client, ausbildungen, stNrToUserId);
|
||||
log(`Ausbildungen: ${ausbildungStats.neu} neu, ${ausbildungStats.updated} unverändert, ${ausbildungStats.skipped} übersprungen`);
|
||||
|
||||
// Upsert Beförderungen
|
||||
const befoerderungStats = await syncBefoerderungen(client, befoerderungen);
|
||||
const befoerderungStats = await syncBefoerderungen(client, befoerderungen, stNrToUserId);
|
||||
log(`Beförderungen: ${befoerderungStats.neu} neu, ${befoerderungStats.updated} unverändert, ${befoerderungStats.skipped} übersprungen`);
|
||||
|
||||
// Upsert Untersuchungen
|
||||
const untersuchungStats = await syncUntersuchungen(client, untersuchungen);
|
||||
const untersuchungStats = await syncUntersuchungen(client, untersuchungen, stNrToUserId);
|
||||
log(`Untersuchungen: ${untersuchungStats.neu} neu, ${untersuchungStats.updated} unverändert, ${untersuchungStats.skipped} übersprungen`);
|
||||
|
||||
// Upsert Fahrgenehmigungen
|
||||
const fahrgenStats = await syncFahrgenehmigungen(client, fahrgenehmigungen);
|
||||
const fahrgenStats = await syncFahrgenehmigungen(client, fahrgenehmigungen, stNrToUserId);
|
||||
log(`Fahrgenehmigungen: ${fahrgenStats.neu} neu, ${fahrgenStats.updated} unverändert, ${fahrgenStats.skipped} übersprungen`);
|
||||
|
||||
await client.query('COMMIT');
|
||||
@@ -321,20 +289,55 @@ export async function syncToDatabase(
|
||||
}
|
||||
}
|
||||
|
||||
async function syncAusbildungen(
|
||||
client: PoolClient,
|
||||
ausbildungen: FdiskAusbildung[],
|
||||
stNrToUserId: Map<string, string>
|
||||
): Promise<{ neu: number; updated: number; skipped: number }> {
|
||||
let neu = 0, updated = 0, skipped = 0;
|
||||
|
||||
for (const ausb of ausbildungen) {
|
||||
const userId = stNrToUserId.get(ausb.standesbuchNr);
|
||||
if (!userId) { skipped++; continue; }
|
||||
|
||||
const upsertResult = await client.query<{ was_inserted: boolean }>(
|
||||
`INSERT INTO ausbildung (user_id, kursname, kursnummer, kurs_kurzbezeichnung, erfolgscode, kurs_datum, ablaufdatum, ort, bemerkung, fdisk_sync_key)
|
||||
VALUES ($1, $2, $3, $4, $5, $6::date, $7::date, $8, $9, $10)
|
||||
ON CONFLICT (user_id, fdisk_sync_key) DO UPDATE SET
|
||||
kursname = EXCLUDED.kursname,
|
||||
kursnummer = EXCLUDED.kursnummer,
|
||||
kurs_kurzbezeichnung = EXCLUDED.kurs_kurzbezeichnung,
|
||||
erfolgscode = EXCLUDED.erfolgscode,
|
||||
kurs_datum = EXCLUDED.kurs_datum,
|
||||
ablaufdatum = EXCLUDED.ablaufdatum,
|
||||
ort = EXCLUDED.ort,
|
||||
bemerkung = EXCLUDED.bemerkung,
|
||||
updated_at = NOW()
|
||||
RETURNING (xmax = 0) AS was_inserted`,
|
||||
[userId, ausb.kursname, ausb.kursnummer, ausb.kurzbezeichnung, ausb.erfolgscode, ausb.kursDatum, ausb.ablaufdatum, ausb.ort, ausb.bemerkung, ausb.syncKey]
|
||||
);
|
||||
|
||||
if (upsertResult.rows[0]?.was_inserted) {
|
||||
log(`New Ausbildung: ${ausb.standesbuchNr} — ${ausb.kursname}${ausb.kursDatum ? ` (${ausb.kursDatum})` : ''}`);
|
||||
neu++;
|
||||
} else {
|
||||
updated++;
|
||||
}
|
||||
}
|
||||
|
||||
return { neu, updated, skipped };
|
||||
}
|
||||
|
||||
async function syncBefoerderungen(
|
||||
client: PoolClient,
|
||||
befoerderungen: FdiskBefoerderung[]
|
||||
befoerderungen: FdiskBefoerderung[],
|
||||
stNrToUserId: Map<string, string>
|
||||
): Promise<{ neu: number; updated: number; skipped: number }> {
|
||||
let neu = 0, updated = 0, skipped = 0;
|
||||
|
||||
for (const b of befoerderungen) {
|
||||
const result = await client.query<{ user_id: string }>(
|
||||
`SELECT user_id FROM mitglieder_profile WHERE fdisk_standesbuch_nr = $1`,
|
||||
[b.standesbuchNr]
|
||||
);
|
||||
|
||||
if (result.rows.length === 0) { skipped++; continue; }
|
||||
const userId = result.rows[0].user_id;
|
||||
const userId = stNrToUserId.get(b.standesbuchNr);
|
||||
if (!userId) { skipped++; continue; }
|
||||
|
||||
const upsertResult = await client.query<{ was_inserted: boolean }>(
|
||||
`INSERT INTO befoerderungen (user_id, datum, dienstgrad, fdisk_sync_key)
|
||||
@@ -360,18 +363,14 @@ async function syncBefoerderungen(
|
||||
|
||||
async function syncUntersuchungen(
|
||||
client: PoolClient,
|
||||
untersuchungen: FdiskUntersuchung[]
|
||||
untersuchungen: FdiskUntersuchung[],
|
||||
stNrToUserId: Map<string, string>
|
||||
): Promise<{ neu: number; updated: number; skipped: number }> {
|
||||
let neu = 0, updated = 0, skipped = 0;
|
||||
|
||||
for (const u of untersuchungen) {
|
||||
const result = await client.query<{ user_id: string }>(
|
||||
`SELECT user_id FROM mitglieder_profile WHERE fdisk_standesbuch_nr = $1`,
|
||||
[u.standesbuchNr]
|
||||
);
|
||||
|
||||
if (result.rows.length === 0) { skipped++; continue; }
|
||||
const userId = result.rows[0].user_id;
|
||||
const userId = stNrToUserId.get(u.standesbuchNr);
|
||||
if (!userId) { skipped++; continue; }
|
||||
|
||||
const upsertResult = await client.query<{ was_inserted: boolean }>(
|
||||
`INSERT INTO untersuchungen (user_id, datum, anmerkungen, art, ergebnis, fdisk_sync_key)
|
||||
@@ -399,7 +398,8 @@ async function syncUntersuchungen(
|
||||
|
||||
async function syncFahrgenehmigungen(
|
||||
client: PoolClient,
|
||||
fahrgenehmigungen: FdiskFahrgenehmigung[]
|
||||
fahrgenehmigungen: FdiskFahrgenehmigung[],
|
||||
stNrToUserId: Map<string, string>
|
||||
): Promise<{ neu: number; updated: number; skipped: number }> {
|
||||
let neu = 0, updated = 0, skipped = 0;
|
||||
|
||||
@@ -420,13 +420,8 @@ async function syncFahrgenehmigungen(
|
||||
continue;
|
||||
}
|
||||
|
||||
const result = await client.query<{ user_id: string }>(
|
||||
`SELECT user_id FROM mitglieder_profile WHERE fdisk_standesbuch_nr = $1`,
|
||||
[f.standesbuchNr]
|
||||
);
|
||||
|
||||
if (result.rows.length === 0) { skipped++; continue; }
|
||||
const userId = result.rows[0].user_id;
|
||||
const userId = stNrToUserId.get(f.standesbuchNr);
|
||||
if (!userId) { skipped++; continue; }
|
||||
|
||||
const upsertResult = await client.query<{ was_inserted: boolean }>(
|
||||
`INSERT INTO fahrgenehmigungen (user_id, ausstellungsdatum, gueltig_bis, behoerde, nummer, klasse, fdisk_sync_key)
|
||||
|
||||
Reference in New Issue
Block a user