diff --git a/src/app/api/portfolio/summary/[portfolioId]/route.ts b/src/app/api/portfolio/summary/[portfolioId]/route.ts new file mode 100644 index 0000000..760e781 --- /dev/null +++ b/src/app/api/portfolio/summary/[portfolioId]/route.ts @@ -0,0 +1,144 @@ +import { portfolio } from "@/app/db/schema/portfolio"; +import { NextRequest, NextResponse } from "next/server"; +import { db } from "@/app/db/db"; +import { z } from "zod"; +import { formatNumber } from "@/app/utils"; +import { DataItem, ChartData } from "@/app/portfolio/[slug]/utils"; +import { eq } from "drizzle-orm"; + +export async function GET( + request: NextRequest, + { params }: { params: { portfolioId: string } } +) { + const portfolioId = params.portfolioId; + + const data = await db + .select({ + name: portfolio.name, + cost: portfolio.cost, + epcBreakdownPostRetrofit: portfolio.epcBreakdownPostRetrofit, + nUnitsToRetrofit: portfolio.nUnitsToRetrofit, + co2PerUnitPostRetrofit: portfolio.co2PerUnitPostRetrofit, + energyBillPerUnitPostRetrofit: portfolio.energyBillPerUnitPostRetrofit, + energyConsumptionPerUnitPostRetrofit: + portfolio.energyConsumptionPerUnitPostRetrofit, + valuationImprovementPerUnit: portfolio.valuationImprovementPerUnit, + costPerUnit: portfolio.costPerUnit, + costPerCo2Saved: portfolio.costPerCo2Saved, + costPerSapPoint: portfolio.costPerSapPoint, + valuationReturnOnInvestment: portfolio.valuationReturnOnInvestment, + }) + .from(portfolio) + .where(eq(portfolio.id, BigInt(portfolioId))); + + if (data.length === 0) { + throw new Error("Portfolio not found"); + } + + if (data.length > 1) { + throw new Error("More than one portfolio found"); + } + + const portfolioName = data[0].name; + + // Format the data we need for the overview + const output: DataItem[] = [ + { + title: "EPCs", + scenarios: [ + { + scenarioName: portfolioName, + data: JSON.parse( + data[0].epcBreakdownPostRetrofit || "[]" + ) as ChartData[], + }, + ], + }, + { + title: "# Units", + scenarios: [{ scenarioName: portfolioName, data: "" }], + }, + { + title: "# Units to retrofit", + scenarios: [ + { + scenarioName: portfolioName, + data: String(data[0].nUnitsToRetrofit) || "", + }, + ], + }, + { + title: "Co2/unit", + scenarios: [ + { + scenarioName: portfolioName, + data: data[0].co2PerUnitPostRetrofit || "", + }, + ], + }, + { + title: "Energy bills/unit", + scenarios: [ + { + scenarioName: portfolioName, + data: data[0].energyBillPerUnitPostRetrofit || "", + }, + ], + }, + { + title: "Energy consumption (kWh)/unit", + scenarios: [ + { + scenarioName: portfolioName, + data: data[0].energyConsumptionPerUnitPostRetrofit || "", + }, + ], + }, + { + title: "Cost (£)", + scenarios: [ + { scenarioName: portfolioName, data: formatNumber(data[0].cost || 0) }, + ], + }, + { + title: "Cost (£) /unit", + scenarios: [ + { scenarioName: portfolioName, data: data[0].costPerUnit || "" }, + ], + }, + { + title: "£ per CO2 reduction", + scenarios: [ + { scenarioName: portfolioName, data: data[0].costPerCo2Saved || "" }, + ], + }, + { + title: "£ per SAP point", + scenarios: [ + { scenarioName: portfolioName, data: data[0].costPerSapPoint || "" }, + ], + }, + { + title: "Valuation improvement per unit", + scenarios: [ + { + scenarioName: portfolioName, + data: data[0].valuationImprovementPerUnit || "", + }, + ], + }, + { + title: "Valuation return on investment", + scenarios: [ + { + scenarioName: portfolioName, + data: data[0].valuationReturnOnInvestment || "", + }, + ], + }, + ]; + + return new NextResponse(JSON.stringify(output), { + status: 200, + }); +}