refactor(*): Implement CSV-based seeding, dynamic box placement, and enforce forms from pokedex configuration

This commit is contained in:
Josh Creek
2026-01-05 09:44:15 +00:00
parent 19a571e315
commit b9a49686c1
18 changed files with 1054 additions and 1625 deletions
+18 -47
View File
@@ -3,6 +3,7 @@ import { type CatchRecord, type CatchRecordDB } from '$lib/models/CatchRecord';
import { type CombinedData } from '$lib/models/CombinedData';
import type { SupabaseClient } from '@supabase/supabase-js';
import { getRegionalDexColumnName } from '$lib/utils/regionalDexMapping';
import { calculateBoxPlacement } from '$lib/utils/boxPlacement';
class CombinedDataRepository {
constructor(
@@ -24,16 +25,9 @@ class CombinedDataRepository {
regionToEvolveIn: entry.regionToEvolveIn || '',
evolutionInformation: entry.evolutionInformation || '',
catchInformation: entry.catchInformation || [],
boxPlacementForms: {
box: entry.boxPlacementFormsBox || 0,
row: entry.boxPlacementFormsRow || 0,
column: entry.boxPlacementFormsColumn || 0
},
boxPlacement: {
box: entry.boxPlacementBox || 0,
row: entry.boxPlacementRow || 0,
column: entry.boxPlacementColumn || 0
},
// Box placement will be calculated dynamically after sorting
boxPlacementForms: { box: 0, row: 0, column: 0 },
boxPlacement: { box: 0, row: 0, column: 0 },
kantoDexNumber: entry.kanto_dex_number ?? undefined,
johtoDexNumber: entry.johto_dex_number ?? undefined,
hoennDexNumber: entry.hoenn_dex_number ?? undefined,
@@ -77,7 +71,8 @@ class CombinedDataRepository {
// Apply filters
if (!enableForms) {
query = query.not('boxPlacementBox', 'is', null);
// Filter to only base forms (form is NULL)
query = query.is('form', null);
}
if (region) {
@@ -101,18 +96,8 @@ class CombinedDataRepository {
query = query.order('pokedexNumber', { ascending: true });
}
} else {
// No game filter - use pre-calculated box placement (national dex order)
if (enableForms) {
query = query
.order('boxPlacementFormsBox', { ascending: true })
.order('boxPlacementFormsRow', { ascending: true })
.order('boxPlacementFormsColumn', { ascending: true });
} else {
query = query
.order('boxPlacementBox', { ascending: true })
.order('boxPlacementRow', { ascending: true })
.order('boxPlacementColumn', { ascending: true });
}
// No game filter - order by national dex number
query = query.order('pokedexNumber', { ascending: true });
}
const { data: entries, error: entriesError } = await query;
@@ -158,11 +143,8 @@ class CombinedDataRepository {
};
});
// Recalculate box placement if using regional dex ordering
if (game && getRegionalDexColumnName(game)) {
return this.recalculateBoxPlacement(combinedData, enableForms);
}
return combinedData;
// Always recalculate box placement based on current sort order
return this.recalculateBoxPlacement(combinedData, enableForms);
}
async findCombinedData(
@@ -180,7 +162,8 @@ class CombinedDataRepository {
// Apply filters
if (!enableForms) {
query = query.not('boxPlacementBox', 'is', null);
// Filter to only base forms (form is NULL)
query = query.is('form', null);
}
if (region) {
@@ -204,18 +187,8 @@ class CombinedDataRepository {
query = query.order('pokedexNumber', { ascending: true });
}
} else {
// No game filter - use pre-calculated box placement (national dex order)
if (enableForms) {
query = query
.order('boxPlacementFormsBox', { ascending: true })
.order('boxPlacementFormsRow', { ascending: true })
.order('boxPlacementFormsColumn', { ascending: true });
} else {
query = query
.order('boxPlacementBox', { ascending: true })
.order('boxPlacementRow', { ascending: true })
.order('boxPlacementColumn', { ascending: true });
}
// No game filter - order by national dex number
query = query.order('pokedexNumber', { ascending: true });
}
const { data: entries, error: entriesError } = await query;
@@ -261,11 +234,8 @@ class CombinedDataRepository {
};
});
// Recalculate box placement if using regional dex ordering
if (game && getRegionalDexColumnName(game)) {
return this.recalculateBoxPlacement(combinedData, enableForms);
}
return combinedData;
// Always recalculate box placement based on current sort order
return this.recalculateBoxPlacement(combinedData, enableForms);
}
async countCombinedData(
@@ -277,7 +247,8 @@ class CombinedDataRepository {
// Apply same filters as in findCombinedData
if (!enableForms) {
query = query.not('boxPlacementBox', 'is', null);
// Filter to only base forms (form is NULL)
query = query.is('form', null);
}
if (region) {
+5 -32
View File
@@ -17,16 +17,9 @@ class PokedexEntryRepository {
regionToEvolveIn: entry.regionToEvolveIn || '',
evolutionInformation: entry.evolutionInformation || '',
catchInformation: entry.catchInformation || [],
boxPlacementForms: {
box: entry.boxPlacementFormsBox || 0,
row: entry.boxPlacementFormsRow || 0,
column: entry.boxPlacementFormsColumn || 0
},
boxPlacement: {
box: entry.boxPlacementBox || 0,
row: entry.boxPlacementRow || 0,
column: entry.boxPlacementColumn || 0
},
// Box placement is calculated dynamically - not stored in database
boxPlacementForms: { box: 0, row: 0, column: 0 },
boxPlacement: { box: 0, row: 0, column: 0 },
kantoDexNumber: entry.kanto_dex_number ?? undefined,
johtoDexNumber: entry.johto_dex_number ?? undefined,
hoennDexNumber: entry.hoenn_dex_number ?? undefined,
@@ -80,17 +73,7 @@ class PokedexEntryRepository {
if (data.evolutionInformation !== undefined)
dbData.evolutionInformation = data.evolutionInformation;
if (data.catchInformation !== undefined) dbData.catchInformation = data.catchInformation;
if (data.boxPlacementForms?.box !== undefined)
dbData.boxPlacementFormsBox = data.boxPlacementForms.box;
if (data.boxPlacementForms?.row !== undefined)
dbData.boxPlacementFormsRow = data.boxPlacementForms.row;
if (data.boxPlacementForms?.column !== undefined)
dbData.boxPlacementFormsColumn = data.boxPlacementForms.column;
if (data.boxPlacement?.box !== undefined) dbData.boxPlacementBox = data.boxPlacement.box;
if (data.boxPlacement?.row !== undefined) dbData.boxPlacementRow = data.boxPlacement.row;
if (data.boxPlacement?.column !== undefined)
dbData.boxPlacementColumn = data.boxPlacement.column;
if (data.regionalDexNumbers !== undefined) dbData.regionalDexNumbers = data.regionalDexNumbers;
// Box placement is calculated dynamically - not stored in database
const { data: result, error } = await this.supabase
.from('pokedex_entries')
@@ -115,17 +98,7 @@ class PokedexEntryRepository {
if (data.evolutionInformation !== undefined)
dbData.evolutionInformation = data.evolutionInformation;
if (data.catchInformation !== undefined) dbData.catchInformation = data.catchInformation;
if (data.boxPlacementForms?.box !== undefined)
dbData.boxPlacementFormsBox = data.boxPlacementForms.box;
if (data.boxPlacementForms?.row !== undefined)
dbData.boxPlacementFormsRow = data.boxPlacementForms.row;
if (data.boxPlacementForms?.column !== undefined)
dbData.boxPlacementFormsColumn = data.boxPlacementForms.column;
if (data.boxPlacement?.box !== undefined) dbData.boxPlacementBox = data.boxPlacement.box;
if (data.boxPlacement?.row !== undefined) dbData.boxPlacementRow = data.boxPlacement.row;
if (data.boxPlacement?.column !== undefined)
dbData.boxPlacementColumn = data.boxPlacement.column;
if (data.regionalDexNumbers !== undefined) dbData.regionalDexNumbers = data.regionalDexNumbers;
// Box placement is calculated dynamically - not stored in database
const { data: result, error } = await this.supabase
.from('pokedex_entries')