63 lines
3.7 KiB
TypeScript
63 lines
3.7 KiB
TypeScript
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<boolean> {
|
|
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) })),
|
|
};
|
|
}
|