Skip to content

Commit

Permalink
#CustomDecks
Browse files Browse the repository at this point in the history
- Cleaned up code for PR
  • Loading branch information
CheBato committed Dec 10, 2024
1 parent debb687 commit 059fd27
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 36 deletions.
68 changes: 37 additions & 31 deletions src/app/_utils/s3Utils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { CardData } from "../_components/_sharedcomponents/Cards/CardTypes";


// Deck data interfaces for deck info from swudb
interface DeckMetadata {
name: string;
author: string;
Expand All @@ -10,11 +10,18 @@ interface DeckCard {
id: string;
count: number;
}
interface ServerDeckCard {
count: number;
card: CardDetails

interface DeckData {
metadata: DeckMetadata;
leader: DeckCard;
secondleader: DeckCard | null;
base: DeckCard;
deck: DeckCard[];
sideboard: DeckCard[];
}
interface CardDetails {

// Deck data interfaces for deck info on the server
interface ServerCardDetails {
title: string;
subtitle: string | null;
cost: number | null;
Expand All @@ -37,23 +44,19 @@ interface CardDetails {
internalName: string;
}

interface DeckData {
metadata: DeckMetadata;
leader: DeckCard;
secondleader: DeckCard | null;
base: DeckCard;
deck: DeckCard[];
sideboard: DeckCard[];
interface ServerDeckCard {
count: number;
card: ServerCardDetails;
}

interface ServerDeckData {
leader: DeckCard;
secondleader: DeckCard | null;
base: DeckCard;
deckCards: DeckCard[];
sideboard: DeckCard[];
leader: ServerDeckCard[];
base: ServerDeckCard[];
deckCards: ServerDeckCard[];
sideboard: ServerDeckCard[];
}

// types of mapping
type Mapping = {
[id:string]: string;
}
Expand All @@ -77,27 +80,28 @@ export const s3CardImageURL = (card: CardData) => {


// Helper function to update a card's id
export const updateIdsWithMapping = (data: DeckData, mapping: Mapping): ServerDeckData => {
export const updateIdsWithMapping = (data: DeckData, mapping: Mapping): DeckData => {

const updateCard = (card: DeckCard): DeckCard => {
const updatedId = mapping[card.id] || card.id; // Use mapping if available, else keep the original id
return { ...card, id: updatedId };
};

return {
metadata: data.metadata,
leader: updateCard(data.leader),
secondleader: data.secondleader,
base: updateCard(data.base),
deckCards: data.deck.map(updateCard), // Update all cards in the deck
deck: data.deck.map(updateCard), // Update all cards in the deck
sideboard: data.sideboard.map(updateCard) // Update all cards in the sideboard
};
};

// Helper function to update a cards id to its internal name
export function mapIdToInternalName(
mapper: idToInternalNameMapping[],
deckData: ServerDeckData
): ServerDeckData {
deckData: DeckData
): DeckData {
// Convert the mapper array to a lookup map for faster access
const idToNameMap = new Map<string, string>();
mapper.forEach(entry => {
Expand Down Expand Up @@ -126,25 +130,30 @@ export function mapIdToInternalName(
const updatedBase = updateCardSlot(deckData.base);

// Update deck and sideboard arrays
const updatedDeck = deckData.deckCards.map(updateCardSlot).filter((slot): slot is DeckCard => slot !== null);
const updatedDeck = deckData.deck.map(updateCardSlot).filter((slot): slot is DeckCard => slot !== null);
const updatedSideboard = deckData.sideboard.map(updateCardSlot).filter((slot): slot is DeckCard => slot !== null);

return {
...deckData,
metadata: deckData.metadata,
leader: updatedLeader,
secondleader: updatedSecondLeader,
base: updatedBase,
deckCards: updatedDeck,
deck: updatedDeck,
sideboard: updatedSideboard
};
}

// helper function to convert DeckWithInternalName to a playable set of cards.
// Fetch card details from the API
const fetchCardData = async (internalName: string): Promise<CardDetails | null> => {
const fetchCardData = async (internalName: string): Promise<ServerCardDetails | null> => {
try {
const response = await fetch(`/api/s3bucket?jsonFile=cards/${encodeURIComponent(internalName)}.json`);
const cardDetails = await response.json();
// Do we want to inform the user that some of the cards weren't imported?
if(cardDetails.status){
console.error(`Failed to fetch card data for ${internalName}:`);
return null
}
return cardDetails[0];
} catch {
console.error(`Failed to fetch card data for ${internalName}:`);
Expand All @@ -153,7 +162,7 @@ const fetchCardData = async (internalName: string): Promise<CardDetails | null>
};

// Transform Deck with card details
export const transformDeckWithCardData = async (deckData: ServerDeckData): Promise<any> => {
export const transformDeckWithCardData = async (deckData: DeckData): Promise<ServerDeckData | null> => {
try {
const transformCard = async (deckCard: DeckCard): Promise<ServerDeckCard | null> => {
const cardData = await fetchCardData(deckCard.id);
Expand All @@ -165,12 +174,9 @@ export const transformDeckWithCardData = async (deckData: ServerDeckData): Promi
};

const leader = await transformCard(deckData.leader);
const secondleader = deckData.secondleader
? await transformCard(deckData.secondleader)
: null;
const base = await transformCard(deckData.base);
const deckCards = (
await Promise.all(deckData.deckCards.map((card) => transformCard(card)))
await Promise.all(deckData.deck.map((card) => transformCard(card)))
).filter((card) => card !== null);
const sideboard = (
await Promise.all(deckData.sideboard.map((card) => transformCard(card)))
Expand All @@ -179,7 +185,7 @@ export const transformDeckWithCardData = async (deckData: ServerDeckData): Promi
leader: leader ? [leader] : [],
base: base ? [base] : [],
deckCards,
selected:true,
sideboard,
};
} catch {
console.error('Error transforming deck with card data');
Expand Down
9 changes: 4 additions & 5 deletions src/app/api/s3bucket/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,25 @@ export async function GET(req: Request) {
const jsonFile = searchParams.get("jsonFile");
if(!jsonFile) {
console.error("Error: Missing parameter jsonFile");
return NextResponse.json({ error: "Missing parameter jsonFile" }, { status: 400 });
return NextResponse.json({ error: "Missing parameter jsonFile", status: 400 });
}
const response = await fetch("https://karabast-assets.s3.amazonaws.com/data/"+encodeURIComponent(jsonFile));

if (!response.ok) {
console.error("Failed to fetch card mapping:", response.statusText);
return NextResponse.json({ error: "Failed to fetch card mapping" }, { status: 500 });
return NextResponse.json({ error: "Failed to fetch card mapping", status: 500 });
}

const data = await response.json();
return NextResponse.json(data);
} catch (error) {
if (error instanceof Error) {
console.error("Internal Server Error:", error.message);
return NextResponse.json({ error: error.message }, { status: 500 });
return NextResponse.json({ error: error.message, status: 500 });
}

return NextResponse.json(
{ error: "An unexpected error occurred" },
{ status: 500 }
{ error: "An unexpected error occurred", status: 500 }
);
}
}

0 comments on commit 059fd27

Please sign in to comment.