feat: refactor daily character logic to improve win count retrieval and streamline character selection

This commit is contained in:
2026-03-02 11:50:41 +01:00
parent 02c2ff2684
commit ef7ef4dd6c
2 changed files with 39 additions and 15 deletions

View File

@@ -1,6 +1,6 @@
import { db } from '$lib/server/db';
import { arc, character, characterHistory, characterOverride, devilFruit } from '$lib/server/db/schema';
import { desc, eq, inArray } from 'drizzle-orm';
import { desc, eq, inArray, and } from 'drizzle-orm';
const characterWithRelationsSelect = {
id: character.id,
@@ -197,10 +197,12 @@ export async function getCharacterById(characterId: string): Promise<CharacterWi
}
export async function getOrCreateTodayCharacter(
characters: CharacterWithRelations[],
characters?: CharacterWithRelations[],
date: Date = new Date()
): Promise<CharacterWithRelations | null> {
if (characters.length === 0) {
const dailyCharacters = characters ?? (await getDailyModeCharacters());
if (dailyCharacters.length === 0) {
return null;
}
@@ -215,7 +217,7 @@ export async function getOrCreateTodayCharacter(
if (existingEntry?.characterId) {
return (
characters.find((currentCharacter) => currentCharacter.id === existingEntry.characterId) ??
dailyCharacters.find((currentCharacter) => currentCharacter.id === existingEntry.characterId) ??
(await getCharacterById(existingEntry.characterId))
);
}
@@ -227,10 +229,10 @@ export async function getOrCreateTodayCharacter(
.limit(100);
const excludedIds = new Set(recentHistory.map((entry) => entry.characterId));
const availableCharacters = characters.filter((currentCharacter) => !excludedIds.has(currentCharacter.id));
const availableCharacters = dailyCharacters.filter((currentCharacter) => !excludedIds.has(currentCharacter.id));
const dailyCharacter = pickDailyCharacter(
availableCharacters.length > 0 ? availableCharacters : characters,
availableCharacters.length > 0 ? availableCharacters : dailyCharacters,
today
);
@@ -274,4 +276,24 @@ export async function getYesterdayCharacter(
}
return getCharacterById(yesterdayEntry.characterId);
}
export async function getTodayCharacterWinsCount(
characterId: string,
date: Date = new Date()
): Promise<number> {
const today = normalizeDay(date);
const todayDate = getDateKey(today);
const [result] = await db
.select({ won: characterHistory.won })
.from(characterHistory)
.where(
and(
eq(characterHistory.characterId, characterId),
eq(characterHistory.date, todayDate)
)
);
return result?.won ?? 0;
}