feat: enhance character data loading with distinct statuses and genders, optimize epithets handling
All checks were successful
Build Docker Image / build (push) Successful in 1m42s
All checks were successful
Build Docker Image / build (push) Successful in 1m42s
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { db } from '$lib/server/db';
|
||||
import { character, devilFruit, arc, characterOverride } from '$lib/server/db/schema';
|
||||
import { eq } from 'drizzle-orm';
|
||||
import { eq, sql } from 'drizzle-orm';
|
||||
import { fail } from '@sveltejs/kit';
|
||||
import type { PageServerLoad, Actions } from './$types';
|
||||
import { writeFile } from 'fs/promises';
|
||||
@@ -9,7 +9,7 @@ import { existsSync, mkdirSync } from 'fs';
|
||||
import { env } from '$env/dynamic/private';
|
||||
|
||||
export const load: PageServerLoad = async () => {
|
||||
const [charactersData, devilFruits, arcs, overrides] = await Promise.all([
|
||||
const [charactersData, devilFruits, arcs, overrides, statusesData, gendersData] = await Promise.all([
|
||||
db
|
||||
.select({
|
||||
id: character.id,
|
||||
@@ -41,12 +41,36 @@ export const load: PageServerLoad = async () => {
|
||||
.orderBy(character.name),
|
||||
db.select().from(devilFruit).orderBy(devilFruit.name),
|
||||
db.select().from(arc).orderBy(arc.name),
|
||||
db.select().from(characterOverride)
|
||||
db.select().from(characterOverride),
|
||||
db.selectDistinct({ status: character.status })
|
||||
.from(character)
|
||||
.where(sql`${character.status} IS NOT NULL AND ${character.status} != ''`),
|
||||
db.selectDistinct({ gender: character.gender })
|
||||
.from(character)
|
||||
.where(sql`${character.gender} IS NOT NULL AND ${character.gender} != ''`)
|
||||
]);
|
||||
|
||||
// Create a map of overrides by characterId for easy lookup
|
||||
const overridesMap = new Map(overrides.map((o) => [o.characterId, o]));
|
||||
|
||||
// Create maps for arcs and devil fruits to lookup names by ID
|
||||
const arcMap = new Map(arcs.map((a) => [a.id, a.name]));
|
||||
const devilFruitMap = new Map(devilFruits.map((f) => [f.id, { name: f.name, type: f.type }]));
|
||||
|
||||
// Helper function to normalize data (parse JSON arrays)
|
||||
const normalizeArray = (value: any): any => {
|
||||
if (!value) return value;
|
||||
if (Array.isArray(value)) return value;
|
||||
if (typeof value === 'string' && value.includes('[')) {
|
||||
try {
|
||||
return JSON.parse(value);
|
||||
} catch {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
};
|
||||
|
||||
// Merge character data with overrides
|
||||
const charactersWithOverrides = charactersData.map((char) => {
|
||||
const override = overridesMap.get(char.id);
|
||||
@@ -59,8 +83,29 @@ export const load: PageServerLoad = async () => {
|
||||
displayValues[key as keyof typeof displayValues] = override[key as keyof typeof override];
|
||||
}
|
||||
});
|
||||
|
||||
// Update arcName if arcId was overridden
|
||||
if (override.arcId !== null && override.arcId !== undefined) {
|
||||
displayValues.arcName = arcMap.get(override.arcId) || null;
|
||||
}
|
||||
|
||||
// Update devilFruitName and devilFruitType if devilFruitId was overridden
|
||||
if (override.devilFruitId !== null && override.devilFruitId !== undefined) {
|
||||
const fruit = devilFruitMap.get(override.devilFruitId);
|
||||
displayValues.devilFruitName = fruit?.name || null;
|
||||
displayValues.devilFruitType = fruit?.type || null;
|
||||
}
|
||||
}
|
||||
|
||||
// Pre-normalize arrays (epithets, affiliations) for performance
|
||||
displayValues.epithets = normalizeArray(displayValues.epithets);
|
||||
displayValues.affiliations = normalizeArray(displayValues.affiliations);
|
||||
|
||||
// Create search text for epithets
|
||||
displayValues.epithetsSearchText = Array.isArray(displayValues.epithets)
|
||||
? displayValues.epithets.join(' ').toLowerCase()
|
||||
: (displayValues.epithets || '').toLowerCase();
|
||||
|
||||
return {
|
||||
...char,
|
||||
override,
|
||||
@@ -71,7 +116,15 @@ export const load: PageServerLoad = async () => {
|
||||
return {
|
||||
characters: charactersWithOverrides,
|
||||
devilFruits,
|
||||
arcs
|
||||
arcs,
|
||||
availableStatuses: statusesData
|
||||
.map(s => s.status)
|
||||
.filter((s): s is string => !!s)
|
||||
.sort((a, b) => a.localeCompare(b)),
|
||||
availableGenders: gendersData
|
||||
.map(g => g.gender)
|
||||
.filter((g): g is string => !!g)
|
||||
.sort((a, b) => a.localeCompare(b))
|
||||
};
|
||||
};
|
||||
|
||||
@@ -137,11 +190,16 @@ export const actions: Actions = {
|
||||
if (hasUploadedPicture && key === 'pictureUrl') {
|
||||
return;
|
||||
}
|
||||
// Handle integers (age, bounty, height, devilFruitId, arcId)
|
||||
if (key === 'age' || key === 'bounty' || key === 'height' || key === 'devilFruitId' || key === 'arcId') {
|
||||
// Handle integers (age, bounty, height)
|
||||
if (key === 'age' || key === 'bounty' || key === 'height') {
|
||||
const strValue = value as string;
|
||||
updates[key] = strValue && strValue !== '' ? parseInt(strValue) : null;
|
||||
}
|
||||
// Handle text IDs (devilFruitId, arcId)
|
||||
else if (key === 'devilFruitId' || key === 'arcId') {
|
||||
const strValue = value as string;
|
||||
updates[key] = strValue && strValue !== '' ? strValue : null;
|
||||
}
|
||||
// Handle checkboxes (haki fields) after parsing all form data
|
||||
else if (key === 'hakiObservation' || key === 'hakiArmament' || key === 'hakiConqueror') {
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user