From 1413ab8f835efb0e90d0742b185d98b1840cecd3 Mon Sep 17 00:00:00 2001 From: Aelita4 Date: Fri, 9 Aug 2024 20:09:41 +0200 Subject: [PATCH] Refactor building handler to use database over JSON --- src/lib/data/buildings.json | 196 -------------------------- src/lib/db/buildings.ts | 18 +++ src/lib/db/mongodb.ts | 5 + src/pages/api/build/createBuilding.ts | 16 +-- src/pages/game/buildings.astro | 38 +++-- src/types/DBBuilding.ts | 11 ++ 6 files changed, 59 insertions(+), 225 deletions(-) delete mode 100644 src/lib/data/buildings.json create mode 100644 src/lib/db/buildings.ts create mode 100644 src/types/DBBuilding.ts diff --git a/src/lib/data/buildings.json b/src/lib/data/buildings.json deleted file mode 100644 index 2eed6da..0000000 --- a/src/lib/data/buildings.json +++ /dev/null @@ -1,196 +0,0 @@ -[ - { - "category": "mines", - "buildings": [ - { - "id": "iron-mine", - "requirements": { - "buildings": [], - "research": [], - "resources": [ - { - "name": "iron", - "amount": 1 - }, - { - "name": "gold", - "amount": 1 - }, - { - "name": "coal", - "amount": 1 - } - ] - }, - "energy": 11, - "multiplier": 2 - }, - { - "id": "gold-mine", - "requirements": { - "buildings": [], - "research": [], - "resources": [ - { - "name": "iron", - "amount": 1 - }, - { - "name": "gold", - "amount": 1 - }, - { - "name": "coal", - "amount": 1 - } - ] - }, - "energy": 11, - "multiplier": 2.5 - }, - { - "id": "coal-mine", - "requirements": { - "buildings": [], - "research": [], - "resources": [ - { - "name": "iron", - "amount": 1 - }, - { - "name": "gold", - "amount": 1 - }, - { - "name": "coal", - "amount": 1 - } - ] - }, - "energy": 11, - "multiplier": 3 - } - ] - }, { - "category": "utilities", - "buildings": [ - { - "id": "research-lab", - "requirements": { - "buildings": [], - "research": [], - "resources": [ - { - "name": "iron", - "amount": 1 - }, - { - "name": "gold", - "amount": 1 - }, - { - "name": "coal", - "amount": 1 - } - ] - }, - "energy": 100, - "multiplier": 3 - }, - { - "id": "research-facility", - "requirements": { - "buildings": [ - { - "id": "research-lab", - "level": 3 - } - ], - "research": [ - { - "id": "advanced-technologies", - "level": 2 - } - ], - "resources": [ - { - "name": "iron", - "amount": 1 - }, - { - "name": "gold", - "amount": 1 - }, - { - "name": "coal", - "amount": 1 - } - ] - }, - "energy": 100, - "multiplier": 2 - } - ] - }, { - "category": "power-plants", - "buildings": [ - { - "id": "coal-power-plant", - "requirements": { - "buildings": [], - "research": [], - "resources": [ - { - "name": "iron", - "amount": 1 - }, - { - "name": "gold", - "amount": 1 - }, - { - "name": "coal", - "amount": 1 - } - ] - }, - "energy": 100, - "multiplier": 3 - }, - { - "id": "nuclear-power-plant", - "requirements": { - "buildings": [ - { - "id": "coal-power-plant", - "level": 3 - } - ], - "research": [ - { - "id": "nuclear-power", - "level": 2 - } - ], - "resources": [ - { - "name": "iron", - "amount": 1 - }, - { - "name": "gold", - "amount": 1 - }, - { - "name": "coal", - "amount": 1 - } - ] - }, - "energy": 100, - "multiplier": 2 - } - ] - } -] \ No newline at end of file diff --git a/src/lib/db/buildings.ts b/src/lib/db/buildings.ts new file mode 100644 index 0000000..94a4546 --- /dev/null +++ b/src/lib/db/buildings.ts @@ -0,0 +1,18 @@ +import DBBuilding from '../../types/DBBuilding'; +import { Buildings } from '../db/mongodb'; + +export const getAllBuildings = async () => { + return (await Buildings()).find({}).toArray() as unknown as Array; +} + +export const getBuildingById = async (id: string) => { + return (await Buildings()).findOne({ + id + }) as unknown as DBBuilding; +} + +export const getBuildingsByCategory = async (category: string) => { + return (await Buildings()).find({ + category + }).toArray() as unknown as Array; +} \ No newline at end of file diff --git a/src/lib/db/mongodb.ts b/src/lib/db/mongodb.ts index 776c8a6..2627c59 100644 --- a/src/lib/db/mongodb.ts +++ b/src/lib/db/mongodb.ts @@ -35,6 +35,11 @@ export const Planets = async () => { return db.collection('planets'); } +export const Buildings = async() => { + const db = await getDB(); + return db.collection('buildings'); +} + export const Lang = async (language = "en") => { const db = await getDB(`${config.MONGODB_DB}_${language}`); return [ diff --git a/src/pages/api/build/createBuilding.ts b/src/pages/api/build/createBuilding.ts index 695b563..3e99696 100644 --- a/src/pages/api/build/createBuilding.ts +++ b/src/pages/api/build/createBuilding.ts @@ -1,12 +1,13 @@ import { build, type APIRoute } from "astro"; import validateAccessToken from "../../../lib/utils/validateAccessToken"; import { calculateCurrentAvailableResources, updatePlanetResources } from "../../../lib/utils/resourceManager"; -import buildings from '../../../lib/data/buildings.json'; import { getUserByAccessToken, getUserResearch } from "../../../lib/db/users"; import Planet from "../../../types/Planet"; import { createOrUpgradeBuilding, getPlanetById } from "../../../lib/db/planets"; import { ObjectId } from "mongodb"; import DBResource from "../../../types/DBResource"; +import { getAllBuildings } from "../../../lib/db/buildings"; +import DBBuilding from "../../../types/DBBuilding"; export const POST: APIRoute = async({ request }) => { const response = await validateAccessToken(request); @@ -36,12 +37,12 @@ export const POST: APIRoute = async({ request }) => { } const buildingId = body.building; - let buildingData: {id: string, name: string, requirements: { buildings: Array<{}>, research: Array<{}>, resources: Array }, multiplier: number} | null = null; - buildings.forEach((category: any) => { - // console.log(category.buildings.filter((element: any) => element.id === buildingId)[0]); - if(buildingData !== null) return; - buildingData = category.buildings.find((element: any) => element.id === buildingId); - }); + let buildingData: DBBuilding | null = null; + + const buildings = await getAllBuildings(); + + buildingData = buildings.find((element) => element.id === buildingId) ?? null; + if(!buildingData) { return new Response( JSON.stringify({ @@ -51,7 +52,6 @@ export const POST: APIRoute = async({ request }) => { }), { status: 400 } ) } - buildingData = buildingData as {id: string, name: string, requirements: { buildings: Array<{}>, research: Array<{}>, resources: Array }, multiplier: number}; // fuck you typescript let userPlanet: Planet | null; try { userPlanet = await getPlanetById(new ObjectId(body.planetId)); diff --git a/src/pages/game/buildings.astro b/src/pages/game/buildings.astro index 8908f2e..a554060 100644 --- a/src/pages/game/buildings.astro +++ b/src/pages/game/buildings.astro @@ -3,10 +3,12 @@ import Layout from '../../layouts/Layout.astro'; import NavBar from '../../components/NavBar.astro'; import BuildingCard from '../../components/BuildingCard.astro'; import { getUserByAccessToken } from '../../lib/db/users'; -import { getHighestWeightedLanguage, getLocales, getObj } from '../../lib/utils/langDriver'; +import { getHighestWeightedLanguage, getLocales, getName, getObj } from '../../lib/utils/langDriver'; import ResourceBar from '../../components/ResourceBar.astro'; +import { getAllBuildings } from '../../lib/db/buildings'; +import DBBuilding from '../../types/DBBuilding'; -const buildingsList = (await import('../../lib/data/buildings.json')).default; +const buildingsList = await getAllBuildings(); const loggedToken = Astro.cookies.get('sessionToken')?.value ?? null; const username = Astro.cookies.get('username')?.value ?? ""; @@ -21,16 +23,11 @@ const lang = await getLocales(locale); const modalSet: { [key: string]: { resources: Array, research: Array, buildings: Array, energy: number } } = {}; -buildingsList.forEach(cat => { - cat.buildings.forEach(building => { - modalSet[building.id] = { - "resources": building.requirements.resources, - "research": building.requirements.research, - "buildings": building.requirements.buildings, - "energy": building.energy - }; - }); -}); +const buildingsByCategory = buildingsList.reduce((acc: { [key: string]: DBBuilding[] }, building) => { + if(!acc[building.category]) acc[building.category] = []; + acc[building.category].push(building); + return acc; +}, {}); --- @@ -48,19 +45,18 @@ buildingsList.forEach(cat => { - {buildingsList.map(cat => ( -
- {console.log(cat.category)} -

{lang["buildings"][`Label_${cat.category}`]}

-
- {cat.buildings.map(building => <> +

{getName(lang, 'buildings', `cat-${category}`)}

+
+ {buildings.map(building => ( + )} -
+ image="/favicon.svg" /> + ))}
- ))} + )}