fixing login issue and converting types of ids

This commit is contained in:
Khalim Conn-Kowlessar 2023-08-02 11:01:24 +01:00
parent 3e2905a6dd
commit 4a34ecd0bc
11 changed files with 860 additions and 25 deletions

View file

@ -3,8 +3,8 @@ import { NextRequest, NextResponse } from "next/server";
import { z } from "zod";
const PresignedUrlBodySchema = z.object({
userId: z.number(),
portfolioId: z.number(),
userId: z.string(),
portfolioId: z.string(),
fileKey: z.string(),
});

View file

@ -37,11 +37,9 @@ const ListItem = React.forwardRef<
ListItem.displayName = "ListItem";
export default function AddNewDropDown({
portfolioId,
isUploadCsvOpen,
setIsUploadCsvOpen,
}: {
portfolioId: number;
isUploadCsvOpen: boolean;
setIsUploadCsvOpen: React.Dispatch<React.SetStateAction<boolean>>;
}) {

View file

@ -12,7 +12,7 @@ import UploadCsvModal from "@/app/portfolio/[slug]/components/UploadCsvModal";
import { useState } from "react";
interface ToolbarProps {
portfolioId: number;
portfolioId: string;
}
const navigationMenuTriggerStyle = cva(
@ -50,7 +50,6 @@ export function Toolbar({ portfolioId }: ToolbarProps) {
</NavigationMenuItem>
<AddNewDropDown
portfolioId={portfolioId}
isUploadCsvOpen={modalIsOpen}
setIsUploadCsvOpen={setModalIsOpen}
/>

View file

@ -0,0 +1,3 @@
ALTER TABLE "property" ALTER COLUMN "portfolio_id" SET DATA TYPE bigint;--> statement-breakpoint
ALTER TABLE "property_details_epc" ALTER COLUMN "property_id" SET DATA TYPE bigint;--> statement-breakpoint
ALTER TABLE "property_details_epc" ALTER COLUMN "portfolio_id" SET DATA TYPE bigint;

View file

@ -0,0 +1,830 @@
{
"version": "5",
"dialect": "pg",
"id": "f0a25da5-b02d-4255-9107-ac8c252e7eb9",
"prevId": "65f0ce76-b171-4bca-b56d-15ddbbda437c",
"tables": {
"portfolio": {
"name": "portfolio",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "bigserial",
"primaryKey": true,
"notNull": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"budget": {
"name": "budget",
"type": "real",
"primaryKey": false,
"notNull": false
},
"status": {
"name": "status",
"type": "status",
"primaryKey": false,
"notNull": true
},
"goal": {
"name": "goal",
"type": "goal",
"primaryKey": false,
"notNull": true
},
"cost": {
"name": "cost",
"type": "real",
"primaryKey": false,
"notNull": false
},
"number_of_properties": {
"name": "number_of_properties",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"co2_equivalent_savings": {
"name": "co2_equivalent_savings",
"type": "real",
"primaryKey": false,
"notNull": false
},
"energy_savings": {
"name": "energy_savings",
"type": "real",
"primaryKey": false,
"notNull": false
},
"energy_cost_savings": {
"name": "energy_cost_savings",
"type": "real",
"primaryKey": false,
"notNull": false
},
"property_valuation_increase": {
"name": "property_valuation_increase",
"type": "real",
"primaryKey": false,
"notNull": false
},
"rental_yield_increase": {
"name": "rental_yield_increase",
"type": "real",
"primaryKey": false,
"notNull": false
},
"total_work_hours": {
"name": "total_work_hours",
"type": "real",
"primaryKey": false,
"notNull": false
},
"created_at": {
"name": "created_at",
"type": "timestamp (6) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp (6) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {}
},
"portfolioUsers": {
"name": "portfolioUsers",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "bigserial",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "bigint",
"primaryKey": false,
"notNull": true
},
"portfolio_id": {
"name": "portfolio_id",
"type": "bigint",
"primaryKey": false,
"notNull": true
},
"role": {
"name": "role",
"type": "role",
"primaryKey": false,
"notNull": true
},
"created_at": {
"name": "created_at",
"type": "timestamp (6) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp (6) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"portfolioUsers_user_id_user_id_fk": {
"name": "portfolioUsers_user_id_user_id_fk",
"tableFrom": "portfolioUsers",
"tableTo": "user",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"portfolioUsers_portfolio_id_portfolio_id_fk": {
"name": "portfolioUsers_portfolio_id_portfolio_id_fk",
"tableFrom": "portfolioUsers",
"tableTo": "portfolio",
"columnsFrom": [
"portfolio_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {}
},
"property": {
"name": "property",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "bigserial",
"primaryKey": true,
"notNull": true
},
"portfolio_id": {
"name": "portfolio_id",
"type": "bigint",
"primaryKey": false,
"notNull": true
},
"creation_status": {
"name": "creation_status",
"type": "creation_status",
"primaryKey": false,
"notNull": true
},
"uprn": {
"name": "uprn",
"type": "bigint",
"primaryKey": false,
"notNull": false
},
"building_reference_number": {
"name": "building_reference_number",
"type": "bigint",
"primaryKey": false,
"notNull": false
},
"status": {
"name": "status",
"type": "status",
"primaryKey": false,
"notNull": false
},
"address": {
"name": "address",
"type": "text",
"primaryKey": false,
"notNull": false
},
"postcode": {
"name": "postcode",
"type": "text",
"primaryKey": false,
"notNull": false
},
"has_pre_condition_report": {
"name": "has_pre_condition_report",
"type": "boolean",
"primaryKey": false,
"notNull": false
},
"has_recommendations": {
"name": "has_recommendations",
"type": "boolean",
"primaryKey": false,
"notNull": false
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"property_type": {
"name": "property_type",
"type": "text",
"primaryKey": false,
"notNull": false
},
"built_form": {
"name": "built_form",
"type": "text",
"primaryKey": false,
"notNull": false
},
"local_authority": {
"name": "local_authority",
"type": "text",
"primaryKey": false,
"notNull": false
},
"constituency": {
"name": "constituency",
"type": "text",
"primaryKey": false,
"notNull": false
},
"number_of_rooms": {
"name": "number_of_rooms",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"year_built": {
"name": "year_built",
"type": "text",
"primaryKey": false,
"notNull": false
},
"tenure": {
"name": "tenure",
"type": "text",
"primaryKey": false,
"notNull": false
},
"current_epc_rating": {
"name": "current_epc_rating",
"type": "epc",
"primaryKey": false,
"notNull": false
},
"current_sap_points": {
"name": "current_sap_points",
"type": "real",
"primaryKey": false,
"notNull": false
}
},
"indexes": {},
"foreignKeys": {
"property_portfolio_id_portfolio_id_fk": {
"name": "property_portfolio_id_portfolio_id_fk",
"tableFrom": "property",
"tableTo": "portfolio",
"columnsFrom": [
"portfolio_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {}
},
"property_details_epc": {
"name": "property_details_epc",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "bigserial",
"primaryKey": true,
"notNull": true
},
"property_id": {
"name": "property_id",
"type": "bigint",
"primaryKey": false,
"notNull": true
},
"portfolio_id": {
"name": "portfolio_id",
"type": "bigint",
"primaryKey": false,
"notNull": true
},
"full_address": {
"name": "full_address",
"type": "text",
"primaryKey": false,
"notNull": false
},
"total_floor_area": {
"name": "total_floor_area",
"type": "real",
"primaryKey": false,
"notNull": false
},
"walls": {
"name": "walls",
"type": "text",
"primaryKey": false,
"notNull": false
},
"walls_rating": {
"name": "walls_rating",
"type": "smallint",
"primaryKey": false,
"notNull": false
},
"roof": {
"name": "roof",
"type": "text",
"primaryKey": false,
"notNull": false
},
"roof_rating": {
"name": "roof_rating",
"type": "smallint",
"primaryKey": false,
"notNull": false
},
"floor": {
"name": "floor",
"type": "text",
"primaryKey": false,
"notNull": false
},
"floor_rating": {
"name": "floor_rating",
"type": "smallint",
"primaryKey": false,
"notNull": false
},
"windows": {
"name": "windows",
"type": "text",
"primaryKey": false,
"notNull": false
},
"windows_rating": {
"name": "windows_rating",
"type": "smallint",
"primaryKey": false,
"notNull": false
},
"heating": {
"name": "heating",
"type": "text",
"primaryKey": false,
"notNull": false
},
"heating_rating": {
"name": "heating_rating",
"type": "smallint",
"primaryKey": false,
"notNull": false
},
"heating_controls": {
"name": "heating_controls",
"type": "text",
"primaryKey": false,
"notNull": false
},
"heating_controls_rating": {
"name": "heating_controls_rating",
"type": "smallint",
"primaryKey": false,
"notNull": false
},
"hot_water": {
"name": "hot_water",
"type": "text",
"primaryKey": false,
"notNull": false
},
"hot_water_rating": {
"name": "hot_water_rating",
"type": "smallint",
"primaryKey": false,
"notNull": false
},
"lighting": {
"name": "lighting",
"type": "text",
"primaryKey": false,
"notNull": false
},
"lighting_rating": {
"name": "lighting_rating",
"type": "smallint",
"primaryKey": false,
"notNull": false
},
"mainfuel": {
"name": "mainfuel",
"type": "text",
"primaryKey": false,
"notNull": false
},
"ventilation": {
"name": "ventilation",
"type": "text",
"primaryKey": false,
"notNull": false
},
"solar_pv": {
"name": "solar_pv",
"type": "real",
"primaryKey": false,
"notNull": false
},
"solar_hot_water": {
"name": "solar_hot_water",
"type": "boolean",
"primaryKey": false,
"notNull": false
},
"wind_turbine": {
"name": "wind_turbine",
"type": "smallint",
"primaryKey": false,
"notNull": false
},
"floor_height": {
"name": "floor_height",
"type": "real",
"primaryKey": false,
"notNull": false
},
"number_heated_rooms": {
"name": "number_heated_rooms",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"heat_loss_corridor": {
"name": "heat_loss_corridor",
"type": "boolean",
"primaryKey": false,
"notNull": false
},
"unheated_corridor_length": {
"name": "unheated_corridor_length",
"type": "real",
"primaryKey": false,
"notNull": false
},
"number_of_open_fireplaces": {
"name": "number_of_open_fireplaces",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"number_of_extensions": {
"name": "number_of_extensions",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"number_of_storeys": {
"name": "number_of_storeys",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"mains_gas": {
"name": "mains_gas",
"type": "boolean",
"primaryKey": false,
"notNull": false
},
"energy_tariff": {
"name": "energy_tariff",
"type": "text",
"primaryKey": false,
"notNull": false
},
"primary_energy_consumption": {
"name": "primary_energy_consumption",
"type": "real",
"primaryKey": false,
"notNull": false
},
"co2_emissions": {
"name": "co2_emissions",
"type": "real",
"primaryKey": false,
"notNull": false
}
},
"indexes": {},
"foreignKeys": {
"property_details_epc_property_id_property_id_fk": {
"name": "property_details_epc_property_id_property_id_fk",
"tableFrom": "property_details_epc",
"tableTo": "property",
"columnsFrom": [
"property_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"property_details_epc_portfolio_id_portfolio_id_fk": {
"name": "property_details_epc_portfolio_id_portfolio_id_fk",
"tableFrom": "property_details_epc",
"tableTo": "portfolio",
"columnsFrom": [
"portfolio_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {}
},
"property_details_meter": {
"name": "property_details_meter",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "bigserial",
"primaryKey": true,
"notNull": true
},
"uprn": {
"name": "uprn",
"type": "bigint",
"primaryKey": false,
"notNull": false
},
"energy_supplier": {
"name": "energy_supplier",
"type": "text",
"primaryKey": false,
"notNull": false
},
"gas_supplier": {
"name": "gas_supplier",
"type": "text",
"primaryKey": false,
"notNull": false
},
"meter_reading_total": {
"name": "meter_reading_total",
"type": "real",
"primaryKey": false,
"notNull": false
},
"meter_reading_electricity": {
"name": "meter_reading_electricity",
"type": "real",
"primaryKey": false,
"notNull": false
},
"meter_reading_gas": {
"name": "meter_reading_gas",
"type": "real",
"primaryKey": false,
"notNull": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {}
},
"property_targets": {
"name": "property_targets",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "bigserial",
"primaryKey": true,
"notNull": true
},
"property_id": {
"name": "property_id",
"type": "bigint",
"primaryKey": false,
"notNull": true
},
"portfolio_id": {
"name": "portfolio_id",
"type": "bigint",
"primaryKey": false,
"notNull": true
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"epc": {
"name": "epc",
"type": "epc",
"primaryKey": false,
"notNull": false
},
"heat_demand": {
"name": "heat_demand",
"type": "text",
"primaryKey": false,
"notNull": false
}
},
"indexes": {},
"foreignKeys": {
"property_targets_property_id_property_id_fk": {
"name": "property_targets_property_id_property_id_fk",
"tableFrom": "property_targets",
"tableTo": "property",
"columnsFrom": [
"property_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"property_targets_portfolio_id_portfolio_id_fk": {
"name": "property_targets_portfolio_id_portfolio_id_fk",
"tableFrom": "property_targets",
"tableTo": "portfolio",
"columnsFrom": [
"portfolio_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {}
},
"user": {
"name": "user",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "bigserial",
"primaryKey": true,
"notNull": true
},
"firstName": {
"name": "firstName",
"type": "text",
"primaryKey": false,
"notNull": false
},
"email": {
"name": "email",
"type": "text",
"primaryKey": false,
"notNull": true
},
"oauth_id": {
"name": "oauth_id",
"type": "text",
"primaryKey": false,
"notNull": false
},
"oauth_provider": {
"name": "oauth_provider",
"type": "text",
"primaryKey": false,
"notNull": false
},
"created_at": {
"name": "created_at",
"type": "timestamp (6) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp (6) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {}
}
},
"enums": {
"goal": {
"name": "goal",
"values": {
"Valuation Improvement": "Valuation Improvement",
"Increasing EPC": "Increasing EPC",
"Reducing CO2 emissions": "Reducing CO2 emissions",
"Energy Savings": "Energy Savings",
"None": "None"
}
},
"role": {
"name": "role",
"values": {
"creator": "creator",
"admin": "admin",
"read": "read",
"write": "write"
}
},
"status": {
"name": "status",
"values": {
"scoping": "scoping",
"assessment": "assessment",
"tendering": "tendering",
"project underway": "project underway",
"completion; status: on track": "completion; status: on track",
"completion; status: delayed": "completion; status: delayed",
"completion; status: at risk": "completion; status: at risk",
"completion; status: completed": "completion; status: completed",
"needs review": "needs review"
}
},
"epc": {
"name": "epc",
"values": {
"A": "A",
"B": "B",
"C": "C",
"D": "D",
"E": "E",
"F": "F",
"G": "G"
}
},
"creation_status": {
"name": "creation_status",
"values": {
"LOADING": "LOADING",
"READY": "READY",
"ERROR": "ERROR"
}
}
},
"schemas": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
}
}

View file

@ -162,6 +162,13 @@
"when": 1690906901377,
"tag": "0022_smiling_callisto",
"breakpoints": true
},
{
"idx": 23,
"version": "5",
"when": 1690970372309,
"tag": "0023_mute_avengers",
"breakpoints": true
}
]
}

View file

@ -79,7 +79,7 @@ export const propertyStatusEnum = pgEnum("status", PortfolioStatus);
export const property = pgTable("property", {
id: bigserial("id", { mode: "bigint" }).primaryKey(),
portfolioId: integer("portfolio_id")
portfolioId: bigint("portfolio_id", { mode: "bigint" })
.notNull()
.references(() => portfolio.id),
creationStatus: propertyCreationStatusEnum("creation_status").notNull(),
@ -117,10 +117,10 @@ export const FeatureRatingNumeric: [number, ...number[]] = [5, 4, 3, 2, 1];
export const propertyDetailsEpc = pgTable("property_details_epc", {
id: bigserial("id", { mode: "bigint" }).primaryKey(),
propertyId: integer("property_id")
propertyId: bigint("property_id", { mode: "bigint" })
.notNull()
.references(() => property.id),
portfolioId: integer("portfolio_id")
portfolioId: bigint("portfolio_id", { mode: "bigint" })
.notNull()
.references(() => portfolio.id),
fullAddress: text("full_address"),
@ -197,7 +197,7 @@ export type Property = InferModel<typeof property, "select">;
export interface PropertyWithTarget {
status: string | null;
id: bigint;
portfolioId: number;
portfolioId: bigint;
creationStatus: string;
address: string | null;
postcode: string | null;

View file

@ -5,14 +5,14 @@ import { useMutation } from "@tanstack/react-query";
import { useSession } from "next-auth/react";
import { useMemo } from "react";
function generateS3Key(userId: number, portfolioId: number, filename: string) {
function generateS3Key(userId: string, portfolioId: string, filename: string) {
const timestamp = new Date().toISOString().replace(/[:.-]/g, "");
const key = `${userId}/${portfolioId}/${filename}-${timestamp}.csv`;
return key;
}
interface UseCreatePlanProps {
portfolioId: number;
portfolioId: string;
housingType: string;
goal: string;
goalValue: string;
@ -35,7 +35,8 @@ const useCreatePlan = ({
const router = useRouter();
const session = useSession();
const userId = session.data?.user.dbId;
// Since userId is a big int it gets coerced into a string
const userId = String(session.data?.user.dbId);
// Every time the component is re-rendered, a new file key will be generated. To prevent this,
// we use useMemo to only generate a new file key when the userId or portfolioId changes.
@ -106,12 +107,10 @@ async function generatePresignedUrl({
portfolioId,
fileKey,
}: {
userId: number;
portfolioId: number;
userId: string;
portfolioId: string;
fileKey: string;
}) {
console.log("fileKey: ", fileKey);
const body = JSON.stringify({
userId: userId,
portfolioId: portfolioId,
@ -168,7 +167,7 @@ export const SubmitPlan = ({
housingType: string;
goalValue: string;
file: File;
portfolioId: number;
portfolioId: string;
}) => {
const { handlePlanBuild, isGeneratingUrlLoading, isUploadLoading } =
useCreatePlan({ portfolioId, housingType, goal, goalValue, file });

View file

@ -125,7 +125,7 @@ export default function UploadCsvModal({
}: {
isOpen?: boolean;
setIsOpen: (isOpen: boolean) => void;
portfolioId: number;
portfolioId: string;
}) {
const [budget, setBudget] = useState<undefined | number>(undefined);

View file

@ -182,7 +182,7 @@ export default async function Page({
params,
searchParams,
}: {
params: { slug: number };
params: { slug: string };
searchParams: { [key: string]: string | string[] | undefined | number };
}) {
// This page is served from the server so we can make calls to the database
@ -190,8 +190,7 @@ export default async function Page({
// This is temp until we retrieve this data from the frontend
// TODO: Update the objects to contains objective + any other required information
// We explcitly cast the slug to a number since it will be a string
const portfolioId = Number(params.slug);
const portfolioId = params.slug;
const {
name: portfolioName,
budget,

View file

@ -5,7 +5,7 @@ import { property } from "@/app/db/schema/property";
import type { Portfolio } from "@/app/db/schema/portfolio";
import type { PropertyWithTarget } from "@/app/db/schema/property";
export async function getPortfolio(portfolioId: number): Promise<Portfolio> {
export async function getPortfolio(portfolioId: string): Promise<Portfolio> {
const data = await db
.select()
.from(portfolio)
@ -23,7 +23,7 @@ export async function getPortfolio(portfolioId: number): Promise<Portfolio> {
}
export async function getProperties(
portfolioId: number,
portfolioId: string,
limit: number = 1000,
offset: number = 0
): Promise<PropertyWithTarget[]> {
@ -38,7 +38,7 @@ export async function getProperties(
status: true,
creationStatus: true,
},
where: eq(property.portfolioId, portfolioId),
where: eq(property.portfolioId, BigInt(portfolioId)),
with: {
target: {
columns: {