update
This commit is contained in:
@@ -54,7 +54,8 @@ function mapDienstgrad(raw: string): string | null {
|
||||
export async function syncToDatabase(
|
||||
pool: Pool,
|
||||
members: FdiskMember[],
|
||||
ausbildungen: FdiskAusbildung[]
|
||||
ausbildungen: FdiskAusbildung[],
|
||||
force = false
|
||||
): Promise<void> {
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
@@ -62,6 +63,7 @@ export async function syncToDatabase(
|
||||
|
||||
let updated = 0;
|
||||
let unchanged = 0;
|
||||
let forced = 0;
|
||||
let skipped = 0;
|
||||
|
||||
for (const member of members) {
|
||||
@@ -161,12 +163,20 @@ export async function syncToDatabase(
|
||||
if (changes.length > 0) {
|
||||
log(`Updated ${member.vorname} ${member.zuname} (${member.standesbuchNr}): ${changes.join(', ')}`);
|
||||
updated++;
|
||||
} else if (force) {
|
||||
// Force mode: explicitly update timestamp and log even unchanged rows
|
||||
await client.query(
|
||||
`UPDATE mitglieder_profile SET updated_at = NOW() WHERE user_id = $1`,
|
||||
[userId]
|
||||
);
|
||||
log(`Forced update ${member.vorname} ${member.zuname} (${member.standesbuchNr}): no changes, timestamp refreshed`);
|
||||
forced++;
|
||||
} else {
|
||||
unchanged++;
|
||||
}
|
||||
}
|
||||
|
||||
log(`Members: ${updated} changed, ${unchanged} unchanged, ${skipped} skipped (no dashboard account)`);
|
||||
log(`Members: ${updated} changed, ${unchanged} unchanged, ${forced} forced, ${skipped} skipped (no dashboard account)`);
|
||||
|
||||
// Upsert Ausbildungen
|
||||
let ausbildungNew = 0;
|
||||
|
||||
@@ -46,7 +46,7 @@ function msUntilMidnight(): number {
|
||||
return midnight.getTime() - now.getTime();
|
||||
}
|
||||
|
||||
async function runSync(): Promise<void> {
|
||||
async function runSync(force = false): Promise<void> {
|
||||
if (syncRunning) {
|
||||
log('Sync already in progress, skipping');
|
||||
return;
|
||||
@@ -64,9 +64,10 @@ async function runSync(): Promise<void> {
|
||||
});
|
||||
|
||||
try {
|
||||
if (force) log('Force mode: ON');
|
||||
log('Starting FDISK sync');
|
||||
const { members, ausbildungen } = await scrapeAll(username, password);
|
||||
await syncToDatabase(pool, members, ausbildungen);
|
||||
await syncToDatabase(pool, members, ausbildungen, force);
|
||||
log(`Sync complete — ${members.length} members, ${ausbildungen.length} Ausbildungen`);
|
||||
} finally {
|
||||
syncRunning = false;
|
||||
@@ -87,9 +88,20 @@ function startHttpServer(port: number) {
|
||||
res.end(JSON.stringify({ running: true, message: 'Sync already in progress' }));
|
||||
return;
|
||||
}
|
||||
res.writeHead(200);
|
||||
res.end(JSON.stringify({ started: true }));
|
||||
runSync().catch(err => log(`ERROR during manual sync: ${err.message}`));
|
||||
let body = '';
|
||||
req.on('data', (chunk: Buffer) => { body += chunk.toString(); });
|
||||
req.on('end', () => {
|
||||
let force = false;
|
||||
try {
|
||||
const parsed = JSON.parse(body);
|
||||
force = parsed?.force === true;
|
||||
} catch {
|
||||
// no body or invalid JSON — force stays false
|
||||
}
|
||||
res.writeHead(200);
|
||||
res.end(JSON.stringify({ started: true, force }));
|
||||
runSync(force).catch(err => log(`ERROR during manual sync: ${err.message}`));
|
||||
});
|
||||
} else {
|
||||
res.writeHead(404);
|
||||
res.end(JSON.stringify({ message: 'Not found' }));
|
||||
|
||||
Reference in New Issue
Block a user