feat : big update
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
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) })),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user