feat: enhance character scrape validation and management
All checks were successful
Build Docker Image / build (push) Successful in 1m14s
All checks were successful
Build Docker Image / build (push) Successful in 1m14s
- Added a new entry for "fuzzy_talisman" in the journal. - Updated import-json script to handle character deletion and mark absent characters as deleted in the scrape validation. - Modified schema to include an `isDeleted` field in the characterScrapeValidation table. - Renamed function `upsertCharacterFromScrapeValidation` to `applyCharacterChangeFromScrapeValidation` for clarity. - Enhanced character change loading to include deleted characters and updated UI to display them. - Improved character change handling in the Svelte component to reflect new, modified, and deleted states.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { createClient } from '@libsql/client';
|
||||
import { drizzle } from 'drizzle-orm/libsql';
|
||||
import { sql, eq } from 'drizzle-orm';
|
||||
import { sql, eq, inArray } from 'drizzle-orm';
|
||||
import fs from 'fs';
|
||||
import { arc, character, devilFruit, characterScrapeValidation, type DevilFruitType } from '../src/lib/server/db/schema';
|
||||
|
||||
@@ -140,7 +140,8 @@ function transformCharacterData(item: CharacterRecord) {
|
||||
status: toNullable(item.status),
|
||||
arcId: toNullable(item.arcId),
|
||||
url: toNullable(item.url),
|
||||
frUrl: toNullable(item.frUrl)
|
||||
frUrl: toNullable(item.frUrl),
|
||||
isDeleted: false
|
||||
};
|
||||
}
|
||||
|
||||
@@ -307,6 +308,7 @@ async function importFromJson(): Promise<void> {
|
||||
} else {
|
||||
// Update scrapeValidation table
|
||||
console.log('Characters table not empty, updating scrapeValidation table for changes...\n');
|
||||
const scrapedCharacterIds: string[] = [];
|
||||
|
||||
for (let i = 0; i < characters.length; i++) {
|
||||
const item = characters[i];
|
||||
@@ -319,6 +321,7 @@ async function importFromJson(): Promise<void> {
|
||||
|
||||
lastSql = selectQuery.toSQL();
|
||||
|
||||
scrapedCharacterIds.push(item.id);
|
||||
const jsonData = transformCharacterData(item);
|
||||
|
||||
const upsertQuery = db
|
||||
@@ -341,6 +344,57 @@ async function importFromJson(): Promise<void> {
|
||||
logSqlOnError(lastSql);
|
||||
}
|
||||
}
|
||||
|
||||
// Fetch all characters from the character table and mark those absent from the
|
||||
// scrape as deleted in scrape validation.
|
||||
const allCharacters = await db.select({ id: character.id }).from(character);
|
||||
const scrapedSet = new Set(scrapedCharacterIds);
|
||||
const idsToMarkDeleted = allCharacters
|
||||
.map((c) => c.id)
|
||||
.filter((id) => !scrapedSet.has(id));
|
||||
|
||||
if (idsToMarkDeleted.length > 0) {
|
||||
console.log(`\n⚠️ Marking ${idsToMarkDeleted.length} character(s) as deleted in scrape validation...`);
|
||||
const deletedCharacterRows = await db
|
||||
.select()
|
||||
.from(character)
|
||||
.where(inArray(character.id, idsToMarkDeleted));
|
||||
|
||||
for (const row of deletedCharacterRows) {
|
||||
await db
|
||||
.insert(characterScrapeValidation)
|
||||
.values({
|
||||
id: row.id,
|
||||
name: row.name,
|
||||
frName: row.frName,
|
||||
gender: row.gender,
|
||||
age: row.age,
|
||||
affiliations: row.affiliations,
|
||||
frAffiliations: row.frAffiliations,
|
||||
devilFruitId: row.devilFruitId,
|
||||
hakiObservation: row.hakiObservation,
|
||||
hakiArmament: row.hakiArmament,
|
||||
hakiConqueror: row.hakiConqueror,
|
||||
bounty: row.bounty,
|
||||
height: row.height,
|
||||
origin: row.origin,
|
||||
frOrigin: row.frOrigin,
|
||||
firstAppearance: row.firstAppearance,
|
||||
pictureUrl: row.pictureUrl,
|
||||
epithets: row.epithets,
|
||||
frEpithets: row.frEpithets,
|
||||
status: row.status,
|
||||
arcId: row.arcId,
|
||||
url: row.url,
|
||||
frUrl: row.frUrl,
|
||||
isDeleted: true
|
||||
})
|
||||
.onConflictDoUpdate({
|
||||
target: characterScrapeValidation.id,
|
||||
set: { isDeleted: true }
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\n\n✓ Characters imported!`);
|
||||
|
||||
Reference in New Issue
Block a user