Files
gunshiz 0022625edb
CI / Verify (push) Successful in 3m14s
CI / Build immutable images and deploy (push) Successful in 4m0s
feat : big update
2026-10-01 18:37:15 +07:00

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) })),
};
}