98 lines
3.6 KiB
TypeScript
98 lines
3.6 KiB
TypeScript
import { type APIRoute } from "astro";
|
|
import validateAccessToken from "../../../lib/utils/validateAccessToken";
|
|
import { getUserResources, updateUserResources } from "../../../lib/utils/resourceManager";
|
|
import research from '../../../lib/data/research.json';
|
|
import { createOrUpgradeResearch, getUserByAccessToken, getUserResearch } from "../../../lib/db/users";
|
|
import type DBResource from "../../../types/DBResource";
|
|
|
|
export const POST: APIRoute = async({ request }) => {
|
|
// validate access token
|
|
const response = await validateAccessToken(request);
|
|
if(response instanceof Response) return response;
|
|
|
|
const user = await getUserByAccessToken(response);
|
|
if(user === null) {
|
|
return new Response(
|
|
JSON.stringify({
|
|
code: 401,
|
|
message: "Unauthorized"
|
|
}), { status: 401 }
|
|
)
|
|
}
|
|
|
|
// check if research id is valid
|
|
const researchId = (await request.json()).research;
|
|
const researchData = research.filter((element: any) => element.id === researchId)[0];
|
|
if(!researchId || !researchData) {
|
|
return new Response(
|
|
JSON.stringify({
|
|
code: 400,
|
|
message: "Bad Request",
|
|
error: "Invalid research id"
|
|
}), { status: 400 }
|
|
)
|
|
}
|
|
|
|
// check requirements
|
|
// buildings
|
|
const buildings = user.buildings;
|
|
researchData.requirements.buildings.forEach((buildingReq) => {
|
|
if(buildings.filter((building) => building.id === buildingReq.id)[0].level < buildingReq.level) {
|
|
return new Response(
|
|
JSON.stringify({
|
|
code: 400,
|
|
message: "Bad Request",
|
|
error: `${buildingReq.id} level ${buildingReq.level} required`
|
|
}), { status: 400 }
|
|
)
|
|
}
|
|
});
|
|
|
|
// research
|
|
const playerResearch = await getUserResearch(user);
|
|
researchData.requirements.research.forEach((researchReq) => {
|
|
if(playerResearch.filter((research) => research.id === researchReq.id)[0].level < researchReq.level) {
|
|
return new Response(
|
|
JSON.stringify({
|
|
code: 400,
|
|
message: "Bad Request",
|
|
error: `${researchReq.id} level ${researchReq.level} required`
|
|
}), { status: 400 }
|
|
)
|
|
}
|
|
});
|
|
|
|
// resources
|
|
const resources = await getUserResources(user._id);
|
|
const playerCurrentResearch = playerResearch.filter((element: any) => element.id === researchId)[0];
|
|
const level = playerCurrentResearch ? playerCurrentResearch.level : 0;
|
|
const newResources = structuredClone(resources);
|
|
let hasEnoughResources = true;
|
|
Object.entries(researchData.requirements.resources).forEach(([key, value]) => {
|
|
const res = resources.filter((element: DBResource) => element.name === key)[0];
|
|
const cost = playerCurrentResearch ? value * Math.pow(researchData.multiplier, level) : value;
|
|
|
|
if(res.amount < cost) hasEnoughResources = false;
|
|
else newResources.filter((element: DBResource) => element.name === key)[0].amount -= cost;
|
|
});
|
|
|
|
if(!hasEnoughResources) {
|
|
return new Response(
|
|
JSON.stringify({
|
|
code: 400,
|
|
message: "Bad Request",
|
|
error: "Not enough resources"
|
|
}), { status: 400 }
|
|
)
|
|
}
|
|
|
|
await updateUserResources(user._id, newResources);
|
|
await createOrUpgradeResearch(user.username, { id: researchId, level: level + 1 });
|
|
|
|
return new Response(
|
|
JSON.stringify({
|
|
code: 200,
|
|
message: "OK"
|
|
}), { status: 200 }
|
|
)
|
|
} |