import "server-only"; import { getDb } from "@/db"; import { catalogArtifacts, catalogCharacters, catalogWeapons } from "@/db/schema"; import { inArray } from "drizzle-orm"; import { publicMediaUrl } from "@/lib/media/storage"; import type { CommissionRequest } from "./request"; export async function validateCommissionCatalog(request: CommissionRequest): Promise { const [characters, weapons, artifacts] = await Promise.all([ getDb().select({ key: catalogCharacters.key, weaponType: catalogCharacters.weaponType, constellations: catalogCharacters.constellations }).from(catalogCharacters), getDb().select({ key: catalogWeapons.key, weaponType: catalogWeapons.weaponType }).from(catalogWeapons), getDb().select({ key: catalogArtifacts.key }).from(catalogArtifacts), ]); const characterByKey = new Map(characters.map((item) => [item.key, item])); const weaponByKey = new Map(weapons.map((item) => [item.key, item])); const artifactKeys = new Set(artifacts.map((item) => item.key)); const compatible = (characterKey: string, weaponKey: string) => { const character = characterByKey.get(characterKey); const weapon = weaponByKey.get(weaponKey); return Boolean(character?.weaponType && weapon?.weaponType === character.weaponType); }; return request.teams.every(({ members }) => members.every((member) => compatible(member.characterKey, member.weaponKey) && artifactKeys.has(member.artifactKey))) && request.weapons.every(({ characterKey, weaponKeys }) => weaponKeys.every((weaponKey) => compatible(characterKey, weaponKey))) && request.constellations.every(({ characterKey, levels }) => { const character = characterByKey.get(characterKey); return Boolean(character && levels.every((level) => level === 0 || character.constellations.some((item) => item.level === level))); }); } export async function getCommissionLabels(request: CommissionRequest) { const characterKeys = [...new Set([ ...request.teams.flatMap(({ members }) => members.map(({ characterKey }) => characterKey)), ...request.weapons.map(({ characterKey }) => characterKey), ...request.constellations.map(({ characterKey }) => characterKey), ])]; const weaponKeys = [...new Set([ ...request.teams.flatMap(({ members }) => members.map(({ weaponKey }) => weaponKey)), ...request.weapons.flatMap(({ weaponKeys }) => weaponKeys), ])]; const artifactKeys = [...new Set(request.teams.flatMap(({ members }) => members.map(({ artifactKey }) => artifactKey)))]; const [characters, weapons, artifacts] = await Promise.all([ characterKeys.length ? getDb().select({ key: catalogCharacters.key, name: catalogCharacters.name, imageKey: catalogCharacters.imageKey, element: catalogCharacters.element, rarity: catalogCharacters.rarity }) .from(catalogCharacters).where(inArray(catalogCharacters.key, characterKeys)) : Promise.resolve([]), weaponKeys.length ? getDb().select({ key: catalogWeapons.key, name: catalogWeapons.name, imageKey: catalogWeapons.imageKey, rarity: catalogWeapons.rarity }) .from(catalogWeapons).where(inArray(catalogWeapons.key, weaponKeys)) : Promise.resolve([]), artifactKeys.length ? getDb().select({ key: catalogArtifacts.key, name: catalogArtifacts.name, imageKey: catalogArtifacts.imageKey, rarity: catalogArtifacts.rarity }) .from(catalogArtifacts).where(inArray(catalogArtifacts.key, artifactKeys)) : Promise.resolve([]), ]); return { characters: characters.map(({ imageKey, ...item }) => ({ ...item, imageUrl: publicMediaUrl(imageKey) })), weapons: weapons.map(({ imageKey, ...item }) => ({ ...item, imageUrl: publicMediaUrl(imageKey) })), artifacts: artifacts.map(({ imageKey, ...item }) => ({ ...item, imageUrl: publicMediaUrl(imageKey) })), }; }