diff --git a/src/lib/repositories/CombinedDataRepository.ts b/src/lib/repositories/CombinedDataRepository.ts index 9d8a69b..38dedeb 100644 --- a/src/lib/repositories/CombinedDataRepository.ts +++ b/src/lib/repositories/CombinedDataRepository.ts @@ -3,6 +3,50 @@ import CatchRecordModel, { type CatchRecord } from '$lib/models/CatchRecord'; import { CombinedData } from '$lib/models/CombinedData'; class CombinedDataRepository { + async findAllCombinedData(enableForms: boolean = true): Promise { + const pipeline: any[] = [ + { + $lookup: { + from: 'catchrecords', + localField: '_id', + foreignField: 'pokedexEntryId', + as: 'catchRecord' + } + }, + { + $unwind: { + path: '$catchRecord', + preserveNullAndEmptyArrays: true + } + }, + { + $sort: { + 'boxPlacementForms.box': 1, + 'boxPlacementForms.row': 1, + 'boxPlacementForms.column': 1 + } + } + ]; + + if (!enableForms) { + pipeline.unshift({ + $match: { + 'boxPlacement.box': { $ne: null } + } + }); + } + + const combinedData: CombinedData[] = await PokedexEntryModel.aggregate(pipeline).exec(); + + // Filter out entries with no catch records + const filteredData = combinedData.filter((data) => data.catchRecord); + + return filteredData.map((data) => ({ + pokedexEntry: data as PokedexEntry, + catchRecord: data.catchRecord as CatchRecord + })); + } + async findCombinedData( page: number = 1, limit: number = 20, diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index f4e3df2..88fc326 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -151,6 +151,9 @@
  • My Dex
  • +
  • + My Boxes +
  • Profile
  • diff --git a/src/routes/api/combined-data/all/+server.ts b/src/routes/api/combined-data/all/+server.ts new file mode 100644 index 0000000..a34cab1 --- /dev/null +++ b/src/routes/api/combined-data/all/+server.ts @@ -0,0 +1,23 @@ +import { json } from '@sveltejs/kit'; +import { dbConnect, dbDisconnect } from '$lib/utils/db'; +import CombinedDataRepository from '$lib/repositories/CombinedDataRepository'; + +export const GET = async ({ url }) => { + const enableForms = url.searchParams.get('enableForms') === 'true'; + + try { + await dbConnect(); + const repo = new CombinedDataRepository(); + const combinedData = await repo.findAllCombinedData(enableForms); + + if (combinedData.length === 0) { + return json({ error: 'No combined data found' }, { status: 404 }); + } + return json(combinedData); + } catch (error) { + console.error(error); + return json({ error: 'Internal Server Error' }, { status: 500 }); + } finally { + dbDisconnect(); + } +}; diff --git a/src/routes/mydex/boxes/+page.svelte b/src/routes/mydex/boxes/+page.svelte new file mode 100644 index 0000000..9d628a4 --- /dev/null +++ b/src/routes/mydex/boxes/+page.svelte @@ -0,0 +1,107 @@ + + + + Living Dex Tracker - My Boxes + + +
    + {#if !localUser} +

    Please sign in

    + {:else if combinedData && combinedData.length > 0} + + +
    + {#each boxNumbers as boxNumber} +
    +

    Box {boxNumber}

    +
    + {#each combinedData as { pokedexEntry, catchRecord }} + {#if pokedexEntry[currentPlacement].box === boxNumber} +
    +
    + {pokedexEntry.pokemon} + {pokedexEntry.form ? `(${pokedexEntry.form})` : ''} +
    +
    {pokedexEntry.pokedexNumber.toString().padStart(3, '0')}
    +
    + Caught: {catchRecord.caught ? 'Yes' : 'No'}
    + Needs to Evolve: {catchRecord.haveToEvolve ? 'Yes' : 'No'}
    + In Home: {catchRecord.inHome ? 'Yes' : 'No'} +
    +
    + {/if} + {/each} +
    +
    + {/each} +
    + {:else if failedToLoad} +

    Failed to load

    +

    + If you're seeing this, you probably haven't created your Pokédex data yet. Please do so by + visiting the My Dex page. +

    + {:else} +
    +

    Loading Pokédex

    + +
    + {/if} +
    diff --git a/tailwind.config.js b/tailwind.config.js index 638bb10..d7f920e 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,6 +1,10 @@ /** @type {import('tailwindcss').Config} */ export default { - content: ['./src/routes/**/*.{svelte,js,ts}', './src/lib/components/**/*.{svelte,js,ts}'], + content: [ + './src/routes/**/*.{svelte,js,ts}', + './src/routes/**/**/*.{svelte,js,ts}', + './src/lib/components/**/*.{svelte,js,ts}' + ], theme: { extend: {} },