From 16aa6672fc248089bcb6a68bc3c65310ca1ad25b Mon Sep 17 00:00:00 2001 From: Kyle Corbitt Date: Wed, 9 Aug 2023 15:49:19 -0700 Subject: [PATCH] Rename Organization to Project We'll probably need a concept of organizations at some point in the future, but in practice the way we're using these in the codebase right now is as a project, so this renames it to that to avoid confusion. --- .../migration.sql | 37 +++++++++++ app/prisma/schema.prisma | 63 +++++++++---------- app/prisma/seed.ts | 12 ++-- app/prisma/seedAgiEval.ts | 14 ++--- app/prisma/seedDashboard.ts | 12 ++-- app/prisma/seedTwitterSentiment.ts | 14 ++--- app/src/components/datasets/DatasetCard.tsx | 6 +- .../components/experiments/ExperimentCard.tsx | 6 +- .../useOnForkButtonPressed.tsx | 6 +- .../nav/ProjectBreadcrumbContents.tsx | 12 ++-- app/src/components/nav/ProjectMenu.tsx | 55 ++++++++-------- .../projectSettings/DeleteProjectDialog.tsx | 20 +++--- app/src/pages/data/[id].tsx | 2 +- app/src/pages/experiments/[id].tsx | 2 +- app/src/pages/logged-calls/index.tsx | 10 +-- app/src/pages/project/settings/index.tsx | 38 +++++------ app/src/server/api/root.router.ts | 4 +- .../server/api/routers/dashboard.router.ts | 8 +-- app/src/server/api/routers/datasets.router.ts | 20 +++--- .../server/api/routers/experiments.router.ts | 26 ++++---- .../server/api/routers/externalApi.router.ts | 8 +-- ...nizations.router.ts => projects.router.ts} | 62 +++++++++--------- app/src/server/db.ts | 8 +-- app/src/server/scripts/backfillApiKeys.ts | 10 +-- app/src/server/scripts/test-queries.ts | 6 +- app/src/server/utils/hashObject.ts | 4 +- .../utils/{userOrg.ts => userProject.ts} | 10 +-- app/src/state/store.ts | 10 +-- app/src/utils/accessControl.ts | 34 +++++----- app/src/utils/hooks.ts | 21 ++++--- 30 files changed, 292 insertions(+), 248 deletions(-) create mode 100644 app/prisma/migrations/20230809222649_rename_organization_to_project/migration.sql rename app/src/server/api/routers/{organizations.router.ts => projects.router.ts} (64%) rename app/src/server/utils/{userOrg.ts => userProject.ts} (67%) diff --git a/app/prisma/migrations/20230809222649_rename_organization_to_project/migration.sql b/app/prisma/migrations/20230809222649_rename_organization_to_project/migration.sql new file mode 100644 index 0000000..d311f96 --- /dev/null +++ b/app/prisma/migrations/20230809222649_rename_organization_to_project/migration.sql @@ -0,0 +1,37 @@ +-- Rename Enum +ALTER TYPE "OrganizationUserRole" RENAME TO "ProjectUserRole"; + +-- Drop and recreate foreign keys +ALTER TABLE "ApiKey" DROP CONSTRAINT "ApiKey_organizationId_fkey"; +ALTER TABLE "Dataset" DROP CONSTRAINT "Dataset_organizationId_fkey"; +ALTER TABLE "Experiment" DROP CONSTRAINT "Experiment_organizationId_fkey"; +ALTER TABLE "LoggedCall" DROP CONSTRAINT "LoggedCall_organizationId_fkey"; +ALTER TABLE "OrganizationUser" DROP CONSTRAINT "OrganizationUser_organizationId_fkey"; +ALTER TABLE "OrganizationUser" DROP CONSTRAINT "OrganizationUser_userId_fkey"; + +-- Rename columns +ALTER TABLE "ApiKey" RENAME COLUMN "organizationId" TO "projectId"; +ALTER TABLE "Dataset" RENAME COLUMN "organizationId" TO "projectId"; +ALTER TABLE "Experiment" RENAME COLUMN "organizationId" TO "projectId"; +ALTER TABLE "LoggedCall" RENAME COLUMN "organizationId" TO "projectId"; +ALTER TABLE "OrganizationUser" RENAME COLUMN "organizationId" TO "projectId"; +ALTER TABLE "Organization" RENAME COLUMN "personalOrgUserId" TO "personalProjectUserId"; + +-- Rename table +ALTER TABLE "Organization" RENAME TO "Project"; +ALTER TABLE "OrganizationUser" RENAME TO "ProjectUser"; + +-- Recreate foreign keys +ALTER TABLE "Experiment" ADD CONSTRAINT "Experiment_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "Dataset" ADD CONSTRAINT "Dataset_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "ProjectUser" ADD CONSTRAINT "ProjectUser_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "ProjectUser" ADD CONSTRAINT "ProjectUser_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "LoggedCall" ADD CONSTRAINT "LoggedCall_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "ApiKey" ADD CONSTRAINT "ApiKey_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Rename indexes +ALTER TABLE "Project" RENAME CONSTRAINT "Organization_pkey" TO "Project_pkey"; +ALTER TABLE "ProjectUser" RENAME CONSTRAINT "OrganizationUser_pkey" TO "ProjectUser_pkey"; +ALTER TABLE "Project" RENAME CONSTRAINT "Organization_personalOrgUserId_fkey" TO "Project_personalProjectUserId_fkey"; +ALTER INDEX "Organization_personalOrgUserId_key" RENAME TO "Project_personalProjectUserId_key"; +ALTER INDEX "OrganizationUser_organizationId_userId_key" RENAME TO "ProjectUser_projectId_userId_key"; diff --git a/app/prisma/schema.prisma b/app/prisma/schema.prisma index 60b7d7d..1600669 100644 --- a/app/prisma/schema.prisma +++ b/app/prisma/schema.prisma @@ -16,8 +16,8 @@ model Experiment { sortIndex Int @default(0) - organizationId String @db.Uuid - organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade) + projectId String @db.Uuid + project Project? @relation(fields: [projectId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -180,8 +180,8 @@ model Dataset { name String datasetEntries DatasetEntry[] - organizationId String @db.Uuid - organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade) + projectId String @db.Uuid + project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -200,36 +200,35 @@ model DatasetEntry { updatedAt DateTime @updatedAt } -// TODO rename Organization to Project -model Organization { - id String @id @default(uuid()) @db.Uuid - name String @default("Project 1") +model Project { + id String @id @default(uuid()) @db.Uuid + name String @default("Project 1") - personalOrgUserId String? @unique @db.Uuid - personalOrgUser User? @relation(fields: [personalOrgUserId], references: [id], onDelete: Cascade) + personalProjectUserId String? @unique @db.Uuid + personalProjectUser User? @relation(fields: [personalProjectUserId], references: [id], onDelete: Cascade) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - organizationUsers OrganizationUser[] - experiments Experiment[] - datasets Dataset[] - loggedCalls LoggedCall[] - apiKeys ApiKey[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + projectUsers ProjectUser[] + experiments Experiment[] + datasets Dataset[] + loggedCalls LoggedCall[] + apiKeys ApiKey[] } -enum OrganizationUserRole { +enum ProjectUserRole { ADMIN MEMBER VIEWER } -model OrganizationUser { +model ProjectUser { id String @id @default(uuid()) @db.Uuid - role OrganizationUserRole + role ProjectUserRole - organizationId String @db.Uuid - organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade) + projectId String @db.Uuid + project Project? @relation(fields: [projectId], references: [id], onDelete: Cascade) userId String @db.Uuid user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@ -237,7 +236,7 @@ model OrganizationUser { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - @@unique([organizationId, userId]) + @@unique([projectId, userId]) } model WorldChampEntrant { @@ -265,14 +264,14 @@ model LoggedCall { // A LoggedCall is always associated with a LoggedCallModelResponse. If this // is a cache miss, we create a new LoggedCallModelResponse. // If it's a cache hit, it's a pre-existing LoggedCallModelResponse. - modelResponseId String? @db.Uuid + modelResponseId String? @db.Uuid modelResponse LoggedCallModelResponse? @relation(fields: [modelResponseId], references: [id], onDelete: Cascade) // The responses created by this LoggedCall. Will be empty if this LoggedCall was a cache hit. createdResponses LoggedCallModelResponse[] @relation(name: "ModelResponseOriginalCall") - organizationId String @db.Uuid - organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade) + projectId String @db.Uuid + project Project? @relation(fields: [projectId], references: [id], onDelete: Cascade) tags LoggedCallTag[] @@ -323,11 +322,11 @@ model LoggedCallModelResponse { } model LoggedCallTag { - id String @id @default(uuid()) @db.Uuid + id String @id @default(uuid()) @db.Uuid name String value String? - loggedCallId String @db.Uuid + loggedCallId String @db.Uuid loggedCall LoggedCall @relation(fields: [loggedCallId], references: [id], onDelete: Cascade) @@index([name]) @@ -340,8 +339,8 @@ model ApiKey { name String apiKey String @unique - organizationId String @db.Uuid - organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade) + projectId String @db.Uuid + project Project? @relation(fields: [projectId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -390,8 +389,8 @@ model User { accounts Account[] sessions Session[] - organizationUsers OrganizationUser[] - organizations Organization[] + projectUsers ProjectUser[] + projects Project[] worldChampEntrant WorldChampEntrant? createdAt DateTime @default(now()) diff --git a/app/prisma/seed.ts b/app/prisma/seed.ts index 163f513..9b838c2 100644 --- a/app/prisma/seed.ts +++ b/app/prisma/seed.ts @@ -5,14 +5,14 @@ import { promptConstructorVersion } from "~/promptConstructor/version"; const defaultId = "11111111-1111-1111-1111-111111111111"; -await prisma.organization.deleteMany({ +await prisma.project.deleteMany({ where: { id: defaultId }, }); -// If there's an existing org, just seed into it -const org = - (await prisma.organization.findFirst({})) ?? - (await prisma.organization.create({ +// If there's an existing project, just seed into it +const project = + (await prisma.project.findFirst({})) ?? + (await prisma.project.create({ data: { id: defaultId }, })); @@ -26,7 +26,7 @@ await prisma.experiment.create({ data: { id: defaultId, label: "Country Capitals Example", - organizationId: org.id, + projectId: project.id, }, }); diff --git a/app/prisma/seedAgiEval.ts b/app/prisma/seedAgiEval.ts index 3eab221..548d3c4 100644 --- a/app/prisma/seedAgiEval.ts +++ b/app/prisma/seedAgiEval.ts @@ -7,14 +7,14 @@ import { promptConstructorVersion } from "~/promptConstructor/version"; const defaultId = "11111111-1111-1111-1111-111111111112"; -await prisma.organization.deleteMany({ +await prisma.project.deleteMany({ where: { id: defaultId }, }); -// If there's an existing org, just seed into it -const org = - (await prisma.organization.findFirst({})) ?? - (await prisma.organization.create({ +// If there's an existing project, just seed into it +const project = + (await prisma.project.findFirst({})) ?? + (await prisma.project.create({ data: { id: defaultId }, })); @@ -47,7 +47,7 @@ for (const dataset of datasets) { const oldExperiment = await prisma.experiment.findFirst({ where: { label: experimentName, - organizationId: org.id, + projectId: project.id, }, }); if (oldExperiment) { @@ -60,7 +60,7 @@ for (const dataset of datasets) { data: { id: oldExperiment?.id ?? undefined, label: experimentName, - organizationId: org.id, + projectId: project.id, }, }); diff --git a/app/prisma/seedDashboard.ts b/app/prisma/seedDashboard.ts index ff7de60..8e55a2d 100644 --- a/app/prisma/seedDashboard.ts +++ b/app/prisma/seedDashboard.ts @@ -311,9 +311,9 @@ const MODEL_RESPONSE_TEMPLATES: { await prisma.loggedCallModelResponse.deleteMany(); -const org = await prisma.organization.findFirst({ +const project = await prisma.project.findFirst({ where: { - personalOrgUserId: { + personalProjectUserId: { not: null, }, }, @@ -322,8 +322,8 @@ const org = await prisma.organization.findFirst({ }, }); -if (!org) { - console.error("No org found. Sign up to create your first org."); +if (!project) { + console.error("No project found. Sign up to create your first project."); process.exit(1); } @@ -348,7 +348,7 @@ for (let i = 0; i < 1437; i++) { id: loggedCallId, cacheHit: false, startTime, - organizationId: org.id, + projectId: project.id, createdAt: startTime, }); @@ -373,7 +373,7 @@ for (let i = 0; i < 1437; i++) { respStatus: template.respStatus, error: template.error, createdAt: startTime, - cacheKey: hashRequest(org.id, template.reqPayload as JsonValue), + cacheKey: hashRequest(project.id, template.reqPayload as JsonValue), durationMs: endTime.getTime() - startTime.getTime(), inputTokens: template.inputTokens, outputTokens: template.outputTokens, diff --git a/app/prisma/seedTwitterSentiment.ts b/app/prisma/seedTwitterSentiment.ts index 0e4fd41..a27734b 100644 --- a/app/prisma/seedTwitterSentiment.ts +++ b/app/prisma/seedTwitterSentiment.ts @@ -6,14 +6,14 @@ import { promptConstructorVersion } from "~/promptConstructor/version"; const defaultId = "11111111-1111-1111-1111-111111111112"; -await prisma.organization.deleteMany({ +await prisma.project.deleteMany({ where: { id: defaultId }, }); -// If there's an existing org, just seed into it -const org = - (await prisma.organization.findFirst({})) ?? - (await prisma.organization.create({ +// If there's an existing project, just seed into it +const project = + (await prisma.project.findFirst({})) ?? + (await prisma.project.create({ data: { id: defaultId }, })); @@ -27,7 +27,7 @@ const experimentName = `Twitter Sentiment Analysis`; const oldExperiment = await prisma.experiment.findFirst({ where: { label: experimentName, - organizationId: org.id, + projectId: project.id, }, }); if (oldExperiment) { @@ -40,7 +40,7 @@ const experiment = await prisma.experiment.create({ data: { id: oldExperiment?.id ?? undefined, label: experimentName, - organizationId: org.id, + projectId: project.id, }, }); diff --git a/app/src/components/datasets/DatasetCard.tsx b/app/src/components/datasets/DatasetCard.tsx index fc59911..b93a172 100644 --- a/app/src/components/datasets/DatasetCard.tsx +++ b/app/src/components/datasets/DatasetCard.tsx @@ -72,12 +72,12 @@ const CountLabel = ({ label, count }: { label: string; count: number }) => { export const NewDatasetCard = () => { const router = useRouter(); - const selectedOrgId = useAppStore((s) => s.selectedOrgId); + const selectedProjectId = useAppStore((s) => s.selectedProjectId); const createMutation = api.datasets.create.useMutation(); const [createDataset, isLoading] = useHandledAsyncCallback(async () => { - const newDataset = await createMutation.mutateAsync({ organizationId: selectedOrgId ?? "" }); + const newDataset = await createMutation.mutateAsync({ projectId: selectedProjectId ?? "" }); await router.push({ pathname: "/data/[id]", query: { id: newDataset.id } }); - }, [createMutation, router, selectedOrgId]); + }, [createMutation, router, selectedProjectId]); return ( diff --git a/app/src/components/experiments/ExperimentCard.tsx b/app/src/components/experiments/ExperimentCard.tsx index 01853af..010856e 100644 --- a/app/src/components/experiments/ExperimentCard.tsx +++ b/app/src/components/experiments/ExperimentCard.tsx @@ -76,17 +76,17 @@ const CountLabel = ({ label, count }: { label: string; count: number }) => { export const NewExperimentCard = () => { const router = useRouter(); - const selectedOrgId = useAppStore((s) => s.selectedOrgId); + const selectedProjectId = useAppStore((s) => s.selectedProjectId); const createMutation = api.experiments.create.useMutation(); const [createExperiment, isLoading] = useHandledAsyncCallback(async () => { const newExperiment = await createMutation.mutateAsync({ - organizationId: selectedOrgId ?? "", + projectId: selectedProjectId ?? "", }); await router.push({ pathname: "/experiments/[id]", query: { id: newExperiment.id }, }); - }, [createMutation, router, selectedOrgId]); + }, [createMutation, router, selectedProjectId]); return ( diff --git a/app/src/components/experiments/ExperimentHeaderButtons/useOnForkButtonPressed.tsx b/app/src/components/experiments/ExperimentHeaderButtons/useOnForkButtonPressed.tsx index 62f99de..b207b10 100644 --- a/app/src/components/experiments/ExperimentHeaderButtons/useOnForkButtonPressed.tsx +++ b/app/src/components/experiments/ExperimentHeaderButtons/useOnForkButtonPressed.tsx @@ -10,15 +10,15 @@ export const useOnForkButtonPressed = () => { const user = useSession().data; const experiment = useExperiment(); - const selectedOrgId = useAppStore((state) => state.selectedOrgId); + const selectedProjectId = useAppStore((state) => state.selectedProjectId); const forkMutation = api.experiments.fork.useMutation(); const [onFork, isForking] = useHandledAsyncCallback(async () => { - if (!experiment.data?.id || !selectedOrgId) return; + if (!experiment.data?.id || !selectedProjectId) return; const forkedExperimentId = await forkMutation.mutateAsync({ id: experiment.data.id, - organizationId: selectedOrgId, + projectId: selectedProjectId, }); await router.push({ pathname: "/experiments/[id]", query: { id: forkedExperimentId } }); }, [forkMutation, experiment.data?.id, router]); diff --git a/app/src/components/nav/ProjectBreadcrumbContents.tsx b/app/src/components/nav/ProjectBreadcrumbContents.tsx index 3d642c7..1a1ad95 100644 --- a/app/src/components/nav/ProjectBreadcrumbContents.tsx +++ b/app/src/components/nav/ProjectBreadcrumbContents.tsx @@ -1,12 +1,12 @@ import { HStack, Flex, Text } from "@chakra-ui/react"; -import { useSelectedOrg } from "~/utils/hooks"; +import { useSelectedProject } from "~/utils/hooks"; // Have to export only contents here instead of full BreadcrumbItem because Chakra doesn't // recognize a BreadcrumbItem exported with this component as a valid child of Breadcrumb. -export default function ProjectBreadcrumbContents({ orgName = "" }: { orgName?: string }) { - const { data: selectedOrg } = useSelectedOrg(); +export default function ProjectBreadcrumbContents({ projectName = "" }: { projectName?: string }) { + const { data: selectedProject } = useSelectedProject(); - orgName = orgName || selectedOrg?.name || ""; + projectName = projectName || selectedProject?.name || ""; return ( @@ -18,10 +18,10 @@ export default function ProjectBreadcrumbContents({ orgName = "" }: { orgName?: alignItems="center" justifyContent="center" > - {orgName[0]?.toUpperCase()} + {projectName[0]?.toUpperCase()} - {orgName} + {projectName} ); diff --git a/app/src/components/nav/ProjectMenu.tsx b/app/src/components/nav/ProjectMenu.tsx index 585cbfb..8574025 100644 --- a/app/src/components/nav/ProjectMenu.tsx +++ b/app/src/components/nav/ProjectMenu.tsx @@ -17,39 +17,42 @@ import React, { useEffect, useState } from "react"; import Link from "next/link"; import { AiFillCaretDown } from "react-icons/ai"; import { BsGear, BsPlus } from "react-icons/bs"; -import { type Organization } from "@prisma/client"; +import { type Project } from "@prisma/client"; import { useAppStore } from "~/state/store"; import { api } from "~/utils/api"; import NavSidebarOption from "./NavSidebarOption"; -import { useHandledAsyncCallback, useSelectedOrg } from "~/utils/hooks"; +import { useHandledAsyncCallback, useSelectedProject } from "~/utils/hooks"; import { useRouter } from "next/router"; export default function ProjectMenu() { const router = useRouter(); - const isActive = router.pathname.startsWith("/home"); const utils = api.useContext(); - const selectedOrgId = useAppStore((s) => s.selectedOrgId); - const setSelectedOrgId = useAppStore((s) => s.setSelectedOrgId); + const selectedProjectId = useAppStore((s) => s.selectedProjectId); + const setselectedProjectId = useAppStore((s) => s.setselectedProjectId); - const { data: orgs } = api.organizations.list.useQuery(); + const { data: projects } = api.projects.list.useQuery(); useEffect(() => { - if (orgs && orgs[0] && (!selectedOrgId || !orgs.find((org) => org.id === selectedOrgId))) { - setSelectedOrgId(orgs[0].id); + if ( + projects && + projects[0] && + (!selectedProjectId || !projects.find((proj) => proj.id === selectedProjectId)) + ) { + setselectedProjectId(projects[0].id); } - }, [selectedOrgId, setSelectedOrgId, orgs]); + }, [selectedProjectId, setselectedProjectId, projects]); - const { data: selectedOrg } = useSelectedOrg(); + const { data: selectedProject } = useSelectedProject(); const popover = useDisclosure(); - const createMutation = api.organizations.create.useMutation(); + const createMutation = api.projects.create.useMutation(); const [createProject, isLoading] = useHandledAsyncCallback(async () => { - const newOrg = await createMutation.mutateAsync({ name: "New Project" }); - await utils.organizations.list.invalidate(); - setSelectedOrgId(newOrg.id); + const newProj = await createMutation.mutateAsync({ name: "New Project" }); + await utils.projects.list.invalidate(); + setselectedProjectId(newProj.id); await router.push({ pathname: "/project/settings" }); }, [createMutation, router]); @@ -84,10 +87,10 @@ export default function ProjectMenu() { alignItems="center" justifyContent="center" > - {selectedOrg?.name[0]?.toUpperCase()} + {selectedProject?.name[0]?.toUpperCase()} - {selectedOrg?.name} + {selectedProject?.name} @@ -104,11 +107,11 @@ export default function ProjectMenu() { - {orgs?.map((org) => ( + {projects?.map((proj) => ( ))} @@ -134,22 +137,22 @@ export default function ProjectMenu() { } const ProjectOption = ({ - org, + proj, isActive, onClose, }: { - org: Organization; + proj: Project; isActive: boolean; onClose: () => void; }) => { - const setSelectedOrgId = useAppStore((s) => s.setSelectedOrgId); + const setselectedProjectId = useAppStore((s) => s.setselectedProjectId); const [gearHovered, setGearHovered] = useState(false); return ( { - setSelectedOrgId(org.id); + setselectedProjectId(proj.id); onClose(); }} w="full" @@ -158,11 +161,11 @@ const ProjectOption = ({ _hover={gearHovered ? undefined : { bgColor: "gray.200", textDecoration: "none" }} p={2} > - {org.name} + {proj.name} } variant="ghost" size="xs" diff --git a/app/src/components/projectSettings/DeleteProjectDialog.tsx b/app/src/components/projectSettings/DeleteProjectDialog.tsx index 1a1d7d3..28e9a9e 100644 --- a/app/src/components/projectSettings/DeleteProjectDialog.tsx +++ b/app/src/components/projectSettings/DeleteProjectDialog.tsx @@ -16,7 +16,7 @@ import { import { useRouter } from "next/router"; import { useRef, useState } from "react"; import { api } from "~/utils/api"; -import { useHandledAsyncCallback, useSelectedOrg } from "~/utils/hooks"; +import { useHandledAsyncCallback, useSelectedProject } from "~/utils/hooks"; export const DeleteProjectDialog = ({ isOpen, @@ -25,20 +25,20 @@ export const DeleteProjectDialog = ({ isOpen: boolean; onClose: () => void; }) => { - const selectedOrg = useSelectedOrg(); - const deleteMutation = api.organizations.delete.useMutation(); + const selectedProject = useSelectedProject(); + const deleteMutation = api.projects.delete.useMutation(); const utils = api.useContext(); const router = useRouter(); const cancelRef = useRef(null); const [onDeleteConfirm, isDeleting] = useHandledAsyncCallback(async () => { - if (!selectedOrg.data?.id) return; - await deleteMutation.mutateAsync({ id: selectedOrg.data.id }); - await utils.organizations.list.invalidate(); + if (!selectedProject.data?.id) return; + await deleteMutation.mutateAsync({ id: selectedProject.data.id }); + await utils.projects.list.invalidate(); await router.push({ pathname: "/experiments" }); onClose(); - }, [deleteMutation, selectedOrg, router]); + }, [deleteMutation, selectedProject, router]); const [nameToDelete, setNameToDelete] = useState(""); @@ -58,10 +58,10 @@ export const DeleteProjectDialog = ({ of the project below. - {selectedOrg.data?.name} + {selectedProject.data?.name} setNameToDelete(e.target.value)} /> @@ -76,7 +76,7 @@ export const DeleteProjectDialog = ({ colorScheme="red" onClick={onDeleteConfirm} ml={3} - isDisabled={nameToDelete !== selectedOrg.data?.name} + isDisabled={nameToDelete !== selectedProject.data?.name} w={20} > {isDeleting ? : "Delete"} diff --git a/app/src/pages/data/[id].tsx b/app/src/pages/data/[id].tsx index b4a79fb..6401630 100644 --- a/app/src/pages/data/[id].tsx +++ b/app/src/pages/data/[id].tsx @@ -60,7 +60,7 @@ export default function Dataset() { - + diff --git a/app/src/pages/experiments/[id].tsx b/app/src/pages/experiments/[id].tsx index 1d89685..a575f38 100644 --- a/app/src/pages/experiments/[id].tsx +++ b/app/src/pages/experiments/[id].tsx @@ -109,7 +109,7 @@ export default function Experiment() { - + diff --git a/app/src/pages/logged-calls/index.tsx b/app/src/pages/logged-calls/index.tsx index ca671db..8acb8ea 100644 --- a/app/src/pages/logged-calls/index.tsx +++ b/app/src/pages/logged-calls/index.tsx @@ -34,17 +34,17 @@ import { useMemo } from "react"; import AppShell from "~/components/nav/AppShell"; import PageHeaderContainer from "~/components/nav/PageHeaderContainer"; import ProjectBreadcrumbContents from "~/components/nav/ProjectBreadcrumbContents"; -import { useSelectedOrg } from "~/utils/hooks"; +import { useSelectedProject } from "~/utils/hooks"; import dayjs from "~/utils/dayjs"; import { api } from "~/utils/api"; import LoggedCallTable from "~/components/dashboard/LoggedCallTable"; export default function LoggedCalls() { - const { data: selectedOrg } = useSelectedOrg(); + const { data: selectedProject } = useSelectedProject(); const stats = api.dashboard.stats.useQuery( - { organizationId: selectedOrg?.id ?? "" }, - { enabled: !!selectedOrg }, + { projectId: selectedProject?.id ?? "" }, + { enabled: !!selectedProject }, ); const data = useMemo(() => { @@ -71,7 +71,7 @@ export default function LoggedCalls() { - {selectedOrg?.name} + {selectedProject?.name} diff --git a/app/src/pages/project/settings/index.tsx b/app/src/pages/project/settings/index.tsx index 6083e69..1c69296 100644 --- a/app/src/pages/project/settings/index.tsx +++ b/app/src/pages/project/settings/index.tsx @@ -17,33 +17,35 @@ import { BsTrash } from "react-icons/bs"; import AppShell from "~/components/nav/AppShell"; import PageHeaderContainer from "~/components/nav/PageHeaderContainer"; import { api } from "~/utils/api"; -import { useHandledAsyncCallback, useSelectedOrg } from "~/utils/hooks"; +import { useHandledAsyncCallback, useSelectedProject } from "~/utils/hooks"; import ProjectBreadcrumbContents from "~/components/nav/ProjectBreadcrumbContents"; import CopiableCode from "~/components/CopiableCode"; import { DeleteProjectDialog } from "~/components/projectSettings/DeleteProjectDialog"; export default function Settings() { const utils = api.useContext(); - const { data: selectedOrg } = useSelectedOrg(); + const { data: selectedProject } = useSelectedProject(); const apiKey = - selectedOrg?.apiKeys?.length && selectedOrg?.apiKeys[0] ? selectedOrg?.apiKeys[0].apiKey : ""; + selectedProject?.apiKeys?.length && selectedProject?.apiKeys[0] + ? selectedProject?.apiKeys[0].apiKey + : ""; - const updateMutation = api.organizations.update.useMutation(); + const updateMutation = api.projects.update.useMutation(); const [onSaveName] = useHandledAsyncCallback(async () => { - if (name && name !== selectedOrg?.name && selectedOrg?.id) { + if (name && name !== selectedProject?.name && selectedProject?.id) { await updateMutation.mutateAsync({ - id: selectedOrg.id, + id: selectedProject.id, updates: { name }, }); - await Promise.all([utils.organizations.get.invalidate({ id: selectedOrg.id })]); + await Promise.all([utils.projects.get.invalidate({ id: selectedProject.id })]); } - }, [updateMutation, selectedOrg]); + }, [updateMutation, selectedProject]); - const [name, setName] = useState(selectedOrg?.name); + const [name, setName] = useState(selectedProject?.name); useEffect(() => { - setName(selectedOrg?.name); - }, [selectedOrg?.name]); + setName(selectedProject?.name); + }, [selectedProject?.name]); const deleteProjectOpen = useDisclosure(); @@ -66,7 +68,7 @@ export default function Settings() { Project Settings - Configure your project settings. These settings only apply to {selectedOrg?.name}. + Configure your project settings. These settings only apply to {selectedProject?.name}.