From 95b93b5f3a411cf5286112e7884e19d6437a3024 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Mon, 8 Apr 2024 20:07:50 +0200 Subject: [PATCH 1/6] update pushmodal --- apps/dashboard/package.json | 2 +- apps/dashboard/src/modals/index.tsx | 7 ++++++- pnpm-lock.yaml | 8 ++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 8065445e..cc97c829 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -71,7 +71,7 @@ "next-themes": "^0.2.1", "nuqs": "^1.16.1", "prisma-error-enum": "^0.1.3", - "pushmodal": "^0.0.8", + "pushmodal": "^1.0.0", "ramda": "^0.29.1", "random-animal-name": "^0.1.1", "react": "18.2.0", diff --git a/apps/dashboard/src/modals/index.tsx b/apps/dashboard/src/modals/index.tsx index 74837922..09b00e8d 100644 --- a/apps/dashboard/src/modals/index.tsx +++ b/apps/dashboard/src/modals/index.tsx @@ -5,8 +5,13 @@ import dynamic from 'next/dynamic'; import { createPushModal } from 'pushmodal'; import type { ConfirmProps } from './Confirm'; +import { ModalContent } from './Modal/Container'; -const Loading = () => ; +const Loading = () => ( + + + +); const modals = { EditProject: dynamic(() => import('./EditProject'), { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 020f2893..034343a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -301,8 +301,8 @@ importers: specifier: ^0.1.3 version: 0.1.3 pushmodal: - specifier: ^0.0.8 - version: 0.0.8(@radix-ui/react-dialog@1.0.5)(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.0.0 + version: 1.0.0(@radix-ui/react-dialog@1.0.5)(react-dom@18.2.0)(react@18.2.0) ramda: specifier: ^0.29.1 version: 0.29.1 @@ -14709,8 +14709,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - /pushmodal@0.0.8(@radix-ui/react-dialog@1.0.5)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Fmsx9Fadnv51WPcXvX7x4N8BbLxMDdSStpfJ1WY4pyjqXEEht+3H51TwjZJc5PkGMURdsvi7py76SFgsmrujnw==} + /pushmodal@1.0.0(@radix-ui/react-dialog@1.0.5)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-34JSZHJHGTcLqBgYk9Fyiw5vBYJZrcgoDE7GfHehKKzxBt/Ro2bSLTIGRnzQ+NRv389GxH6WXCBUH+6VJ1wvTg==} peerDependencies: '@radix-ui/react-dialog': ^1.0.0 react: ^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 From 097ea1832019ac1bfecd8f6a38dd0d6d030cd58c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Mon, 8 Apr 2024 21:25:32 +0200 Subject: [PATCH 2/6] rename all db columns --- apps/api/src/utils/auth.ts | 2 +- .../events/event-conversions-list/index.tsx | 3 +- .../[projectId]/layout-menu.tsx | 2 +- .../[organizationId]/[projectId]/page.tsx | 8 +- .../settings/projects/list-projects.tsx | 2 +- .../[projectId]/settings/references/page.tsx | 2 +- .../app/(public)/share/overview/[id]/page.tsx | 4 +- .../src/app/api/clerk/webhook/route.ts | 10 +- .../components/overview/overview-share.tsx | 4 +- apps/dashboard/src/modals/Modal/Container.tsx | 5 +- apps/dashboard/src/trpc/api/routers/client.ts | 10 +- .../src/trpc/api/routers/dashboard.ts | 6 +- apps/dashboard/src/trpc/api/routers/event.ts | 6 +- .../src/trpc/api/routers/onboarding.ts | 19 +-- .../src/trpc/api/routers/organization.ts | 10 +- .../dashboard/src/trpc/api/routers/project.ts | 2 +- .../src/trpc/api/routers/reference.ts | 4 +- apps/dashboard/src/trpc/api/routers/report.ts | 12 +- apps/dashboard/src/trpc/api/routers/share.ts | 6 +- .../migration.sql | 97 +++++++++++++ .../migration.sql | 35 +++++ packages/db/prisma/schema.prisma | 134 +++++++++--------- packages/db/src/services/clients.service.ts | 34 ++--- packages/db/src/services/dashboard.service.ts | 15 +- packages/db/src/services/event.service.ts | 6 +- .../db/src/services/organization.service.ts | 19 +-- packages/db/src/services/project.service.ts | 42 ++---- packages/db/src/services/reference.service.ts | 20 +-- packages/db/src/services/reports.service.ts | 8 +- packages/db/src/services/share.service.ts | 8 ++ 30 files changed, 303 insertions(+), 232 deletions(-) create mode 100644 packages/db/prisma/migrations/20240408181306_rename_columns/migration.sql create mode 100644 packages/db/prisma/migrations/20240408184129_rename_colimns_2/migration.sql diff --git a/apps/api/src/utils/auth.ts b/apps/api/src/utils/auth.ts index ed648bc4..22814f9f 100644 --- a/apps/api/src/utils/auth.ts +++ b/apps/api/src/utils/auth.ts @@ -89,5 +89,5 @@ export async function validateSdkRequest( } } - return client.project_id; + return client.projectId; } diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/index.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/index.tsx index d5b5a97b..57bcee32 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/index.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/index.tsx @@ -1,4 +1,3 @@ -import { Widget } from '@/components/widget'; import { escape } from 'sqlstring'; import { db, getEvents } from '@openpanel/db'; @@ -12,7 +11,7 @@ interface Props { export default async function EventConversionsListServer({ projectId }: Props) { const conversions = await db.eventMeta.findMany({ where: { - project_id: projectId, + projectId, conversion: true, }, }); diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-menu.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-menu.tsx index 6e0d0192..f5db083f 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-menu.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-menu.tsx @@ -145,7 +145,7 @@ export default function LayoutMenu({ dashboards }: LayoutMenuProps) { } - href={`/${item.organization_slug}/${item.project_id}/dashboards/${item.id}`} + href={`/${item.organizationSlug}/${item.projectId}/dashboards/${item.id}`} /> ))} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx index 94eab5fb..f62eb71c 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx @@ -10,7 +10,7 @@ import OverviewTopGeo from '@/components/overview/overview-top-geo'; import OverviewTopPages from '@/components/overview/overview-top-pages'; import OverviewTopSources from '@/components/overview/overview-top-sources'; -import { db } from '@openpanel/db'; +import { getShareByProjectId } from '@openpanel/db'; import OverviewMetrics from '../../../../components/overview/overview-metrics'; import { StickyBelowHeader } from './layout-sticky-below-header'; @@ -26,11 +26,7 @@ interface PageProps { export default async function Page({ params: { organizationId, projectId }, }: PageProps) { - const share = await db.shareOverview.findUnique({ - where: { - project_id: projectId, - }, - }); + const share = await getShareByProjectId(projectId); return ( diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx index cc25c480..4b58e987 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx @@ -57,7 +57,7 @@ export default function ListProjects({ projects, clients }: ListProjectsProps) { {projects.map((project) => { const pClients = clients.filter( - (client) => client.project_id === project.id + (client) => client.projectId === project.id ); return ( diff --git a/apps/dashboard/src/app/api/clerk/webhook/route.ts b/apps/dashboard/src/app/api/clerk/webhook/route.ts index 0aa9adc3..2d42a9d8 100644 --- a/apps/dashboard/src/app/api/clerk/webhook/route.ts +++ b/apps/dashboard/src/app/api/clerk/webhook/route.ts @@ -12,9 +12,9 @@ export async function POST(request: Request) { data: access .filter((a): a is string => typeof a === 'string') .map((projectId) => ({ - organization_slug: payload.data.organization.slug!, - project_id: projectId, - user_id: payload.data.public_user_data.user_id, + organizationSlug: payload.data.organization.slug!, + projectId: projectId, + userId: payload.data.public_user_data.user_id, level: AccessLevel.read, })), }); @@ -23,8 +23,8 @@ export async function POST(request: Request) { if (payload.type === 'organizationMembership.deleted') { await db.projectAccess.deleteMany({ where: { - organization_slug: payload.data.organization.slug!, - user_id: payload.data.public_user_data.user_id, + organizationSlug: payload.data.organization.slug!, + userId: payload.data.public_user_data.user_id, }, }); } diff --git a/apps/dashboard/src/components/overview/overview-share.tsx b/apps/dashboard/src/components/overview/overview-share.tsx index 251d40cb..d10c7576 100644 --- a/apps/dashboard/src/components/overview/overview-share.tsx +++ b/apps/dashboard/src/components/overview/overview-share.tsx @@ -59,8 +59,8 @@ export function OverviewShare({ data }: OverviewShareProps) { onClick={() => { mutation.mutate({ public: false, - projectId: data?.project_id, - organizationId: data?.organization_slug, + projectId: data?.projectId, + organizationId: data?.organizationSlug, password: null, }); }} diff --git a/apps/dashboard/src/modals/Modal/Container.tsx b/apps/dashboard/src/modals/Modal/Container.tsx index 8b194791..25ca82f8 100644 --- a/apps/dashboard/src/modals/Modal/Container.tsx +++ b/apps/dashboard/src/modals/Modal/Container.tsx @@ -8,10 +8,11 @@ import { popModal } from '..'; interface ModalContentProps { children: React.ReactNode; + className?: string; } -export function ModalContent({ children }: ModalContentProps) { - return {children}; +export function ModalContent({ children, className }: ModalContentProps) { + return {children}; } interface ModalHeaderProps { diff --git a/apps/dashboard/src/trpc/api/routers/client.ts b/apps/dashboard/src/trpc/api/routers/client.ts index a6981a40..0d3543c4 100644 --- a/apps/dashboard/src/trpc/api/routers/client.ts +++ b/apps/dashboard/src/trpc/api/routers/client.ts @@ -3,7 +3,7 @@ import { createTRPCRouter, protectedProcedure } from '@/trpc/api/trpc'; import { z } from 'zod'; import { hashPassword, stripTrailingSlash } from '@openpanel/common'; -import { db, transformClient } from '@openpanel/db'; +import { db } from '@openpanel/db'; export const clientRouter = createTRPCRouter({ list: protectedProcedure @@ -15,7 +15,7 @@ export const clientRouter = createTRPCRouter({ .query(async ({ input: { organizationId } }) => { return db.client.findMany({ where: { - organization_slug: organizationId, + organizationSlug: organizationId, }, include: { project: true, @@ -67,8 +67,8 @@ export const clientRouter = createTRPCRouter({ const secret = randomUUID(); const client = await db.client.create({ data: { - organization_slug: input.organizationId, - project_id: input.projectId, + organizationSlug: input.organizationId, + projectId: input.projectId, name: input.name, secret: input.cors ? null : await hashPassword(secret), cors: input.cors ? stripTrailingSlash(input.cors) : '*', @@ -76,7 +76,7 @@ export const clientRouter = createTRPCRouter({ }); return { - ...transformClient(client), + ...client, secret: input.cors ? null : secret, }; }), diff --git a/apps/dashboard/src/trpc/api/routers/dashboard.ts b/apps/dashboard/src/trpc/api/routers/dashboard.ts index bef7ceb3..57a48638 100644 --- a/apps/dashboard/src/trpc/api/routers/dashboard.ts +++ b/apps/dashboard/src/trpc/api/routers/dashboard.ts @@ -28,8 +28,8 @@ export const dashboardRouter = createTRPCRouter({ return db.dashboard.create({ data: { id: await getId('dashboard', name), - project_id: projectId, - organization_slug: organizationSlug, + projectId: projectId, + organizationSlug: organizationSlug, name, }, }); @@ -63,7 +63,7 @@ export const dashboardRouter = createTRPCRouter({ if (forceDelete) { await db.report.deleteMany({ where: { - dashboard_id: id, + dashboardId: id, }, }); } diff --git a/apps/dashboard/src/trpc/api/routers/event.ts b/apps/dashboard/src/trpc/api/routers/event.ts index be4213f5..d3e728f7 100644 --- a/apps/dashboard/src/trpc/api/routers/event.ts +++ b/apps/dashboard/src/trpc/api/routers/event.ts @@ -22,12 +22,12 @@ export const eventRouter = createTRPCRouter({ .mutation(({ input: { projectId, name, icon, color, conversion } }) => { return db.eventMeta.upsert({ where: { - name_project_id: { + name_projectId: { name, - project_id: projectId, + projectId, }, }, - create: { project_id: projectId, name, icon, color, conversion }, + create: { projectId, name, icon, color, conversion }, update: { icon, color, conversion }, }); }), diff --git a/apps/dashboard/src/trpc/api/routers/onboarding.ts b/apps/dashboard/src/trpc/api/routers/onboarding.ts index 28ecc684..e1b71776 100644 --- a/apps/dashboard/src/trpc/api/routers/onboarding.ts +++ b/apps/dashboard/src/trpc/api/routers/onboarding.ts @@ -4,12 +4,7 @@ import { clerkClient } from '@clerk/nextjs'; import { z } from 'zod'; import { hashPassword, stripTrailingSlash } from '@openpanel/common'; -import { - db, - transformClient, - transformOrganization, - transformProject, -} from '@openpanel/db'; +import { db, transformOrganization } from '@openpanel/db'; export const onboardingRouter = createTRPCRouter({ organziation: protectedProcedure @@ -30,7 +25,7 @@ export const onboardingRouter = createTRPCRouter({ const project = await db.project.create({ data: { name: input.project, - organization_slug: org.slug, + organizationSlug: org.slug, }, }); @@ -38,19 +33,19 @@ export const onboardingRouter = createTRPCRouter({ const client = await db.client.create({ data: { name: `${project.name} Client`, - organization_slug: org.slug, - project_id: project.id, + organizationSlug: org.slug, + projectId: project.id, cors: input.cors ? stripTrailingSlash(input.cors) : '*', secret: input.cors ? null : await hashPassword(secret), }, }); return { - client: transformClient({ + client: { ...client, secret: input.cors ? null : secret, - }), - project: transformProject(project), + }, + project, organization: transformOrganization(org), }; } diff --git a/apps/dashboard/src/trpc/api/routers/organization.ts b/apps/dashboard/src/trpc/api/routers/organization.ts index 6c0f83e0..226ab997 100644 --- a/apps/dashboard/src/trpc/api/routers/organization.ts +++ b/apps/dashboard/src/trpc/api/routers/organization.ts @@ -77,15 +77,15 @@ export const organizationRouter = createTRPCRouter({ return db.$transaction([ db.projectAccess.deleteMany({ where: { - user_id: input.userId, - organization_slug: input.organizationSlug, + userId: input.userId, + organizationSlug: input.organizationSlug, }, }), db.projectAccess.createMany({ data: input.access.map((projectId) => ({ - user_id: input.userId, - organization_slug: input.organizationSlug, - project_id: projectId, + userId: input.userId, + organizationSlug: input.organizationSlug, + projectId: projectId, level: 'read', })), }), diff --git a/apps/dashboard/src/trpc/api/routers/project.ts b/apps/dashboard/src/trpc/api/routers/project.ts index a7868364..af562d90 100644 --- a/apps/dashboard/src/trpc/api/routers/project.ts +++ b/apps/dashboard/src/trpc/api/routers/project.ts @@ -44,7 +44,7 @@ export const projectRouter = createTRPCRouter({ return db.project.create({ data: { id: await getId('project', input.name), - organization_slug: input.organizationId, + organizationSlug: input.organizationId, name: input.name, }, }); diff --git a/apps/dashboard/src/trpc/api/routers/reference.ts b/apps/dashboard/src/trpc/api/routers/reference.ts index 3a03eb14..06571363 100644 --- a/apps/dashboard/src/trpc/api/routers/reference.ts +++ b/apps/dashboard/src/trpc/api/routers/reference.ts @@ -19,7 +19,7 @@ export const referenceRouter = createTRPCRouter({ data: { title, description, - project_id: projectId, + projectId, date: new Date(datetime), }, }); @@ -47,7 +47,7 @@ export const referenceRouter = createTRPCRouter({ const { startDate, endDate } = getChartStartEndDate(input); return getReferences({ where: { - project_id: projectId, + projectId, date: { gte: new Date(startDate), lte: new Date(endDate), diff --git a/apps/dashboard/src/trpc/api/routers/report.ts b/apps/dashboard/src/trpc/api/routers/report.ts index a5246802..b5a58ef7 100644 --- a/apps/dashboard/src/trpc/api/routers/report.ts +++ b/apps/dashboard/src/trpc/api/routers/report.ts @@ -20,14 +20,14 @@ export const reportRouter = createTRPCRouter({ }); return db.report.create({ data: { - project_id: dashboard.project_id, - dashboard_id: dashboardId, + projectId: dashboard.projectId, + dashboardId, name: report.name, events: report.events, interval: report.interval, breakdowns: report.breakdowns, - chart_type: report.chartType, - line_type: report.lineType, + chartType: report.chartType, + lineType: report.lineType, range: report.range, formula: report.formula, }, @@ -50,8 +50,8 @@ export const reportRouter = createTRPCRouter({ events: report.events, interval: report.interval, breakdowns: report.breakdowns, - chart_type: report.chartType, - line_type: report.lineType, + chartType: report.chartType, + lineType: report.lineType, range: report.range, formula: report.formula, }, diff --git a/apps/dashboard/src/trpc/api/routers/share.ts b/apps/dashboard/src/trpc/api/routers/share.ts index a365c397..17d40c82 100644 --- a/apps/dashboard/src/trpc/api/routers/share.ts +++ b/apps/dashboard/src/trpc/api/routers/share.ts @@ -12,12 +12,12 @@ export const shareRouter = createTRPCRouter({ .mutation(({ input }) => { return db.shareOverview.upsert({ where: { - project_id: input.projectId, + projectId: input.projectId, }, create: { id: uid.rnd(), - organization_slug: input.organizationId, - project_id: input.projectId, + organizationSlug: input.organizationId, + projectId: input.projectId, public: input.public, password: input.password || null, }, diff --git a/packages/db/prisma/migrations/20240408181306_rename_columns/migration.sql b/packages/db/prisma/migrations/20240408181306_rename_columns/migration.sql new file mode 100644 index 00000000..ea81f8c5 --- /dev/null +++ b/packages/db/prisma/migrations/20240408181306_rename_columns/migration.sql @@ -0,0 +1,97 @@ +-- Project +-- organization_slug -> organizationSlug +ALTER TABLE + IF EXISTS "projects" RENAME COLUMN "organization_slug" TO "organizationSlug"; + +-- ProjectAccess +-- project_id -> projectId +-- organization_slug -> organizationSlug +-- user_id -> userId +ALTER TABLE + IF EXISTS "project_access" RENAME COLUMN "project_id" TO "projectId"; + +ALTER TABLE + IF EXISTS "project_access" RENAME COLUMN "organization_slug" TO "organizationSlug"; + +ALTER TABLE + IF EXISTS "project_access" RENAME COLUMN "user_id" TO "userId"; + +-- Event +-- project_id -> projectId +-- profile_id -> profileId +ALTER TABLE + IF EXISTS "events" RENAME COLUMN "project_id" TO "projectId"; + +ALTER TABLE + IF EXISTS "events" RENAME COLUMN "profile_id" TO "profileId"; + +-- Profile +-- external_id -> externalId +-- first_name -> firstName +-- last_name -> lastName +-- project_id -> projectId +ALTER TABLE + IF EXISTS "profiles" RENAME COLUMN "external_id" TO "externalId"; + +ALTER TABLE + IF EXISTS "profiles" RENAME COLUMN "first_name" TO "firstName"; + +ALTER TABLE + IF EXISTS "profiles" RENAME COLUMN "last_name" TO "lastName"; + +ALTER TABLE + IF EXISTS "profiles" RENAME COLUMN "project_id" TO "projectId"; + +-- Client +-- project_id -> projectId +-- organization_slug -> organizationSlug +ALTER TABLE + IF EXISTS "clients" RENAME COLUMN "project_id" TO "projectId"; + +ALTER TABLE + IF EXISTS "clients" RENAME COLUMN "organization_slug" TO "organizationSlug"; + +-- Dashboard +-- organization_slug -> organizationSlug +-- project_id -> projectId +ALTER TABLE + IF EXISTS "dashboards" RENAME COLUMN "organization_slug" TO "organizationSlug"; + +ALTER TABLE + IF EXISTS "dashboards" RENAME COLUMN "project_id" TO "projectId"; + +-- Report +-- chart_type -> chartType +-- line_type -> lineType +-- project_id -> projectId +-- dashboard_id -> dashboardId +ALTER TABLE + IF EXISTS "reports" RENAME COLUMN "chart_type" TO "chartType"; + +ALTER TABLE + IF EXISTS "reports" RENAME COLUMN "line_type" TO "lineType"; + +ALTER TABLE + IF EXISTS "reports" RENAME COLUMN "project_id" TO "projectId"; + +ALTER TABLE + IF EXISTS "reports" RENAME COLUMN "dashboard_id" TO "dashboardId"; + +-- ShareOverview +-- project_id -> projectId +-- organization_slug -> organizationSlug +ALTER TABLE + IF EXISTS "shares" RENAME COLUMN "project_id" TO "projectId"; + +ALTER TABLE + IF EXISTS "shares" RENAME COLUMN "organization_slug" TO "organizationSlug"; + +-- EventMeta (ta bort constraint) +-- project_id -> projectId +ALTER TABLE + IF EXISTS "event_meta" RENAME COLUMN "project_id" TO "projectId"; + +-- Reference +-- project_id -> projectId +ALTER TABLE + IF EXISTS "references" RENAME COLUMN "project_id" TO "projectId"; \ No newline at end of file diff --git a/packages/db/prisma/migrations/20240408184129_rename_colimns_2/migration.sql b/packages/db/prisma/migrations/20240408184129_rename_colimns_2/migration.sql new file mode 100644 index 00000000..d48e7702 --- /dev/null +++ b/packages/db/prisma/migrations/20240408184129_rename_colimns_2/migration.sql @@ -0,0 +1,35 @@ +-- RenameForeignKey +ALTER TABLE "clients" RENAME CONSTRAINT "clients_project_id_fkey" TO "clients_projectId_fkey"; + +-- RenameForeignKey +ALTER TABLE "dashboards" RENAME CONSTRAINT "dashboards_project_id_fkey" TO "dashboards_projectId_fkey"; + +-- RenameForeignKey +ALTER TABLE "event_meta" RENAME CONSTRAINT "event_meta_project_id_fkey" TO "event_meta_projectId_fkey"; + +-- RenameForeignKey +ALTER TABLE "events" RENAME CONSTRAINT "events_project_id_fkey" TO "events_projectId_fkey"; + +-- RenameForeignKey +ALTER TABLE "profiles" RENAME CONSTRAINT "profiles_project_id_fkey" TO "profiles_projectId_fkey"; + +-- RenameForeignKey +ALTER TABLE "project_access" RENAME CONSTRAINT "project_access_project_id_fkey" TO "project_access_projectId_fkey"; + +-- RenameForeignKey +ALTER TABLE "references" RENAME CONSTRAINT "references_project_id_fkey" TO "references_projectId_fkey"; + +-- RenameForeignKey +ALTER TABLE "reports" RENAME CONSTRAINT "reports_dashboard_id_fkey" TO "reports_dashboardId_fkey"; + +-- RenameForeignKey +ALTER TABLE "reports" RENAME CONSTRAINT "reports_project_id_fkey" TO "reports_projectId_fkey"; + +-- RenameForeignKey +ALTER TABLE "shares" RENAME CONSTRAINT "shares_project_id_fkey" TO "shares_projectId_fkey"; + +-- RenameIndex +ALTER INDEX "event_meta_name_project_id_key" RENAME TO "event_meta_name_projectId_key"; + +-- RenameIndex +ALTER INDEX "shares_project_id_key" RENAME TO "shares_projectId_key"; diff --git a/packages/db/prisma/schema.prisma b/packages/db/prisma/schema.prisma index 0adb4fc1..77cdf9dd 100644 --- a/packages/db/prisma/schema.prisma +++ b/packages/db/prisma/schema.prisma @@ -11,23 +11,23 @@ datasource db { } model Project { - id String @id @default(dbgenerated("gen_random_uuid()")) - name String - organization_slug String - events Event[] - eventsCount Int @default(0) - profiles Profile[] - clients Client[] - - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + id String @id @default(dbgenerated("gen_random_uuid()")) + name String + organizationSlug String + eventsCount Int @default(0) + + events Event[] + profiles Profile[] + clients Client[] reports Report[] dashboards Dashboard[] share ShareOverview? - EventMeta EventMeta[] - Reference Reference[] + meta EventMeta[] + references Reference[] + access ProjectAccess[] - access ProjectAccess[] + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt @@map("projects") } @@ -39,14 +39,14 @@ enum AccessLevel { } model ProjectAccess { - id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid - project_id String - project Project @relation(fields: [project_id], references: [id]) - organization_slug String - user_id String - level AccessLevel - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + projectId String + project Project @relation(fields: [projectId], references: [id]) + organizationSlug String + userId String + level AccessLevel + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt @@map("project_access") } @@ -55,10 +55,10 @@ model Event { id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid name String properties Json - project_id String - project Project @relation(fields: [project_id], references: [id]) + projectId String + project Project @relation(fields: [projectId], references: [id]) - profile_id String? + profileId String? createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt @@ -75,29 +75,29 @@ model Salt { } model Profile { - id String @id - external_id String? - first_name String? - last_name String? - email String? - avatar String? - properties Json - project_id String - project Project @relation(fields: [project_id], references: [id]) - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + id String @id + externalId String? + firstName String? + lastName String? + email String? + avatar String? + properties Json + projectId String + project Project @relation(fields: [projectId], references: [id]) + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt @@map("profiles") } model Client { - id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid - name String - secret String? - project_id String - project Project @relation(fields: [project_id], references: [id]) - organization_slug String - cors String @default("*") + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + name String + secret String? + projectId String + project Project @relation(fields: [projectId], references: [id]) + organizationSlug String + cors String @default("*") createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt @@ -124,12 +124,12 @@ enum ChartType { } model Dashboard { - id String @id @default(dbgenerated("gen_random_uuid()")) - name String - organization_slug String - project_id String - project Project @relation(fields: [project_id], references: [id]) - reports Report[] + id String @id @default(dbgenerated("gen_random_uuid()")) + name String + organizationSlug String + projectId String + project Project @relation(fields: [projectId], references: [id]) + reports Report[] createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt @@ -149,19 +149,19 @@ model Report { name String interval Interval range String @default("1m") - chart_type ChartType - line_type String @default("monotone") + chartType ChartType + lineType String @default("monotone") breakdowns Json events Json formula String? unit String? metric Metric @default(sum) - project_id String - project Project @relation(fields: [project_id], references: [id]) + projectId String + project Project @relation(fields: [projectId], references: [id]) previous Boolean @default(false) - dashboard_id String - dashboard Dashboard @relation(fields: [dashboard_id], references: [id]) + dashboardId String + dashboard Dashboard @relation(fields: [dashboardId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt @@ -180,14 +180,14 @@ model Waitlist { } model ShareOverview { - id String @unique - project_id String @unique - project Project @relation(fields: [project_id], references: [id]) - organization_slug String - public Boolean @default(false) - password String? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + id String @unique + projectId String @unique + project Project @relation(fields: [projectId], references: [id]) + organizationSlug String + public Boolean @default(false) + password String? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt @@map("shares") } @@ -198,13 +198,13 @@ model EventMeta { conversion Boolean? color String? icon String? - project_id String - project Project @relation(fields: [project_id], references: [id]) + projectId String + project Project @relation(fields: [projectId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt - @@unique([name, project_id]) + @@unique([name, projectId]) @@map("event_meta") } @@ -213,8 +213,8 @@ model Reference { title String description String? date DateTime @default(now()) - project_id String - project Project @relation(fields: [project_id], references: [id]) + projectId String + project Project @relation(fields: [projectId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt diff --git a/packages/db/src/services/clients.service.ts b/packages/db/src/services/clients.service.ts index 417d3df2..60a39626 100644 --- a/packages/db/src/services/clients.service.ts +++ b/packages/db/src/services/clients.service.ts @@ -1,38 +1,20 @@ -import type { Client } from '../prisma-client'; +import type { Client, Prisma } from '../prisma-client'; import { db } from '../prisma-client'; -import { transformProject } from './project.service'; -import type { IServiceProject } from './project.service'; -export type IServiceClient = ReturnType; -export type IServiceClientWithProject = IServiceClient & { - project: Exclude; -}; - -export function transformClient({ organization_slug, ...client }: Client) { - return { - ...client, - organizationSlug: organization_slug, +export type IServiceClient = Client; +export type IServiceClientWithProject = Prisma.ClientGetPayload<{ + include: { + project: true; }; -} +}>; export async function getClientsByOrganizationId(organizationId: string) { - const clients = await db.client.findMany({ + return db.client.findMany({ where: { - organization_slug: organizationId, + organizationSlug: organizationId, }, include: { project: true, }, }); - - return clients - .map((client) => { - return { - ...transformClient(client), - project: transformProject(client.project), - }; - }) - .filter( - (client): client is IServiceClientWithProject => client.project !== null - ); } diff --git a/packages/db/src/services/dashboard.service.ts b/packages/db/src/services/dashboard.service.ts index 16f4e65e..58afcf9e 100644 --- a/packages/db/src/services/dashboard.service.ts +++ b/packages/db/src/services/dashboard.service.ts @@ -1,15 +1,18 @@ +import type { Dashboard, Prisma } from '../prisma-client'; import { db } from '../prisma-client'; -export type IServiceDashboard = Awaited>; -export type IServiceDashboards = Awaited< - ReturnType ->; +export type IServiceDashboard = Dashboard; +export type IServiceDashboards = Prisma.DashboardGetPayload<{ + include: { + project: true; + }; +}>[]; export async function getDashboardById(id: string, projectId: string) { const dashboard = await db.dashboard.findUnique({ where: { id, - project_id: projectId, + projectId, }, include: { project: true, @@ -26,7 +29,7 @@ export async function getDashboardById(id: string, projectId: string) { export function getDashboardsByProjectId(projectId: string) { return db.dashboard.findMany({ where: { - project_id: projectId, + projectId, }, include: { project: true, diff --git a/packages/db/src/services/event.service.ts b/packages/db/src/services/event.service.ts index 203a9522..a4e074a7 100644 --- a/packages/db/src/services/event.service.ts +++ b/packages/db/src/services/event.service.ts @@ -144,7 +144,7 @@ export async function getEvents( name: { in: names, }, - project_id: events[0]?.project_id, + projectId: events[0]?.project_id, }, select: options.meta === true ? undefined : options.meta, }); @@ -265,7 +265,7 @@ export async function getEventList({ sb.where.projectId = `project_id = ${escape(projectId)}`; if (profileId) { - sb.where.deviceId = `device_id IN (SELECT device_id as did FROM openpanel.events WHERE profile_id = ${escape(profileId)} group by did)`; + sb.where.deviceId = `device_id IN (SELECT device_id as did FROM events WHERE profile_id = ${escape(profileId)} group by did)`; } if (events && events.length > 0) { @@ -357,7 +357,7 @@ export function createBotEvent({ export function getConversionEventNames(projectId: string) { return db.eventMeta.findMany({ where: { - project_id: projectId, + projectId, conversion: true, }, }); diff --git a/packages/db/src/services/organization.service.ts b/packages/db/src/services/organization.service.ts index cb0821c9..9dba8edd 100644 --- a/packages/db/src/services/organization.service.ts +++ b/packages/db/src/services/organization.service.ts @@ -11,7 +11,7 @@ import { db } from '../prisma-client'; export type IServiceOrganization = ReturnType; export type IServiceInvite = ReturnType; export type IServiceMember = ReturnType; -export type IServiceProjectAccess = ReturnType; +export type IServiceProjectAccess = ProjectAccess; export function transformOrganization(org: Organization) { return { @@ -21,15 +21,6 @@ export function transformOrganization(org: Organization) { }; } -export function transformAccess(access: ProjectAccess) { - return { - projectId: access.project_id, - userId: access.user_id, - level: access.level, - organizationSlug: access.organization_slug, - }; -} - export async function getCurrentOrganizations() { const session = auth(); const organizations = await clerkClient.users.getOrganizationMembershipList({ @@ -53,7 +44,7 @@ export async function getOrganizationByProjectId(projectId: string) { }); return clerkClient.organizations.getOrganization({ - slug: project.organization_slug, + slug: project.organizationSlug, }); } @@ -110,7 +101,7 @@ export async function getMembers(organizationSlug: string) { }), db.projectAccess.findMany({ where: { - organization_slug: organizationSlug, + organizationSlug, }, }), ]); @@ -118,11 +109,11 @@ export async function getMembers(organizationSlug: string) { return members .map((member) => { const projectAccess = access.filter( - (item) => item.user_id === member.publicUserData?.userId + (item) => item.userId === member.publicUserData?.userId ); return { ...member, - access: projectAccess.map(transformAccess), + access: projectAccess, }; }) .map(transformMember); diff --git a/packages/db/src/services/project.service.ts b/packages/db/src/services/project.service.ts index 1c82d38e..24042c28 100644 --- a/packages/db/src/services/project.service.ts +++ b/packages/db/src/services/project.service.ts @@ -1,17 +1,9 @@ import { auth } from '@clerk/nextjs'; -import { project } from 'ramda'; import type { Project } from '../prisma-client'; import { db } from '../prisma-client'; -export type IServiceProject = ReturnType; - -export function transformProject({ organization_slug, ...project }: Project) { - return { - organizationSlug: organization_slug, - ...project, - }; -} +export type IServiceProject = Project; export async function getProjectById(id: string) { const res = await db.project.findUnique({ @@ -24,46 +16,32 @@ export async function getProjectById(id: string) { return null; } - return transformProject(res); + return res; } -export async function getProjectsByOrganizationSlug(slug: string) { - const res = await db.project.findMany({ +export async function getProjectsByOrganizationSlug(organizationSlug: string) { + return db.project.findMany({ where: { - organization_slug: slug, + organizationSlug, }, orderBy: { createdAt: 'desc', }, }); - - return res.map(transformProject); } -export async function getCurrentProjects(slug: string) { +export async function getCurrentProjects(organizationSlug: string) { const session = auth(); if (!session.userId) { return []; } - const access = await db.projectAccess.findMany({ + return db.project.findMany({ where: { - organization_slug: slug, - user_id: session.userId, + organizationSlug, }, - }); - - const res = await db.project.findMany({ - where: { - organization_slug: slug, + include: { + access: true, }, }); - - if (access.length === 0) { - return res.map(transformProject); - } - - return res - .filter((project) => access.some((a) => a.project_id === project.id)) - .map(transformProject); } diff --git a/packages/db/src/services/reference.service.ts b/packages/db/src/services/reference.service.ts index 043a6cc0..951fe5b4 100644 --- a/packages/db/src/services/reference.service.ts +++ b/packages/db/src/services/reference.service.ts @@ -1,19 +1,7 @@ import type { Prisma, Reference } from '../prisma-client'; import { db } from '../prisma-client'; -export type IServiceReference = Omit & { - projectId: string; -}; - -export function transformReference({ - project_id, - ...item -}: Reference): IServiceReference { - return { - ...item, - projectId: project_id, - }; -} +export type IServiceReference = Reference; export async function getReferenceById(id: string) { const reference = await db.reference.findUnique({ @@ -26,7 +14,7 @@ export async function getReferenceById(id: string) { return null; } - return transformReference(reference); + return reference; } export async function getReferences({ @@ -38,11 +26,9 @@ export async function getReferences({ take?: number; skip?: number; }) { - const references = await db.reference.findMany({ + return db.reference.findMany({ where, take: take ?? 50, skip, }); - - return references.map(transformReference); } diff --git a/packages/db/src/services/reports.service.ts b/packages/db/src/services/reports.service.ts index 86703076..b33fb950 100644 --- a/packages/db/src/services/reports.service.ts +++ b/packages/db/src/services/reports.service.ts @@ -45,11 +45,11 @@ export function transformReport( ): IChartInput & { id: string } { return { id: report.id, - projectId: report.project_id, + projectId: report.projectId, events: (report.events as IChartEvent[]).map(transformReportEvent), breakdowns: report.breakdowns as IChartBreakdown[], - chartType: report.chart_type, - lineType: (report.line_type as IChartLineType) ?? lineTypes.monotone, + chartType: report.chartType, + lineType: (report.lineType as IChartLineType) ?? lineTypes.monotone, interval: report.interval, name: report.name || 'Untitled', range: (report.range as IChartRange) ?? timeRanges['1m'], @@ -64,7 +64,7 @@ export function getReportsByDashboardId(dashboardId: string) { return db.report .findMany({ where: { - dashboard_id: dashboardId, + dashboardId, }, }) .then((reports) => reports.map(transformReport)); diff --git a/packages/db/src/services/share.service.ts b/packages/db/src/services/share.service.ts index ba527388..a1149f52 100644 --- a/packages/db/src/services/share.service.ts +++ b/packages/db/src/services/share.service.ts @@ -10,3 +10,11 @@ export function getShareOverviewById(id: string) { }, }); } + +export function getShareByProjectId(projectId: string) { + return db.shareOverview.findUnique({ + where: { + projectId, + }, + }); +} From 19b0e509e07559d16f03322364e05c681c34058b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Mon, 8 Apr 2024 21:49:00 +0200 Subject: [PATCH 3/6] rename organizationId -> organizationSlug --- .../dashboards/[dashboardId]/list-reports.tsx | 4 +-- .../dashboards/[dashboardId]/page.tsx | 4 +-- .../dashboards/list-dashboards.tsx | 6 ++-- .../[projectId]/dashboards/page.tsx | 4 +-- .../[projectId]/events/event-list-item.tsx | 4 +-- .../[projectId]/events/page.tsx | 4 +-- .../[projectId]/layout-menu.tsx | 18 +++++----- .../layout-organization-selector.tsx | 2 +- .../[projectId]/layout-project-selector.tsx | 6 ++-- .../[projectId]/layout-sidebar.tsx | 6 ++-- .../[organizationId]/[projectId]/layout.tsx | 8 ++--- .../[organizationId]/[projectId]/page.tsx | 4 +-- .../[projectId]/profiles/[profileId]/page.tsx | 4 +-- .../[projectId]/profiles/page.tsx | 6 ++-- .../profiles/profile-list/profile-list.tsx | 4 +-- .../profiles/profile-top/index.tsx | 6 ++-- .../[projectId]/reports/[reportId]/page.tsx | 4 +-- .../[projectId]/reports/page.tsx | 6 ++-- .../organization/invites/create-invite.tsx | 2 +- .../[projectId]/settings/profile/page.tsx | 6 ++-- .../settings/projects/list-projects.tsx | 4 +-- .../[projectId]/settings/projects/page.tsx | 12 ++++--- .../[projectId]/settings/references/page.tsx | 4 +-- .../(app)/[organizationId]/create-project.tsx | 2 +- .../src/app/(app)/[organizationId]/page.tsx | 10 +++--- .../components/overview/overview-share.tsx | 3 +- apps/dashboard/src/hooks/useAppParams.ts | 13 +++++--- apps/dashboard/src/modals/AddClient.tsx | 6 ++-- apps/dashboard/src/modals/AddDashboard.tsx | 2 +- apps/dashboard/src/modals/AddProject.tsx | 6 ++-- apps/dashboard/src/modals/SaveReport.tsx | 2 +- .../src/modals/ShareOverviewModal.tsx | 6 ++-- apps/dashboard/src/trpc/api/routers/client.ts | 33 ++----------------- .../dashboard/src/trpc/api/routers/project.ts | 18 +++++----- apps/dashboard/src/trpc/api/routers/share.ts | 2 +- packages/db/src/services/clients.service.ts | 4 +-- packages/validation/src/index.ts | 2 +- 37 files changed, 109 insertions(+), 128 deletions(-) diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx index 05827375..21b87099 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx @@ -42,7 +42,7 @@ export function ListReports({ reports }: ListReportsProps) { icon={PlusIcon} onClick={() => { router.push( - `/${params.organizationId}/${ + `/${params.organizationSlug}/${ params.projectId }/reports?${new URLSearchParams({ dashboardId: params.dashboardId, @@ -60,7 +60,7 @@ export function ListReports({ reports }: ListReportsProps) { return (
diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx index 53eb8f4f..40912c64 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx @@ -14,7 +14,7 @@ interface PageProps { } export default async function Page({ - params: { organizationId, projectId, dashboardId }, + params: { organizationId: organizationSlug, projectId, dashboardId }, }: PageProps) { const [dashboard, reports] = await Promise.all([ getDashboardById(dashboardId, projectId), @@ -26,7 +26,7 @@ export default async function Page({ } return ( - + ); diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx index 0494a50b..a18e14ec 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx @@ -20,7 +20,7 @@ interface ListDashboardsProps { export function ListDashboards({ dashboards }: ListDashboardsProps) { const router = useRouter(); const params = useAppParams(); - const { organizationId, projectId } = params; + const { organizationSlug, projectId } = params; const deletion = api.dashboard.delete.useMutation({ onError: (error, variables) => { return handleErrorToastOptions({ @@ -65,8 +65,8 @@ export function ListDashboards({ dashboards }: ListDashboardsProps) {
{item.name} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx index 49cbea01..e0b0f670 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx @@ -13,12 +13,12 @@ interface PageProps { } export default async function Page({ - params: { projectId, organizationId }, + params: { projectId, organizationId: organizationSlug }, }: PageProps) { const dashboards = await getDashboardsByProjectId(projectId); return ( - + {dashboards.length > 0 && } diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx index b8fb0c59..b23c3456 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx @@ -15,7 +15,7 @@ import { EventIcon } from './event-icon'; type EventListItemProps = IServiceCreateEventPayload; export function EventListItem(props: EventListItemProps) { - const { organizationId, projectId } = useAppParams(); + const { organizationSlug, projectId } = useAppParams(); const { createdAt, name, path, duration, meta, profile } = props; const [isDetailsOpen, setIsDetailsOpen] = useState(false); @@ -77,7 +77,7 @@ export function EventListItem(props: EventListItemProps) { onClick={(e) => { e.stopPropagation(); }} - href={`/${organizationId}/${projectId}/profiles/${profile?.id}`} + href={`/${organizationSlug}/${projectId}/profiles/${profile?.id}`} className="max-w-[80px] overflow-hidden text-ellipsis whitespace-nowrap text-sm text-muted-foreground hover:underline" > {profile?.firstName} {profile?.lastName} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx index 6721a48b..271c286a 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx @@ -31,7 +31,7 @@ const nuqsOptions = { }; export default async function Page({ - params: { projectId, organizationId }, + params: { projectId, organizationId: organizationSlug }, searchParams, }: PageProps) { const filters = @@ -56,7 +56,7 @@ export default async function Page({ ]); return ( - + {pathname?.includes('/settings/') && (
)} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx index e540c025..03401988 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx @@ -18,7 +18,7 @@ export default function LayoutOrganizationSelector({ const router = useRouter(); const organization = organizations.find( - (item) => item.slug === params.organizationId + (item) => item.slug === params.organizationSlug ); if (!organization) { diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx index aabc6029..41dbaf2f 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx @@ -13,7 +13,7 @@ export default function LayoutProjectSelector({ projects, }: LayoutProjectSelectorProps) { const router = useRouter(); - const { organizationId, projectId } = useAppParams(); + const { organizationSlug, projectId } = useAppParams(); const pathname = usePathname() || ''; return ( @@ -24,12 +24,12 @@ export default function LayoutProjectSelector({ className="w-auto min-w-0 max-sm:max-w-[100px]" placeholder={'Select project'} onChange={(value) => { - if (organizationId && projectId) { + if (organizationSlug && projectId) { const split = pathname.replace(projectId, value).split('/'); // slicing here will remove everything after /{orgId}/{projectId}/dashboards [slice here] /xxx/xxx/xxx router.push(split.slice(0, 4).join('/')); } else { - router.push(`/${organizationId}/${value}`); + router.push(`/${organizationSlug}/${value}`); } }} value={projectId} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx index 93d91ac2..6a92a1df 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx @@ -17,13 +17,13 @@ import LayoutOrganizationSelector from './layout-organization-selector'; interface LayoutSidebarProps { organizations: IServiceOrganization[]; dashboards: IServiceDashboards; - organizationId: string; + organizationSlug: string; projectId: string; } export function LayoutSidebar({ organizations, dashboards, - organizationId, + organizationSlug, projectId, }: LayoutSidebarProps) { const [active, setActive] = useState(false); @@ -69,7 +69,7 @@ export function LayoutSidebar({
Create a report diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout.tsx index b909cb61..152a3f19 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout.tsx @@ -18,15 +18,15 @@ interface AppLayoutProps { export default async function AppLayout({ children, - params: { organizationId, projectId }, + params: { organizationId: organizationSlug, projectId }, }: AppLayoutProps) { const [organizations, projects, dashboards] = await Promise.all([ getCurrentOrganizations(), - getCurrentProjects(organizationId), + getCurrentProjects(organizationSlug), getDashboardsByProjectId(projectId), ]); - if (!organizations.find((item) => item.slug === organizationId)) { + if (!organizations.find((item) => item.slug === organizationSlug)) { return (
{children}
diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx index f62eb71c..a71f5ffb 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx @@ -24,12 +24,12 @@ interface PageProps { } export default async function Page({ - params: { organizationId, projectId }, + params: { organizationId: organizationSlug, projectId }, }: PageProps) { const share = await getShareByProjectId(projectId); return ( - +
diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx index 00f26efc..2775862b 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx @@ -41,7 +41,7 @@ interface PageProps { } export default async function Page({ - params: { projectId, profileId, organizationId }, + params: { projectId, profileId, organizationId: organizationSlug }, searchParams, }: PageProps) { const eventListOptions: GetEventListOptions = { @@ -125,7 +125,7 @@ export default async function Page({ return ( diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx index 62cd0e22..8ca653b1 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx @@ -25,11 +25,11 @@ const nuqsOptions = { }; export default function Page({ - params: { organizationId, projectId }, + params: { organizationId: organizationSlug, projectId }, searchParams: { cursor, f }, }: PageProps) { return ( - + {/*
diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/profile-list.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/profile-list.tsx index 90f8764e..c5eba24c 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/profile-list.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/profile-list.tsx @@ -21,7 +21,7 @@ interface ProfileListProps { count: number; } export function ProfileList({ data, count }: ProfileListProps) { - const { organizationId, projectId } = useAppParams(); + const { organizationSlug, projectId } = useAppParams(); const { cursor, setCursor } = useCursor(); return ( @@ -46,7 +46,7 @@ export function ProfileList({ data, count }: ProfileListProps) { render(profile) { return ( diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-top/index.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-top/index.tsx index d51661a3..3befc84a 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-top/index.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-top/index.tsx @@ -10,11 +10,11 @@ import { chQuery, getProfiles } from '@openpanel/db'; interface Props { projectId: string; - organizationId: string; + organizationSlug: string; } export default async function ProfileTopServer({ - organizationId, + organizationSlug, projectId, }: Props) { // Days since last event from users @@ -44,7 +44,7 @@ export default async function ProfileTopServer({ render(profile) { return ( diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx index 2f512a6d..5218a8d6 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx @@ -15,7 +15,7 @@ interface PageProps { } export default async function Page({ - params: { reportId, organizationId }, + params: { reportId, organizationId: organizationSlug }, }: PageProps) { const report = await getReportById(reportId); @@ -25,7 +25,7 @@ export default async function Page({ return ( {report.name} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx index 5c5f91b5..1711a3ac 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx @@ -10,10 +10,12 @@ interface PageProps { }; } -export default function Page({ params: { organizationId } }: PageProps) { +export default function Page({ + params: { organizationId: organizationSlug }, +}: PageProps) { return ( Unnamed report diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invites/create-invite.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invites/create-invite.tsx index 6b292339..e9933856 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invites/create-invite.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invites/create-invite.tsx @@ -33,7 +33,7 @@ interface Props { export default function CreateInvite({ projects }: Props) { const router = useRouter(); - const { organizationId: organizationSlug } = useAppParams(); + const { organizationSlug } = useAppParams(); const { register, handleSubmit, formState, reset, control } = useForm({ resolver: zodResolver(zInviteUser), diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/page.tsx index 650969b3..9793d135 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/page.tsx @@ -11,12 +11,14 @@ interface PageProps { organizationId: string; }; } -export default async function Page({ params: { organizationId } }: PageProps) { +export default async function Page({ + params: { organizationId: organizationSlug }, +}: PageProps) { const { userId } = auth(); const profile = await getUserById(userId!); return ( - +
diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx index 4b58e987..6b67f148 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx @@ -24,7 +24,7 @@ interface ListProjectsProps { clients: IServiceClientWithProject[]; } export default function ListProjects({ projects, clients }: ListProjectsProps) { - const organizationId = useAppParams().organizationId; + const { organizationSlug } = useAppParams(); return ( <> @@ -34,7 +34,7 @@ export default function ListProjects({ projects, clients }: ListProjectsProps) { icon={PlusIcon} onClick={() => pushModal('AddProject', { - organizationId, + organizationSlug, }) } > diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/page.tsx index 131a96ce..bb824179 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/page.tsx @@ -1,7 +1,7 @@ import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; import { - getClientsByOrganizationId, + getClientsByOrganizationSlug, getProjectsByOrganizationSlug, } from '@openpanel/db'; @@ -13,14 +13,16 @@ interface PageProps { }; } -export default async function Page({ params: { organizationId } }: PageProps) { +export default async function Page({ + params: { organizationId: organizationSlug }, +}: PageProps) { const [projects, clients] = await Promise.all([ - getProjectsByOrganizationSlug(organizationId), - getClientsByOrganizationId(organizationId), + getProjectsByOrganizationSlug(organizationSlug), + getClientsByOrganizationSlug(organizationSlug), ]); return ( - + ); diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/page.tsx index 350727c5..ee6b723f 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/page.tsx @@ -12,7 +12,7 @@ interface PageProps { } export default async function Page({ - params: { organizationId, projectId }, + params: { organizationId: organizationSlug, projectId }, }: PageProps) { const references = await getReferences({ where: { @@ -23,7 +23,7 @@ export default async function Page({ }); return ( - + ); diff --git a/apps/dashboard/src/app/(app)/[organizationId]/create-project.tsx b/apps/dashboard/src/app/(app)/[organizationId]/create-project.tsx index df131a3d..f154eee7 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/create-project.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/create-project.tsx @@ -36,7 +36,7 @@ export function CreateProject() { const onSubmit: SubmitHandler = (values) => { mutation.mutate({ name: values.name, - organizationId: params.organizationId, + organizationSlug: params.organizationSlug, }); }; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/page.tsx index deaeb033..83e73c10 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationId]/page.tsx @@ -16,10 +16,12 @@ interface PageProps { }; } -export default async function Page({ params: { organizationId } }: PageProps) { +export default async function Page({ + params: { organizationId: organizationSlug }, +}: PageProps) { const [organization, projects] = await Promise.all([ - getOrganizationBySlug(organizationId), - getCurrentProjects(organizationId), + getOrganizationBySlug(organizationSlug), + getCurrentProjects(organizationSlug), ]); if (!organization) { @@ -55,7 +57,7 @@ export default async function Page({ params: { organizationId } }: PageProps) { } if (projects.length === 1 && projects[0]) { - return redirect(`/${organizationId}/${projects[0].id}`); + return redirect(`/${organizationSlug}/${projects[0].id}`); } return ( diff --git a/apps/dashboard/src/components/overview/overview-share.tsx b/apps/dashboard/src/components/overview/overview-share.tsx index d10c7576..5c8933f7 100644 --- a/apps/dashboard/src/components/overview/overview-share.tsx +++ b/apps/dashboard/src/components/overview/overview-share.tsx @@ -58,9 +58,8 @@ export function OverviewShare({ data }: OverviewShareProps) { { mutation.mutate({ + ...data, public: false, - projectId: data?.projectId, - organizationId: data?.organizationSlug, password: null, }); }} diff --git a/apps/dashboard/src/hooks/useAppParams.ts b/apps/dashboard/src/hooks/useAppParams.ts index 805ac9d6..79269f62 100644 --- a/apps/dashboard/src/hooks/useAppParams.ts +++ b/apps/dashboard/src/hooks/useAppParams.ts @@ -1,16 +1,19 @@ import { useParams } from 'next/navigation'; -// eslint-disable-next-line -type AppParams = { +type AppParamsIn = { organizationId: string; projectId: string; }; +type AppParamsOut = { + organizationSlug: string; + projectId: string; +}; export function useAppParams() { - const params = useParams(); + const params = useParams(); return { ...(params ?? {}), - organizationId: params?.organizationId, + organizationSlug: params?.organizationId, projectId: params?.projectId, - } as T & AppParams; + } as T & AppParamsOut; } diff --git a/apps/dashboard/src/modals/AddClient.tsx b/apps/dashboard/src/modals/AddClient.tsx index fd5c7810..da19d258 100644 --- a/apps/dashboard/src/modals/AddClient.tsx +++ b/apps/dashboard/src/modals/AddClient.tsx @@ -43,7 +43,7 @@ interface Props { projectId: string; } export default function AddClient(props: Props) { - const { organizationId, projectId } = useAppParams(); + const { organizationSlug, projectId } = useAppParams(); const router = useRouter(); const form = useForm({ resolver: zodResolver(validation), @@ -62,14 +62,14 @@ export default function AddClient(props: Props) { }, }); const query = api.project.list.useQuery({ - organizationId, + organizationSlug, }); const onSubmit: SubmitHandler = (values) => { mutation.mutate({ name: values.name, cors: values.tab === 'website' ? values.cors : null, projectId: values.projectId, - organizationId, + organizationSlug, }); }; diff --git a/apps/dashboard/src/modals/AddDashboard.tsx b/apps/dashboard/src/modals/AddDashboard.tsx index e204981e..01ad6660 100644 --- a/apps/dashboard/src/modals/AddDashboard.tsx +++ b/apps/dashboard/src/modals/AddDashboard.tsx @@ -19,7 +19,7 @@ const validator = z.object({ type IForm = z.infer; export default function AddDashboard() { - const { projectId, organizationId: organizationSlug } = useAppParams(); + const { projectId, organizationSlug } = useAppParams(); const router = useRouter(); const { register, handleSubmit, formState } = useForm({ diff --git a/apps/dashboard/src/modals/AddProject.tsx b/apps/dashboard/src/modals/AddProject.tsx index ec6ff79c..9f6b13fc 100644 --- a/apps/dashboard/src/modals/AddProject.tsx +++ b/apps/dashboard/src/modals/AddProject.tsx @@ -17,9 +17,9 @@ const validator = z.object({ type IForm = z.infer; interface AddProjectProps { - organizationId: string; + organizationSlug: string; } -export default function AddProject({ organizationId }: AddProjectProps) { +export default function AddProject({ organizationSlug }: AddProjectProps) { const router = useRouter(); const mutation = api.project.create.useMutation({ onError: handleError, @@ -45,7 +45,7 @@ export default function AddProject({ organizationId }: AddProjectProps) { onSubmit={handleSubmit((values) => { mutation.mutate({ ...values, - organizationId, + organizationSlug, }); })} > diff --git a/apps/dashboard/src/modals/SaveReport.tsx b/apps/dashboard/src/modals/SaveReport.tsx index 6a82e9a4..8bee62c9 100644 --- a/apps/dashboard/src/modals/SaveReport.tsx +++ b/apps/dashboard/src/modals/SaveReport.tsx @@ -30,7 +30,7 @@ type IForm = z.infer; export default function SaveReport({ report }: SaveReportProps) { const router = useRouter(); - const { organizationId: organizationSlug, projectId } = useAppParams(); + const { organizationSlug, projectId } = useAppParams(); const searchParams = useSearchParams(); const dashboardId = searchParams?.get('dashboardId') ?? undefined; diff --git a/apps/dashboard/src/modals/ShareOverviewModal.tsx b/apps/dashboard/src/modals/ShareOverviewModal.tsx index 2a4114c5..15fa94e0 100644 --- a/apps/dashboard/src/modals/ShareOverviewModal.tsx +++ b/apps/dashboard/src/modals/ShareOverviewModal.tsx @@ -20,16 +20,16 @@ const validator = zShareOverview; type IForm = z.infer; export default function ShareOverviewModal() { - const { projectId, organizationId: organizationSlug } = useAppParams(); + const { projectId, organizationSlug } = useAppParams(); const router = useRouter(); - const { register, handleSubmit, formState, control } = useForm({ + const { register, handleSubmit, control } = useForm({ resolver: zodResolver(validator), defaultValues: { public: true, password: '', projectId, - organizationId: organizationSlug, + organizationSlug, }, }); diff --git a/apps/dashboard/src/trpc/api/routers/client.ts b/apps/dashboard/src/trpc/api/routers/client.ts index 0d3543c4..0d9ecdbb 100644 --- a/apps/dashboard/src/trpc/api/routers/client.ts +++ b/apps/dashboard/src/trpc/api/routers/client.ts @@ -6,35 +6,6 @@ import { hashPassword, stripTrailingSlash } from '@openpanel/common'; import { db } from '@openpanel/db'; export const clientRouter = createTRPCRouter({ - list: protectedProcedure - .input( - z.object({ - organizationId: z.string(), - }) - ) - .query(async ({ input: { organizationId } }) => { - return db.client.findMany({ - where: { - organizationSlug: organizationId, - }, - include: { - project: true, - }, - }); - }), - get: protectedProcedure - .input( - z.object({ - id: z.string(), - }) - ) - .query(({ input }) => { - return db.client.findUniqueOrThrow({ - where: { - id: input.id, - }, - }); - }), update: protectedProcedure .input( z.object({ @@ -59,7 +30,7 @@ export const clientRouter = createTRPCRouter({ z.object({ name: z.string(), projectId: z.string(), - organizationId: z.string(), + organizationSlug: z.string(), cors: z.string().nullable(), }) ) @@ -67,7 +38,7 @@ export const clientRouter = createTRPCRouter({ const secret = randomUUID(); const client = await db.client.create({ data: { - organizationSlug: input.organizationId, + organizationSlug: input.organizationSlug, projectId: input.projectId, name: input.name, secret: input.cors ? null : await hashPassword(secret), diff --git a/apps/dashboard/src/trpc/api/routers/project.ts b/apps/dashboard/src/trpc/api/routers/project.ts index af562d90..fa12c0b1 100644 --- a/apps/dashboard/src/trpc/api/routers/project.ts +++ b/apps/dashboard/src/trpc/api/routers/project.ts @@ -8,12 +8,12 @@ export const projectRouter = createTRPCRouter({ list: protectedProcedure .input( z.object({ - organizationId: z.string().nullable(), + organizationSlug: z.string().nullable(), }) ) - .query(async ({ input: { organizationId } }) => { - if (organizationId === null) return []; - return getProjectsByOrganizationSlug(organizationId); + .query(async ({ input: { organizationSlug } }) => { + if (organizationSlug === null) return []; + return getProjectsByOrganizationSlug(organizationSlug); }), update: protectedProcedure @@ -37,15 +37,15 @@ export const projectRouter = createTRPCRouter({ .input( z.object({ name: z.string().min(1), - organizationId: z.string(), + organizationSlug: z.string(), }) ) - .mutation(async ({ input }) => { + .mutation(async ({ input: { name, organizationSlug } }) => { return db.project.create({ data: { - id: await getId('project', input.name), - organizationSlug: input.organizationId, - name: input.name, + id: await getId('project', name), + organizationSlug: organizationSlug, + name: name, }, }); }), diff --git a/apps/dashboard/src/trpc/api/routers/share.ts b/apps/dashboard/src/trpc/api/routers/share.ts index 17d40c82..969d42ec 100644 --- a/apps/dashboard/src/trpc/api/routers/share.ts +++ b/apps/dashboard/src/trpc/api/routers/share.ts @@ -16,7 +16,7 @@ export const shareRouter = createTRPCRouter({ }, create: { id: uid.rnd(), - organizationSlug: input.organizationId, + organizationSlug: input.organizationSlug, projectId: input.projectId, public: input.public, password: input.password || null, diff --git a/packages/db/src/services/clients.service.ts b/packages/db/src/services/clients.service.ts index 60a39626..d0f6e3ff 100644 --- a/packages/db/src/services/clients.service.ts +++ b/packages/db/src/services/clients.service.ts @@ -8,10 +8,10 @@ export type IServiceClientWithProject = Prisma.ClientGetPayload<{ }; }>; -export async function getClientsByOrganizationId(organizationId: string) { +export async function getClientsByOrganizationSlug(organizationSlug: string) { return db.client.findMany({ where: { - organizationSlug: organizationId, + organizationSlug, }, include: { project: true, diff --git a/packages/validation/src/index.ts b/packages/validation/src/index.ts index 01713bb6..875816b7 100644 --- a/packages/validation/src/index.ts +++ b/packages/validation/src/index.ts @@ -85,7 +85,7 @@ export const zInviteUser = z.object({ }); export const zShareOverview = z.object({ - organizationId: z.string(), + organizationSlug: z.string(), projectId: z.string(), password: z.string().nullable(), public: z.boolean(), From d922c31455afd46c75e2a6437e67d71269c3ffe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Mon, 8 Apr 2024 21:49:20 +0200 Subject: [PATCH 4/6] rename folder organizationId -> organizationSlug --- .../[projectId]/dashboards/[dashboardId]/list-reports.tsx | 2 +- .../[projectId]/dashboards/[dashboardId]/page.tsx | 6 +++--- .../[projectId]/dashboards/header-dashboards.tsx | 0 .../[projectId]/dashboards/list-dashboards.tsx | 0 .../[projectId]/dashboards/page.tsx | 6 +++--- .../[projectId]/events/charts/events-per-day-chart.tsx | 0 .../event-conversions-list/event-conversions-list.tsx | 0 .../[projectId]/events/event-conversions-list/index.tsx | 0 .../[projectId]/events/event-details.tsx | 0 .../[projectId]/events/event-edit.tsx | 0 .../[projectId]/events/event-icon.tsx | 0 .../[projectId]/events/event-list-item.tsx | 0 .../[projectId]/events/event-list.tsx | 0 .../[projectId]/events/event-listener.tsx | 0 .../[projectId]/events/page.tsx | 6 +++--- .../[projectId]/layout-menu.tsx | 0 .../[projectId]/layout-organization-selector.tsx | 0 .../[projectId]/layout-project-selector.tsx | 0 .../[projectId]/layout-sidebar.tsx | 0 .../[projectId]/layout-sticky-below-header.tsx | 0 .../[projectId]/layout.tsx | 4 ++-- .../[projectId]/overview-sticky-header.tsx | 0 .../[projectId]/page-layout.tsx | 0 .../[projectId]/page.tsx | 6 +++--- .../[projectId]/profiles/[profileId]/page.tsx | 6 +++--- .../[projectId]/profiles/page.tsx | 6 +++--- .../[projectId]/profiles/profile-last-seen/index.tsx | 0 .../[projectId]/profiles/profile-list/index.tsx | 0 .../[projectId]/profiles/profile-list/profile-list.tsx | 0 .../[projectId]/profiles/profile-top/index.tsx | 0 .../[projectId]/reports/[reportId]/page.tsx | 6 +++--- .../[projectId]/reports/page.tsx | 8 +++----- .../[projectId]/reports/report-editor.tsx | 2 +- .../settings/organization/edit-organization.tsx | 0 .../settings/organization/invites/create-invite.tsx | 0 .../[projectId]/settings/organization/invites/index.tsx | 0 .../[projectId]/settings/organization/invites/invites.tsx | 0 .../[projectId]/settings/organization/members/index.tsx | 0 .../[projectId]/settings/organization/members/members.tsx | 0 .../[projectId]/settings/organization/page.tsx | 8 ++++---- .../[projectId]/settings/page.tsx | 0 .../[projectId]/settings/profile/edit-profile.tsx | 0 .../[projectId]/settings/profile/logout.tsx | 0 .../[projectId]/settings/profile/page.tsx | 6 +++--- .../[projectId]/settings/projects/list-projects.tsx | 2 +- .../[projectId]/settings/projects/page.tsx | 6 +++--- .../[projectId]/settings/references/list-references.tsx | 2 +- .../[projectId]/settings/references/page.tsx | 6 +++--- .../create-project.tsx | 0 .../{[organizationId] => [organizationSlug]}/page.tsx | 4 ++-- .../src/app/(public)/share/overview/[id]/page.tsx | 4 ++-- 51 files changed, 47 insertions(+), 49 deletions(-) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/dashboards/[dashboardId]/list-reports.tsx (97%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/dashboards/[dashboardId]/page.tsx (78%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/dashboards/header-dashboards.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/dashboards/list-dashboards.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/dashboards/page.tsx (77%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/events/charts/events-per-day-chart.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/events/event-conversions-list/event-conversions-list.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/events/event-conversions-list/index.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/events/event-details.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/events/event-edit.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/events/event-icon.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/events/event-list-item.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/events/event-list.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/events/event-listener.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/events/page.tsx (93%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/layout-menu.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/layout-organization-selector.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/layout-project-selector.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/layout-sidebar.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/layout-sticky-below-header.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/layout.tsx (94%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/overview-sticky-header.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/page-layout.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/page.tsx (93%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/profiles/[profileId]/page.tsx (97%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/profiles/page.tsx (91%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/profiles/profile-last-seen/index.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/profiles/profile-list/index.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/profiles/profile-list/profile-list.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/profiles/profile-top/index.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/reports/[reportId]/page.tsx (81%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/reports/page.tsx (68%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/reports/report-editor.tsx (97%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/organization/edit-organization.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/organization/invites/create-invite.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/organization/invites/index.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/organization/invites/invites.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/organization/members/index.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/organization/members/members.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/organization/page.tsx (79%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/page.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/profile/edit-profile.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/profile/logout.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/profile/page.tsx (78%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/projects/list-projects.tsx (97%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/projects/page.tsx (78%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/references/list-references.tsx (89%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/[projectId]/settings/references/page.tsx (74%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/create-project.tsx (100%) rename apps/dashboard/src/app/(app)/{[organizationId] => [organizationSlug]}/page.tsx (96%) diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/list-reports.tsx similarity index 97% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/list-reports.tsx index 21b87099..a259c906 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/list-reports.tsx @@ -1,6 +1,6 @@ 'use client'; -import { StickyBelowHeader } from '@/app/(app)/[organizationId]/[projectId]/layout-sticky-below-header'; +import { StickyBelowHeader } from '@/app/(app)/[organizationSlug]/[projectId]/layout-sticky-below-header'; import { useOverviewOptions } from '@/components/overview/useOverviewOptions'; import { LazyChart } from '@/components/report/chart/LazyChart'; import { Button } from '@/components/ui/button'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/page.tsx similarity index 78% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/page.tsx index 40912c64..86b3cb5a 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { notFound } from 'next/navigation'; import { getDashboardById, getReportsByDashboardId } from '@openpanel/db'; @@ -7,14 +7,14 @@ import { ListReports } from './list-reports'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; projectId: string; dashboardId: string; }; } export default async function Page({ - params: { organizationId: organizationSlug, projectId, dashboardId }, + params: { organizationSlug, projectId, dashboardId }, }: PageProps) { const [dashboard, reports] = await Promise.all([ getDashboardById(dashboardId, projectId), diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/header-dashboards.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/header-dashboards.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/header-dashboards.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/header-dashboards.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/list-dashboards.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/list-dashboards.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/page.tsx similarity index 77% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/page.tsx index e0b0f670..5058afb1 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { getDashboardsByProjectId } from '@openpanel/db'; @@ -8,12 +8,12 @@ import { ListDashboards } from './list-dashboards'; interface PageProps { params: { projectId: string; - organizationId: string; + organizationSlug: string; }; } export default async function Page({ - params: { projectId, organizationId: organizationSlug }, + params: { projectId, organizationSlug }, }: PageProps) { const dashboards = await getDashboardsByProjectId(projectId); diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/charts/events-per-day-chart.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/charts/events-per-day-chart.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/charts/events-per-day-chart.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/charts/events-per-day-chart.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/event-conversions-list.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-conversions-list/event-conversions-list.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/event-conversions-list.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-conversions-list/event-conversions-list.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/index.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-conversions-list/index.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/index.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-conversions-list/index.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-details.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-details.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-details.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-details.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-edit.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-edit.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-edit.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-edit.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-icon.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-icon.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-icon.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-icon.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-list-item.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-list-item.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-list.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-list.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-listener.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-listener.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-listener.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-listener.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/page.tsx similarity index 93% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/page.tsx index 271c286a..d3e57f5b 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { OverviewFiltersButtons } from '@/components/overview/filters/overview-filters-buttons'; import { OverviewFiltersDrawer } from '@/components/overview/filters/overview-filters-drawer'; import { @@ -17,7 +17,7 @@ import { EventList } from './event-list'; interface PageProps { params: { projectId: string; - organizationId: string; + organizationSlug: string; }; searchParams: { events?: string; @@ -31,7 +31,7 @@ const nuqsOptions = { }; export default async function Page({ - params: { projectId, organizationId: organizationSlug }, + params: { projectId, organizationSlug }, searchParams, }: PageProps) { const filters = diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-menu.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-menu.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-menu.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-menu.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-organization-selector.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-organization-selector.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-project-selector.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-project-selector.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-sidebar.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-sidebar.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sticky-below-header.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-sticky-below-header.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sticky-below-header.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-sticky-below-header.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout.tsx similarity index 94% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout.tsx index 152a3f19..79b6e68a 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout.tsx @@ -11,14 +11,14 @@ import { LayoutSidebar } from './layout-sidebar'; interface AppLayoutProps { children: React.ReactNode; params: { - organizationId: string; + organizationSlug: string; projectId: string; }; } export default async function AppLayout({ children, - params: { organizationId: organizationSlug, projectId }, + params: { organizationSlug, projectId }, }: AppLayoutProps) { const [organizations, projects, dashboards] = await Promise.all([ getCurrentOrganizations(), diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/overview-sticky-header.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/overview-sticky-header.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/overview-sticky-header.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/overview-sticky-header.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page-layout.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/page-layout.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page-layout.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/page-layout.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/page.tsx similarity index 93% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/page.tsx index a71f5ffb..55f2b36c 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { OverviewFiltersButtons } from '@/components/overview/filters/overview-filters-buttons'; import { OverviewFiltersDrawer } from '@/components/overview/filters/overview-filters-drawer'; import ServerLiveCounter from '@/components/overview/live-counter'; @@ -18,13 +18,13 @@ import { OverviewReportRange } from './overview-sticky-header'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; projectId: string; }; } export default async function Page({ - params: { organizationId: organizationSlug, projectId }, + params: { organizationSlug, projectId }, }: PageProps) { const share = await getShareByProjectId(projectId); diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/[profileId]/page.tsx similarity index 97% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/[profileId]/page.tsx index 2775862b..a30223fd 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/[profileId]/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { OverviewFiltersButtons } from '@/components/overview/filters/overview-filters-buttons'; import { OverviewFiltersDrawer } from '@/components/overview/filters/overview-filters-drawer'; import { ProfileAvatar } from '@/components/profiles/profile-avatar'; @@ -27,9 +27,9 @@ import { StickyBelowHeader } from '../../layout-sticky-below-header'; interface PageProps { params: { + organizationSlug: string; projectId: string; profileId: string; - organizationId: string; }; searchParams: { events?: string; @@ -41,7 +41,7 @@ interface PageProps { } export default async function Page({ - params: { projectId, profileId, organizationId: organizationSlug }, + params: { projectId, profileId, organizationSlug }, searchParams, }: PageProps) { const eventListOptions: GetEventListOptions = { diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/page.tsx similarity index 91% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/page.tsx index 8ca653b1..e3c71115 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { OverviewFiltersButtons } from '@/components/overview/filters/overview-filters-buttons'; import { OverviewFiltersDrawer } from '@/components/overview/filters/overview-filters-drawer'; import { eventQueryFiltersParser } from '@/hooks/useEventQueryFilters'; @@ -11,7 +11,7 @@ import ProfileTopServer from './profile-top'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; projectId: string; }; searchParams: { @@ -25,7 +25,7 @@ const nuqsOptions = { }; export default function Page({ - params: { organizationId: organizationSlug, projectId }, + params: { organizationSlug, projectId }, searchParams: { cursor, f }, }: PageProps) { return ( diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-last-seen/index.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-last-seen/index.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-last-seen/index.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-last-seen/index.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/index.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-list/index.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/index.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-list/index.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/profile-list.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-list/profile-list.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/profile-list.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-list/profile-list.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-top/index.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-top/index.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-top/index.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-top/index.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/[reportId]/page.tsx similarity index 81% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/[reportId]/page.tsx index 5218a8d6..394870bb 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/[reportId]/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { Pencil } from 'lucide-react'; import { notFound } from 'next/navigation'; @@ -8,14 +8,14 @@ import ReportEditor from '../report-editor'; interface PageProps { params: { + organizationSlug: string; projectId: string; reportId: string; - organizationId: string; }; } export default async function Page({ - params: { reportId, organizationId: organizationSlug }, + params: { reportId, organizationSlug }, }: PageProps) { const report = await getReportById(reportId); diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/page.tsx similarity index 68% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/page.tsx index 1711a3ac..537909b2 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/page.tsx @@ -1,18 +1,16 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { Pencil } from 'lucide-react'; import ReportEditor from './report-editor'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; projectId: string; }; } -export default function Page({ - params: { organizationId: organizationSlug }, -}: PageProps) { +export default function Page({ params: { organizationSlug } }: PageProps) { return ( Date: Mon, 8 Apr 2024 21:50:23 +0200 Subject: [PATCH 5/6] update useAppParams --- apps/dashboard/src/hooks/useAppParams.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/apps/dashboard/src/hooks/useAppParams.ts b/apps/dashboard/src/hooks/useAppParams.ts index 79269f62..616c7893 100644 --- a/apps/dashboard/src/hooks/useAppParams.ts +++ b/apps/dashboard/src/hooks/useAppParams.ts @@ -1,19 +1,15 @@ import { useParams } from 'next/navigation'; -type AppParamsIn = { - organizationId: string; - projectId: string; -}; -type AppParamsOut = { +type AppParams = { organizationSlug: string; projectId: string; }; export function useAppParams() { - const params = useParams(); + const params = useParams(); return { ...(params ?? {}), - organizationSlug: params?.organizationId, + organizationSlug: params?.organizationSlug, projectId: params?.projectId, - } as T & AppParamsOut; + } as T & AppParams; } From 71802dc2365242e63063ffe91729831acf53a496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Mon, 8 Apr 2024 22:04:24 +0200 Subject: [PATCH 6/6] more cleanup --- apps/api/src/index.ts | 4 ++-- .../dashboards/[dashboardId]/list-reports.tsx | 18 +++++++++++++----- .../settings/projects/list-projects.tsx | 12 +----------- apps/dashboard/src/modals/AddProject.tsx | 8 ++++---- apps/dashboard/src/modals/AddReference.tsx | 3 +-- apps/dashboard/src/modals/EditReport.tsx | 2 +- apps/public/src/app/footer.tsx | 3 +-- 7 files changed, 23 insertions(+), 27 deletions(-) diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index cd0be00d..b91cf6c2 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -33,10 +33,10 @@ const startServer = async () => { fastify.register(profileRouter, { prefix: '/profile' }); fastify.register(liveRouter, { prefix: '/live' }); fastify.register(miscRouter, { prefix: '/misc' }); - fastify.setErrorHandler((error, request, reply) => { + fastify.setErrorHandler((error) => { fastify.log.error(error); }); - fastify.get('/', (request, reply) => { + fastify.get('/', (_request, reply) => { reply.send({ name: 'openpanel sdk api' }); }); // fastify.get('/health-check', async (request, reply) => { diff --git a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/list-reports.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/list-reports.tsx index a259c906..70ba8ea3 100644 --- a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/list-reports.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/list-reports.tsx @@ -12,10 +12,12 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useAppParams } from '@/hooks/useAppParams'; +import { api, handleError } from '@/trpc/client'; import { cn } from '@/utils/cn'; import { ChevronRight, MoreHorizontal, PlusIcon, Trash } from 'lucide-react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; +import { toast } from 'sonner'; import { getDefaultIntervalByDates, @@ -33,7 +35,13 @@ export function ListReports({ reports }: ListReportsProps) { const router = useRouter(); const params = useAppParams<{ dashboardId: string }>(); const { range, startDate, endDate } = useOverviewOptions(); - + const deletion = api.report.delete.useMutation({ + onError: handleError, + onSuccess() { + router.refresh(); + toast('Report deleted'); + }, + }); return ( <> @@ -95,10 +103,10 @@ export function ListReports({ reports }: ListReportsProps) { { - // event.stopPropagation(); - // deletion.mutate({ - // reportId: report.id, - // }); + event.stopPropagation(); + deletion.mutate({ + reportId: report.id, + }); }} > diff --git a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/projects/list-projects.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/projects/list-projects.tsx index 6786f973..04f94a49 100644 --- a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/projects/list-projects.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/projects/list-projects.tsx @@ -3,7 +3,6 @@ import { StickyBelowHeader } from '@/app/(app)/[organizationSlug]/[projectId]/layout-sticky-below-header'; import { ClientActions } from '@/components/clients/client-actions'; import { ProjectActions } from '@/components/projects/project-actions'; -// import { columns } from '@/components/projects/table'; import { Accordion, AccordionContent, @@ -13,7 +12,6 @@ import { import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Button } from '@/components/ui/button'; import { Tooltiper } from '@/components/ui/tooltip'; -import { useAppParams } from '@/hooks/useAppParams'; import { pushModal } from '@/modals'; import { InfoIcon, PlusIcon, PlusSquareIcon } from 'lucide-react'; @@ -24,20 +22,12 @@ interface ListProjectsProps { clients: IServiceClientWithProject[]; } export default function ListProjects({ projects, clients }: ListProjectsProps) { - const { organizationSlug } = useAppParams(); return ( <>
- diff --git a/apps/dashboard/src/modals/AddProject.tsx b/apps/dashboard/src/modals/AddProject.tsx index 9f6b13fc..60eb71d0 100644 --- a/apps/dashboard/src/modals/AddProject.tsx +++ b/apps/dashboard/src/modals/AddProject.tsx @@ -1,6 +1,7 @@ import { ButtonContainer } from '@/components/button-container'; import { InputWithLabel } from '@/components/forms/input-with-label'; import { Button } from '@/components/ui/button'; +import { useAppParams } from '@/hooks/useAppParams'; import { api, handleError } from '@/trpc/client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useRouter } from 'next/navigation'; @@ -16,10 +17,9 @@ const validator = z.object({ }); type IForm = z.infer; -interface AddProjectProps { - organizationSlug: string; -} -export default function AddProject({ organizationSlug }: AddProjectProps) { + +export default function AddProject() { + const { organizationSlug } = useAppParams(); const router = useRouter(); const mutation = api.project.create.useMutation({ onError: handleError, diff --git a/apps/dashboard/src/modals/AddReference.tsx b/apps/dashboard/src/modals/AddReference.tsx index 1f08a84e..0bfcbf32 100644 --- a/apps/dashboard/src/modals/AddReference.tsx +++ b/apps/dashboard/src/modals/AddReference.tsx @@ -1,12 +1,11 @@ import { ButtonContainer } from '@/components/button-container'; import { InputWithLabel } from '@/components/forms/input-with-label'; import { Button } from '@/components/ui/button'; -import { Calendar } from '@/components/ui/calendar'; import { useAppParams } from '@/hooks/useAppParams'; import { api, handleError } from '@/trpc/client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useRouter } from 'next/navigation'; -import { Controller, useForm } from 'react-hook-form'; +import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import type { z } from 'zod'; diff --git a/apps/dashboard/src/modals/EditReport.tsx b/apps/dashboard/src/modals/EditReport.tsx index 35459eff..780c06fd 100644 --- a/apps/dashboard/src/modals/EditReport.tsx +++ b/apps/dashboard/src/modals/EditReport.tsx @@ -21,7 +21,7 @@ type EditReportProps = { }; export default function EditReport({ form, onSubmit }: EditReportProps) { - const { register, handleSubmit, reset, formState } = useForm({ + const { register, handleSubmit, formState } = useForm({ resolver: zodResolver(validator), defaultValues: form, }); diff --git a/apps/public/src/app/footer.tsx b/apps/public/src/app/footer.tsx index 05c203bb..b7f0c18a 100644 --- a/apps/public/src/app/footer.tsx +++ b/apps/public/src/app/footer.tsx @@ -4,11 +4,10 @@ import Image from 'next/image'; import Link from 'next/link'; import { Heading2, Lead2 } from './copy'; -import { JoinWaitlist } from './join-waitlist'; export default function Footer() { return ( -