diff --git a/.github/workflows/database-migrations-main.yml b/.github/workflows/database-migrations-main.yml index 70a94e6a0..a1a012a68 100644 --- a/.github/workflows/database-migrations-main.yml +++ b/.github/workflows/database-migrations-main.yml @@ -1,4 +1,4 @@ -name: Database Migrations Dev +name: Database Migrations Main on: push: # Runs AFTER merge to main (never during PR review!) branches: @@ -11,9 +11,18 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + - name: Apply database migrations env: DATABASE_URL: ${{ secrets.DATABASE_URL_DEV }} run: | cd packages/db - npx prisma migrate deploy + bunx prisma migrate deploy diff --git a/.github/workflows/database-migrations-release.yml b/.github/workflows/database-migrations-release.yml index 9c039e276..f44f4acf0 100644 --- a/.github/workflows/database-migrations-release.yml +++ b/.github/workflows/database-migrations-release.yml @@ -1,4 +1,4 @@ -name: Database Migrations Prod +name: Database Migrations Release on: push: # Runs AFTER merge to release (never during PR review!) branches: @@ -11,9 +11,18 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + - name: Apply database migrations env: DATABASE_URL: ${{ secrets.DATABASE_URL_PROD }} run: | cd packages/db - npx prisma migrate deploy + bunx prisma migrate deploy diff --git a/.github/workflows/trigger-tasks-deploy-main.yml b/.github/workflows/trigger-tasks-deploy-main.yml index cc4ac203e..d72173489 100644 --- a/.github/workflows/trigger-tasks-deploy-main.yml +++ b/.github/workflows/trigger-tasks-deploy-main.yml @@ -24,10 +24,11 @@ jobs: run: bunx prisma generate - name: 🚀 Deploy Trigger.dev working-directory: ./apps/app + timeout-minutes: 20 env: TRIGGER_ACCESS_TOKEN: ${{ secrets.TRIGGER_ACCESS_TOKEN }} SECRET_KEY: ${{ secrets.SECRET_KEY }} VERCEL_ACCESS_TOKEN: ${{ secrets.VERCEL_ACCESS_TOKEN }} VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} VERCEL_TEAM_ID: ${{ secrets.VERCEL_TEAM_ID }} - run: bunx trigger.dev@latest deploy --env staging + run: bunx trigger.dev@latest deploy --env staging --log-level debug diff --git a/.gitignore b/.gitignore index 3659fd5bd..f9ddfb236 100644 --- a/.gitignore +++ b/.gitignore @@ -78,4 +78,7 @@ debug-setup-page.png .playground/ -packages/*/dist \ No newline at end of file +packages/*/dist + +# Generated Prisma Client +**/src/db/generated/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 4db049d33..37789ba6a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -36,7 +36,7 @@ WORKDIR /app COPY packages/db/prisma ./packages/db/prisma # Create minimal package.json for Prisma -RUN echo '{"name":"migrator","type":"module","dependencies":{"prisma":"^6.9.0","@prisma/client":"^6.9.0"}}' > package.json +RUN echo '{"name":"migrator","type":"module","dependencies":{"prisma":"^6.13.0","@prisma/client":"^6.13.0"}}' > package.json # Install ONLY Prisma dependencies RUN bun install diff --git a/apps/app/.eslintrc.json b/apps/app/.eslintrc.json index 25cc3edfd..ab0a70296 100644 --- a/apps/app/.eslintrc.json +++ b/apps/app/.eslintrc.json @@ -1,9 +1,10 @@ { - "extends": "next/core-web-vitals", + "extends": ["next/core-web-vitals"], + "ignorePatterns": ["src/db/generated/**"], "rules": { - "react/no-unescaped-entities": "off", + "react-hooks/rules-of-hooks": "error", "react-hooks/exhaustive-deps": "warn", - "react-hooks/rules-of-hooks": "warn", + "react/no-unescaped-entities": "off", "react/display-name": "off" } } diff --git a/apps/app/.gitignore b/apps/app/.gitignore index 9f82c08fb..c0616d7c5 100644 --- a/apps/app/.gitignore +++ b/apps/app/.gitignore @@ -49,3 +49,8 @@ next-env.d.ts # Sentry Config File .env.sentry-build-plugin + +# Generated Prisma Client +prisma/generated +# Copied schema from @trycompai/db package - always generate fresh +prisma/schema.prisma diff --git a/apps/app/.prettierignore b/apps/app/.prettierignore index ef35375d4..d31f44e6c 100644 --- a/apps/app/.prettierignore +++ b/apps/app/.prettierignore @@ -1,4 +1,7 @@ # Playwright test artifacts playwright-report/ test-results/ -.playwright/ \ No newline at end of file +.playwright/ + +# Generated Prisma Client +src/db/generated/ \ No newline at end of file diff --git a/apps/app/Dockerfile_Backup b/apps/app/Dockerfile similarity index 100% rename from apps/app/Dockerfile_Backup rename to apps/app/Dockerfile diff --git a/apps/app/customPrismaExtension.ts b/apps/app/customPrismaExtension.ts index 5f625273c..5afb75c50 100644 --- a/apps/app/customPrismaExtension.ts +++ b/apps/app/customPrismaExtension.ts @@ -1,217 +1,140 @@ import { binaryForRuntime, BuildContext, BuildExtension, BuildManifest } from '@trigger.dev/build'; import assert from 'node:assert'; -import { existsSync, statSync } from 'node:fs'; -import { cp, readdir } from 'node:fs/promises'; +import { existsSync } from 'node:fs'; +import { cp } from 'node:fs/promises'; import { dirname, join, resolve } from 'node:path'; export type PrismaExtensionOptions = { - schema: string; - migrate?: boolean; version?: string; + migrate?: boolean; + directUrlEnvVarName?: string; /** - * Adds the `--sql` flag to the `prisma generate` command. This will generate the SQL files for the Prisma schema. Requires the `typedSql preview feature and prisma 5.19.0 or later. - */ - typedSql?: boolean; - /** - * The client generator to use. Set this param to prevent all generators in the prisma schema from being generated. - * - * @example - * - * ### Prisma schema - * - * ```prisma - * generator client { - * provider = "prisma-client-js" - * } - * - * generator typegraphql { - * provider = "typegraphql-prisma" - * output = "./generated/type-graphql" - * } - * ``` - * - * ### PrismaExtension - * - * ```ts - * prismaExtension({ - * schema: "./prisma/schema.prisma", - * clientGenerator: "client" - * }); - * ``` + * The version of the @trycompai/db package to use */ - clientGenerator?: string; - directUrlEnvVarName?: string; - isUsingSchemaFolder?: boolean; + dbPackageVersion?: string; }; -const BINARY_TARGET = 'linux-arm64-openssl-3.0.x'; -export function prismaExtension(options: PrismaExtensionOptions): PrismaExtension { + +export function prismaExtension(options: PrismaExtensionOptions = {}): PrismaExtension { return new PrismaExtension(options); } + export class PrismaExtension implements BuildExtension { moduleExternals: string[]; public readonly name = 'PrismaExtension'; private _resolvedSchemaPath?: string; + constructor(private options: PrismaExtensionOptions) { - this.moduleExternals = ['@prisma/client', '@prisma/engines']; + this.moduleExternals = [ + '@prisma/client', + '@prisma/engines', + '@trycompai/db', // Add the published package to externals + ]; } + externalsForTarget(target: any) { if (target === 'dev') { return []; } return this.moduleExternals; } + async onBuildStart(context: BuildContext) { if (context.target === 'dev') { return; } - // Resolve the path to the prisma schema, relative to the config.directory - let resolvedPath = resolve(context.workingDir, this.options.schema); - // Check if it's a directory; if so, look for schema.prisma inside - if (statSync(resolvedPath).isDirectory()) { - resolvedPath = join(resolvedPath, 'schema.prisma'); - this.options.isUsingSchemaFolder = true; + // Resolve the path to the schema from the published @trycompai/db package + // In a monorepo, node_modules are typically hoisted to the workspace root + // Walk up the directory tree to find the workspace root (where node_modules/@trycompai/db exists) + let workspaceRoot = context.workingDir; + let dbPackagePath = resolve(workspaceRoot, 'node_modules/@trycompai/db/dist/schema.prisma'); + + // If not found in working dir, try parent directories + while (!existsSync(dbPackagePath) && workspaceRoot !== dirname(workspaceRoot)) { + workspaceRoot = dirname(workspaceRoot); + dbPackagePath = resolve(workspaceRoot, 'node_modules/@trycompai/db/dist/schema.prisma'); } - this._resolvedSchemaPath = resolvedPath; - context.logger.debug(`Resolved the prisma schema to: ${this._resolvedSchemaPath}`); - // Check that the prisma schema exists + + this._resolvedSchemaPath = dbPackagePath; + + context.logger.debug(`Workspace root: ${workspaceRoot}`); + context.logger.debug( + `Resolved the prisma schema from @trycompai/db package to: ${this._resolvedSchemaPath}`, + ); + + // Debug: List contents of the @trycompai/db package directory + const dbPackageDir = resolve(workspaceRoot, 'node_modules/@trycompai/db'); + const dbDistDir = resolve(workspaceRoot, 'node_modules/@trycompai/db/dist'); + + try { + const { readdirSync } = require('node:fs'); + context.logger.debug(`@trycompai/db package directory contents:`, readdirSync(dbPackageDir)); + context.logger.debug(`@trycompai/db/dist directory contents:`, readdirSync(dbDistDir)); + } catch (err) { + context.logger.debug(`Failed to list directory contents:`, err); + } + + // Check that the prisma schema exists in the published package if (!existsSync(this._resolvedSchemaPath)) { throw new Error( - `PrismaExtension could not find the prisma schema at ${this._resolvedSchemaPath}. Make sure the path is correct: ${this.options.schema}, relative to the working dir ${context.workingDir}`, + `PrismaExtension could not find the prisma schema at ${this._resolvedSchemaPath}. Make sure @trycompai/db package is installed with version ${this.options.dbPackageVersion || 'latest'}`, ); } } + async onBuildComplete(context: BuildContext, manifest: BuildManifest) { if (context.target === 'dev') { return; } + assert(this._resolvedSchemaPath, 'Resolved schema path is not set'); + context.logger.debug('Looking for @prisma/client in the externals', { externals: manifest.externals, }); + const prismaExternal = manifest.externals?.find( (external) => external.name === '@prisma/client', ); const version = prismaExternal?.version ?? this.options.version; + if (!version) { throw new Error( `PrismaExtension could not determine the version of @prisma/client. It's possible that the @prisma/client was not used in the project. If this isn't the case, please provide a version in the PrismaExtension options.`, ); } - context.logger.debug(`PrismaExtension is generating the Prisma client for version ${version}`); - const usingSchemaFolder = this.options.isUsingSchemaFolder; - const commands: string[] = []; - let prismaDir: string | undefined; - const generatorFlags: string[] = []; - if (this.options.clientGenerator) { - generatorFlags.push(`--generator=${this.options.clientGenerator}`); - } - if (this.options.typedSql) { - generatorFlags.push('--sql'); - const prismaDir = usingSchemaFolder - ? dirname(dirname(this._resolvedSchemaPath)) - : dirname(this._resolvedSchemaPath); - context.logger.debug('Using typedSql'); - // Find all the files prisma/sql/*.sql - const sqlFiles = await readdir(join(prismaDir, 'sql')).then((files) => - files.filter((file) => file.endsWith('.sql')), - ); - context.logger.debug('Found sql files', { - sqlFiles, - }); - const sqlDestinationPath = join(manifest.outputPath, 'prisma', 'sql'); - for (const file of sqlFiles) { - const destination = join(sqlDestinationPath, file); - const source = join(prismaDir, 'sql', file); - context.logger.debug(`Copying the sql from ${source} to ${destination}`); - await cp(source, destination); - } - } - if (usingSchemaFolder) { - const schemaDir = dirname(this._resolvedSchemaPath); - prismaDir = dirname(schemaDir); - context.logger.debug(`Using the schema folder: ${schemaDir}`); - // Find all the files in schemaDir that end with .prisma (excluding the schema.prisma file) - const prismaFiles = await readdir(schemaDir).then((files) => - files.filter((file) => file.endsWith('.prisma')), - ); - context.logger.debug('Found prisma files in the schema folder', { - prismaFiles, - }); - const schemaDestinationPath = join(manifest.outputPath, 'prisma', 'schema'); - const allPrismaFiles = [...prismaFiles]; - - // --- NEW: Look for a 'schema' subfolder and collect .prisma files from it --- - const schemaSubDir = join(schemaDir, 'schema'); - let subDirPrismaFiles: string[] = []; - try { - const filesInSubDir = await readdir(schemaSubDir); - subDirPrismaFiles = filesInSubDir.filter((file) => file.endsWith('.prisma')); - context.logger.debug('Found prisma files in the schema subfolder', { - subDirPrismaFiles, - }); - } catch (err) { - // Ignore if the subdirectory does not exist - context.logger.debug(`No 'schema' subfolder found in ${schemaDir}`); - } - // Copy top-level .prisma files - for (const file of allPrismaFiles) { - const destination = join(schemaDestinationPath, file); - const source = join(schemaDir, file); - context.logger.debug(`Copying the prisma schema from ${source} to ${destination}`); - await cp(source, destination); - } - // Copy .prisma files from schema subdirectory - for (const file of subDirPrismaFiles) { - const destination = join(schemaDestinationPath, file); - const source = join(schemaSubDir, file); - context.logger.debug(`Copying the prisma schema from ${source} to ${destination}`); - await cp(source, destination); - } - commands.push( - `${binaryForRuntime( - manifest.runtime, - )} node_modules/prisma/build/index.js generate --schema=./prisma/schema ${generatorFlags.join( - ' ', - )}`, - ); - } else { - prismaDir = dirname(this._resolvedSchemaPath); - // Now we need to add a layer that: - // Copies the prisma schema to the build outputPath - // Adds the `prisma` CLI dependency to the dependencies - // Adds the `prisma generate` command, which generates the Prisma client - const schemaDestinationPath = join(manifest.outputPath, 'prisma', 'schema.prisma'); - // Copy the prisma schema to the build output path - context.logger.debug( - `Copying the prisma schema from ${this._resolvedSchemaPath} to ${schemaDestinationPath}`, - ); - await cp(this._resolvedSchemaPath, schemaDestinationPath); - commands.push( - `${binaryForRuntime( - manifest.runtime, - )} node_modules/prisma/build/index.js generate --schema=./prisma/schema ${generatorFlags.join( - ' ', - )}`, - ); - } + context.logger.debug( + `PrismaExtension is generating the Prisma client for version ${version} from @trycompai/db package`, + ); + + const commands: string[] = []; const env: Record = {}; + + // Copy the prisma schema from the published package to the build output path + const schemaDestinationPath = join(manifest.outputPath, 'prisma', 'schema.prisma'); + context.logger.debug( + `Copying the prisma schema from ${this._resolvedSchemaPath} to ${schemaDestinationPath}`, + ); + await cp(this._resolvedSchemaPath, schemaDestinationPath); + + // Add prisma generate command to generate the client from the copied schema + commands.push( + `${binaryForRuntime(manifest.runtime)} node_modules/prisma/build/index.js generate --schema=./prisma/schema.prisma`, + ); + + // Only handle migrations if requested if (this.options.migrate) { - // Copy the migrations directory to the build output path - const migrationsDir = join(prismaDir, 'migrations'); - const migrationsDestinationPath = join(manifest.outputPath, 'prisma', 'migrations'); context.logger.debug( - `Copying the prisma migrations from ${migrationsDir} to ${migrationsDestinationPath}`, - ); - await cp(migrationsDir, migrationsDestinationPath, { - recursive: true, - }); - commands.push( - `${binaryForRuntime(manifest.runtime)} node_modules/prisma/build/index.js migrate deploy`, + 'Migration support not implemented for published package - please handle migrations separately', ); + // You could add migration commands here if needed + // commands.push(`${binaryForRuntime(manifest.runtime)} npx prisma migrate deploy`); } + + // Set up environment variables env.DATABASE_URL = manifest.deploy.env?.DATABASE_URL; + if (this.options.directUrlEnvVarName) { env[this.options.directUrlEnvVarName] = manifest.deploy.env?.[this.options.directUrlEnvVarName] ?? @@ -225,23 +148,28 @@ export class PrismaExtension implements BuildExtension { env.DIRECT_URL = manifest.deploy.env?.DIRECT_URL; env.DIRECT_DATABASE_URL = manifest.deploy.env?.DIRECT_DATABASE_URL; } + if (!env.DATABASE_URL) { context.logger.warn( 'prismaExtension could not resolve the DATABASE_URL environment variable. Make sure you add it to your environment variables. See our docs for more info: https://trigger.dev/docs/deploy-environment-variables', ); } + context.logger.debug('Adding the prisma layer with the following commands', { commands, env, dependencies: { prisma: version, + '@trycompai/db': this.options.dbPackageVersion || 'latest', }, }); + context.addLayer({ id: 'prisma', commands, dependencies: { prisma: version, + '@trycompai/db': this.options.dbPackageVersion || 'latest', }, build: { env, diff --git a/apps/app/next.config.ts b/apps/app/next.config.ts index 0a6e9d691..c3ded24c8 100644 --- a/apps/app/next.config.ts +++ b/apps/app/next.config.ts @@ -4,6 +4,7 @@ import './src/env.mjs'; const config: NextConfig = { poweredByHeader: false, reactStrictMode: true, + transpilePackages: ['@trycompai/db'], turbopack: { resolveAlias: { underscore: 'lodash', @@ -17,7 +18,6 @@ const config: NextConfig = { }, ], }, - transpilePackages: ['@comp/ui'], logging: { fetches: { fullUrl: process.env.LOG_FETCHES === 'true', @@ -29,6 +29,9 @@ const config: NextConfig = { }, authInterrupts: true, }, + outputFileTracingIncludes: { + '/api/**/*': ['./node_modules/.prisma/client/**/*'], + }, async rewrites() { return [ { diff --git a/apps/app/package.json b/apps/app/package.json index b7ee36952..053e4cc42 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -26,7 +26,10 @@ "@nangohq/frontend": "^0.53.2", "@next/third-parties": "^15.3.1", "@number-flow/react": "^0.5.9", + "@prisma/client": "^6.13.0", "@prisma/instrumentation": "6.6.0", + "@prisma/nextjs-monorepo-workaround-plugin": "^6.13.0", + "@radix-ui/react-slot": "^1.2.3", "@react-email/components": "^0.0.41", "@react-email/render": "^1.1.2", "@react-three/drei": "^10.3.0", @@ -41,7 +44,7 @@ "@tiptap/extension-table-row": "^2.22.3", "@trigger.dev/react-hooks": "3.3.17", "@trigger.dev/sdk": "3.3.17", - "@trycompai/db": "workspace:*", + "@trycompai/db": "^1.3.0", "@types/canvas-confetti": "^1.9.0", "@types/three": "^0.177.0", "@uploadthing/react": "^7.3.0", @@ -55,6 +58,7 @@ "dub": "^0.63.6", "framer-motion": "^12.18.1", "geist": "^1.3.1", + "lucide-react": "^0.534.0", "motion": "^12.9.2", "next": "15.4.2-canary.16", "next-safe-action": "^8.0.3", @@ -64,10 +68,10 @@ "posthog-js": "^1.236.6", "posthog-node": "^4.14.0", "puppeteer-core": "^24.7.2", - "react": "^19.1.0", + "react": "^19.1.1", "react-dom": "^19.1.0", "react-email": "^4.0.15", - "react-hook-form": "^7.58.1", + "react-hook-form": "^7.61.1", "react-hotkeys-hook": "^5.1.0", "react-intersection-observer": "^9.16.0", "react-markdown": "^9.1.0", @@ -101,8 +105,10 @@ "eslint": "^9", "eslint-config-next": "15.4.2-canary.16", "fleetctl": "^4.68.1", + "glob": "^11.0.3", "jsdom": "^26.1.0", "postcss": "^8.5.4", + "prisma": "^6.13.0", "tailwindcss": "^4.1.8", "typescript": "^5.8.3", "vite-tsconfig-paths": "^5.1.4", @@ -112,7 +118,7 @@ "./src/lib/encryption": "./src/lib/encryption.ts" }, "peerDependencies": { - "react": "^19.1.0", + "react": "^19.1.1", "react-dom": "^19.1.0" }, "pnpm": { @@ -123,11 +129,13 @@ "private": true, "scripts": { "analyze-locale-usage": "bunx tsx src/locales/analyze-locale-usage.ts", - "apply-migrations": "cd ../../packages/db && bunx prisma migrate dev && cd ../../apps/app", - "build": "next build --turbopack", + "build": "next build", + "db:generate": "bun run db:getschema && prisma generate", + "db:getschema": "cp ../../node_modules/@trycompai/db/dist/schema.prisma prisma/schema.prisma", "deploy:trigger-prod": "npx trigger.dev@latest deploy", - "dev": "bun i && bun run apply-migrations && bunx concurrently --kill-others --names \"next,trigger\" --prefix-colors \"yellow,blue\" \"next dev --turbo -p 3000\" \"bun run trigger:dev\"", + "dev": "bun i && bunx concurrently --kill-others --names \"next,trigger\" --prefix-colors \"yellow,blue\" \"next dev --turbo -p 3000\" \"bun run trigger:dev\"", "lint": "next lint && prettier --check .", + "prebuild": "bun run db:generate", "start": "next start", "test": "vitest", "test:all": "./scripts/test-all.sh", diff --git a/apps/app/prisma/client.ts b/apps/app/prisma/client.ts new file mode 100644 index 000000000..a696328be --- /dev/null +++ b/apps/app/prisma/client.ts @@ -0,0 +1,7 @@ +import { PrismaClient } from '@prisma/client'; + +const globalForPrisma = global as unknown as { prisma: PrismaClient }; + +export const db = globalForPrisma.prisma || new PrismaClient(); + +if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = db; diff --git a/packages/db/src/types.ts b/apps/app/prisma/index.ts similarity index 50% rename from packages/db/src/types.ts rename to apps/app/prisma/index.ts index b329db54e..54d1c4b9c 100644 --- a/packages/db/src/types.ts +++ b/apps/app/prisma/index.ts @@ -1 +1,2 @@ export * from '@prisma/client'; +export { db } from './client'; diff --git a/apps/app/scripts/update-imports.js b/apps/app/scripts/update-imports.js new file mode 100755 index 000000000..6ab96d825 --- /dev/null +++ b/apps/app/scripts/update-imports.js @@ -0,0 +1,66 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const glob = require('glob'); + +console.log('🔄 Updating database imports to use local client...'); + +// Find all TypeScript/TSX files in src directory +const files = glob.sync('src/**/*.{ts,tsx}', { + cwd: process.cwd(), + absolute: true, +}); + +let filesUpdated = 0; + +files.forEach((filePath) => { + const content = fs.readFileSync(filePath, 'utf8'); + let newContent = content; + let hasChanges = false; + + // Pattern 1: Replace db imports to use local client + const dbImportPattern = /import\s*{\s*db\s*}\s*from\s*['"]@trycompai\/db['"];?/g; + if (dbImportPattern.test(newContent)) { + newContent = newContent.replace(dbImportPattern, "import { db } from '@/lib/db';"); + hasChanges = true; + } + + // Pattern 2: Replace type-only imports to use @prisma/client + const typeImportPattern = /import\s*(?:type\s*)?\s*{([^}]+)}\s*from\s*['"]@trycompai\/db['"];?/g; + newContent = newContent.replace(typeImportPattern, (match, types) => { + // Skip if it includes 'db' (non-type import) + if (types.includes(' db') || types.startsWith('db') || types.endsWith('db ')) { + return match; // Don't change mixed imports, they'll be handled separately + } + hasChanges = true; + return `import type { ${types} } from '@prisma/client';`; + }); + + // Pattern 3: Handle mixed imports (db + types) + const mixedImportPattern = /import\s*{\s*([^}]*db[^}]*)\s*}\s*from\s*['"]@trycompai\/db['"];?/g; + newContent = newContent.replace(mixedImportPattern, (match, imports) => { + const parts = imports.split(',').map((part) => part.trim()); + const dbImports = parts.filter((part) => part === 'db'); + const typeImports = parts.filter((part) => part !== 'db' && part !== ''); + + let replacement = ''; + if (dbImports.length > 0) { + replacement += "import { db } from '@/lib/db';\n"; + } + if (typeImports.length > 0) { + replacement += `import type { ${typeImports.join(', ')} } from '@prisma/client';`; + } + + hasChanges = true; + return replacement; + }); + + if (hasChanges) { + fs.writeFileSync(filePath, newContent); + console.log(`✅ Updated: ${filePath.replace(process.cwd() + '/', '')}`); + filesUpdated++; + } +}); + +console.log(`🎉 Updated ${filesUpdated} files!`); +console.log('📝 All imports now use local Prisma client'); diff --git a/apps/app/src/actions/add-comment.ts b/apps/app/src/actions/add-comment.ts index 391cc7cd2..40a92dbf7 100644 --- a/apps/app/src/actions/add-comment.ts +++ b/apps/app/src/actions/add-comment.ts @@ -1,8 +1,7 @@ 'use server'; import { AppError, appErrors } from '@/lib/errors'; -import { db } from '@comp/db'; -import { CommentEntityType } from '@comp/db/types'; +import { CommentEntityType, db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/actions/change-organization.ts b/apps/app/src/actions/change-organization.ts index 1203b6d55..32e768bb0 100644 --- a/apps/app/src/actions/change-organization.ts +++ b/apps/app/src/actions/change-organization.ts @@ -1,7 +1,7 @@ 'use server'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/actions/comments/__tests__/createComment.test.ts b/apps/app/src/actions/comments/__tests__/createComment.test.ts index 23c7c9562..dda7a1e1a 100644 --- a/apps/app/src/actions/comments/__tests__/createComment.test.ts +++ b/apps/app/src/actions/comments/__tests__/createComment.test.ts @@ -1,4 +1,4 @@ -import { CommentEntityType } from '@comp/db/types'; +import { CommentEntityType } from '@db'; import { beforeEach, describe, expect, it, vi } from 'vitest'; // Import the mock setup utilities first @@ -10,7 +10,7 @@ vi.mock('@/utils/auth', () => ({ auth: mockAuth, })); -vi.mock('@comp/db', () => ({ +vi.mock('@db', () => ({ db: mockDb, })); diff --git a/apps/app/src/actions/comments/__tests__/deleteComment.test.ts b/apps/app/src/actions/comments/__tests__/deleteComment.test.ts index d3b1d0b18..9dcf618e9 100644 --- a/apps/app/src/actions/comments/__tests__/deleteComment.test.ts +++ b/apps/app/src/actions/comments/__tests__/deleteComment.test.ts @@ -1,4 +1,4 @@ -import { AttachmentEntityType, CommentEntityType } from '@comp/db/types'; +import { AttachmentEntityType, CommentEntityType } from '@db'; import { beforeEach, describe, expect, it, vi } from 'vitest'; // Import the mock setup utilities first @@ -10,7 +10,7 @@ vi.mock('@/utils/auth', () => ({ auth: mockAuth, })); -vi.mock('@comp/db', () => ({ +vi.mock('@db', () => ({ db: mockDb, })); diff --git a/apps/app/src/actions/comments/__tests__/updateComment.test.ts b/apps/app/src/actions/comments/__tests__/updateComment.test.ts index fd844ab32..e77165485 100644 --- a/apps/app/src/actions/comments/__tests__/updateComment.test.ts +++ b/apps/app/src/actions/comments/__tests__/updateComment.test.ts @@ -1,4 +1,4 @@ -import { AttachmentEntityType, CommentEntityType } from '@comp/db/types'; +import { AttachmentEntityType, CommentEntityType } from '@db'; import { beforeEach, describe, expect, it, vi } from 'vitest'; // Import the mock setup utilities first @@ -10,7 +10,7 @@ vi.mock('@/utils/auth', () => ({ auth: mockAuth, })); -vi.mock('@comp/db', () => ({ +vi.mock('@db', () => ({ db: mockDb, })); diff --git a/apps/app/src/actions/comments/createComment.ts b/apps/app/src/actions/comments/createComment.ts index 3b7435fac..d4d7d415b 100644 --- a/apps/app/src/actions/comments/createComment.ts +++ b/apps/app/src/actions/comments/createComment.ts @@ -3,8 +3,7 @@ import { BUCKET_NAME, s3Client } from '@/app/s3'; import { auth } from '@/utils/auth'; import { PutObjectCommand } from '@aws-sdk/client-s3'; -import { db } from '@comp/db'; -import { AttachmentEntityType, CommentEntityType } from '@comp/db/types'; +import { AttachmentEntityType, CommentEntityType, db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/actions/comments/deleteComment.ts b/apps/app/src/actions/comments/deleteComment.ts index 30f794577..b6ce0b348 100644 --- a/apps/app/src/actions/comments/deleteComment.ts +++ b/apps/app/src/actions/comments/deleteComment.ts @@ -3,7 +3,7 @@ import { extractS3KeyFromUrl, s3Client } from '@/app/s3'; import { auth } from '@/utils/auth'; import { DeleteObjectCommand } from '@aws-sdk/client-s3'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/actions/comments/deleteCommentAttachment.ts b/apps/app/src/actions/comments/deleteCommentAttachment.ts index cd9cafc1e..9d2d1f294 100644 --- a/apps/app/src/actions/comments/deleteCommentAttachment.ts +++ b/apps/app/src/actions/comments/deleteCommentAttachment.ts @@ -3,8 +3,7 @@ import { authActionClient } from '@/actions/safe-action'; import { BUCKET_NAME, extractS3KeyFromUrl, s3Client } from '@/app/s3'; import { DeleteObjectCommand } from '@aws-sdk/client-s3'; -import { db } from '@comp/db'; -import { AttachmentEntityType } from '@comp/db/types'; +import { AttachmentEntityType, db } from '@db'; import { revalidatePath } from 'next/cache'; import { z } from 'zod'; diff --git a/apps/app/src/actions/comments/getCommentAttachmentUrl.ts b/apps/app/src/actions/comments/getCommentAttachmentUrl.ts index c33c26b4e..0d2ff4431 100644 --- a/apps/app/src/actions/comments/getCommentAttachmentUrl.ts +++ b/apps/app/src/actions/comments/getCommentAttachmentUrl.ts @@ -4,8 +4,7 @@ import { BUCKET_NAME, extractS3KeyFromUrl, s3Client } from '@/app/s3'; import { auth } from '@/utils/auth'; import { GetObjectCommand } from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; -import { db } from '@comp/db'; -import { AttachmentEntityType } from '@comp/db/types'; +import { AttachmentEntityType, db } from '@db'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/actions/comments/updateComment.ts b/apps/app/src/actions/comments/updateComment.ts index 7987a0b86..1abe3b3b1 100644 --- a/apps/app/src/actions/comments/updateComment.ts +++ b/apps/app/src/actions/comments/updateComment.ts @@ -3,8 +3,7 @@ import { BUCKET_NAME, extractS3KeyFromUrl, s3Client } from '@/app/s3'; import { auth } from '@/utils/auth'; import { DeleteObjectCommand } from '@aws-sdk/client-s3'; -import { db } from '@comp/db'; -import { AttachmentEntityType, Comment } from '@comp/db/types'; +import { AttachmentEntityType, Comment, db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/actions/context-hub/create-context-entry-action.ts b/apps/app/src/actions/context-hub/create-context-entry-action.ts index d76be1001..261ed96de 100644 --- a/apps/app/src/actions/context-hub/create-context-entry-action.ts +++ b/apps/app/src/actions/context-hub/create-context-entry-action.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { authActionClient } from '../safe-action'; diff --git a/apps/app/src/actions/context-hub/delete-context-entry-action.ts b/apps/app/src/actions/context-hub/delete-context-entry-action.ts index a1a8fc580..a04488d35 100644 --- a/apps/app/src/actions/context-hub/delete-context-entry-action.ts +++ b/apps/app/src/actions/context-hub/delete-context-entry-action.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { authActionClient } from '../safe-action'; diff --git a/apps/app/src/actions/context-hub/update-context-entry-action.ts b/apps/app/src/actions/context-hub/update-context-entry-action.ts index 17c3bf38a..a7c103b88 100644 --- a/apps/app/src/actions/context-hub/update-context-entry-action.ts +++ b/apps/app/src/actions/context-hub/update-context-entry-action.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { authActionClient } from '../safe-action'; diff --git a/apps/app/src/actions/files/upload-file.ts b/apps/app/src/actions/files/upload-file.ts index de316ed35..6b5e3d377 100644 --- a/apps/app/src/actions/files/upload-file.ts +++ b/apps/app/src/actions/files/upload-file.ts @@ -4,8 +4,7 @@ import { BUCKET_NAME, s3Client } from '@/app/s3'; import { auth } from '@/utils/auth'; import { GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; -import { db } from '@comp/db'; -import { AttachmentEntityType, AttachmentType } from '@comp/db/types'; +import { AttachmentEntityType, AttachmentType, db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/actions/integrations/delete-integration-connection.ts b/apps/app/src/actions/integrations/delete-integration-connection.ts index cc272224e..d47db08c9 100644 --- a/apps/app/src/actions/integrations/delete-integration-connection.ts +++ b/apps/app/src/actions/integrations/delete-integration-connection.ts @@ -2,7 +2,7 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { authActionClient } from '../safe-action'; import { deleteIntegrationConnectionSchema } from '../schema'; diff --git a/apps/app/src/actions/integrations/update-integration-settings-action.ts b/apps/app/src/actions/integrations/update-integration-settings-action.ts index e12c20036..e4e2a6d2b 100644 --- a/apps/app/src/actions/integrations/update-integration-settings-action.ts +++ b/apps/app/src/actions/integrations/update-integration-settings-action.ts @@ -1,7 +1,7 @@ 'use server'; import { encrypt } from '@/lib/encryption'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { z } from 'zod'; import { authActionClient } from '../safe-action'; diff --git a/apps/app/src/actions/organization/accept-invitation.ts b/apps/app/src/actions/organization/accept-invitation.ts index 9b6124b93..e80edd1f9 100644 --- a/apps/app/src/actions/organization/accept-invitation.ts +++ b/apps/app/src/actions/organization/accept-invitation.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { Resend } from 'resend'; import { z } from 'zod'; diff --git a/apps/app/src/actions/organization/add-frameworks-to-organization-action.ts b/apps/app/src/actions/organization/add-frameworks-to-organization-action.ts index e97caa53b..37068764e 100644 --- a/apps/app/src/actions/organization/add-frameworks-to-organization-action.ts +++ b/apps/app/src/actions/organization/add-frameworks-to-organization-action.ts @@ -1,8 +1,7 @@ 'use server'; import { addFrameworksSchema } from '@/actions/schema'; -import { db } from '@comp/db'; -import { Prisma } from '@comp/db/types'; +import { db, Prisma } from '@db'; import { authWithOrgAccessClient } from '../safe-action'; import { _upsertOrgFrameworkStructureCore } from './lib/initialize-organization'; diff --git a/apps/app/src/actions/organization/create-api-key-action.ts b/apps/app/src/actions/organization/create-api-key-action.ts index f7c3d115b..3b9389368 100644 --- a/apps/app/src/actions/organization/create-api-key-action.ts +++ b/apps/app/src/actions/organization/create-api-key-action.ts @@ -3,7 +3,7 @@ import { authActionClient } from '@/actions/safe-action'; import { apiKeySchema } from '@/actions/schema'; import { generateApiKey, generateSalt, hashApiKey } from '@/lib/api-key'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; export const createApiKeyAction = authActionClient diff --git a/apps/app/src/actions/organization/delete-organization-action.ts b/apps/app/src/actions/organization/delete-organization-action.ts index c559641ee..232f301d4 100644 --- a/apps/app/src/actions/organization/delete-organization-action.ts +++ b/apps/app/src/actions/organization/delete-organization-action.ts @@ -2,7 +2,7 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { authActionClient } from '../safe-action'; import { deleteOrganizationSchema } from '../schema'; diff --git a/apps/app/src/actions/organization/get-api-keys-action.ts b/apps/app/src/actions/organization/get-api-keys-action.ts index 71a8bb5d5..85149c4e7 100644 --- a/apps/app/src/actions/organization/get-api-keys-action.ts +++ b/apps/app/src/actions/organization/get-api-keys-action.ts @@ -2,7 +2,7 @@ import type { ActionResponse } from '@/actions/types'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; export const getApiKeysAction = async (): Promise< diff --git a/apps/app/src/actions/organization/get-organization-users-action.ts b/apps/app/src/actions/organization/get-organization-users-action.ts index d6b66a31c..dcd33e6a8 100644 --- a/apps/app/src/actions/organization/get-organization-users-action.ts +++ b/apps/app/src/actions/organization/get-organization-users-action.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { authActionClient } from '../safe-action'; interface User { diff --git a/apps/app/src/actions/organization/lib/get-framework-names.ts b/apps/app/src/actions/organization/lib/get-framework-names.ts index 782d2c820..5e6b8eab8 100644 --- a/apps/app/src/actions/organization/lib/get-framework-names.ts +++ b/apps/app/src/actions/organization/lib/get-framework-names.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; /** * Fetch framework names by IDs and convert them to lowercase with no spaces diff --git a/apps/app/src/actions/organization/lib/initialize-organization.ts b/apps/app/src/actions/organization/lib/initialize-organization.ts index f42fbb2f4..6eff295be 100644 --- a/apps/app/src/actions/organization/lib/initialize-organization.ts +++ b/apps/app/src/actions/organization/lib/initialize-organization.ts @@ -1,5 +1,4 @@ -import { db } from '@comp/db'; -import { Prisma } from '@comp/db/types'; +import { db, Prisma } from '@db'; // Define a type for FrameworkEditorFramework with requirements included // This assumes FrameworkEditorFramework and FrameworkEditorRequirement are valid Prisma types. diff --git a/apps/app/src/actions/organization/remove-employee.ts b/apps/app/src/actions/organization/remove-employee.ts index 0e77992ad..9387ec46b 100644 --- a/apps/app/src/actions/organization/remove-employee.ts +++ b/apps/app/src/actions/organization/remove-employee.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; import { authActionClient } from '../safe-action'; diff --git a/apps/app/src/actions/organization/revoke-api-key-action.ts b/apps/app/src/actions/organization/revoke-api-key-action.ts index 67f2ec3b7..f3a4d6e6c 100644 --- a/apps/app/src/actions/organization/revoke-api-key-action.ts +++ b/apps/app/src/actions/organization/revoke-api-key-action.ts @@ -1,7 +1,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { z } from 'zod'; diff --git a/apps/app/src/actions/organization/update-organization-name-action.ts b/apps/app/src/actions/organization/update-organization-name-action.ts index 52b35a9e8..24b402f0c 100644 --- a/apps/app/src/actions/organization/update-organization-name-action.ts +++ b/apps/app/src/actions/organization/update-organization-name-action.ts @@ -2,7 +2,7 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { authActionClient } from '../safe-action'; import { organizationNameSchema } from '../schema'; diff --git a/apps/app/src/actions/organization/update-organization-website-action.ts b/apps/app/src/actions/organization/update-organization-website-action.ts index d7561adfd..fbcf37869 100644 --- a/apps/app/src/actions/organization/update-organization-website-action.ts +++ b/apps/app/src/actions/organization/update-organization-website-action.ts @@ -2,7 +2,7 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { authActionClient } from '../safe-action'; import { organizationWebsiteSchema } from '../schema'; diff --git a/apps/app/src/actions/policies/accept-requested-policy-changes.ts b/apps/app/src/actions/policies/accept-requested-policy-changes.ts index 205c9b5a9..554299c30 100644 --- a/apps/app/src/actions/policies/accept-requested-policy-changes.ts +++ b/apps/app/src/actions/policies/accept-requested-policy-changes.ts @@ -1,7 +1,6 @@ 'use server'; -import { db } from '@comp/db'; -import { PolicyStatus } from '@comp/db/types'; +import { db, PolicyStatus } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; import { authActionClient } from '../safe-action'; diff --git a/apps/app/src/actions/policies/archive-policy.ts b/apps/app/src/actions/policies/archive-policy.ts index d22301fad..48dd1bf26 100644 --- a/apps/app/src/actions/policies/archive-policy.ts +++ b/apps/app/src/actions/policies/archive-policy.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; import { authActionClient } from '../safe-action'; diff --git a/apps/app/src/actions/policies/create-new-policy.ts b/apps/app/src/actions/policies/create-new-policy.ts index 344f40aa3..9f7e75a82 100644 --- a/apps/app/src/actions/policies/create-new-policy.ts +++ b/apps/app/src/actions/policies/create-new-policy.ts @@ -1,7 +1,6 @@ 'use server'; -import { db } from '@comp/db'; -import { Departments, Frequency } from '@comp/db/types'; +import { db, Departments, Frequency } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { authActionClient } from '../safe-action'; import { createPolicySchema } from '../schema'; diff --git a/apps/app/src/actions/policies/delete-policy.ts b/apps/app/src/actions/policies/delete-policy.ts index ea147b219..436c310fe 100644 --- a/apps/app/src/actions/policies/delete-policy.ts +++ b/apps/app/src/actions/policies/delete-policy.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; import { authActionClient } from '../safe-action'; diff --git a/apps/app/src/actions/policies/deny-requested-policy-changes.ts b/apps/app/src/actions/policies/deny-requested-policy-changes.ts index 66b047fd1..5c937edbe 100644 --- a/apps/app/src/actions/policies/deny-requested-policy-changes.ts +++ b/apps/app/src/actions/policies/deny-requested-policy-changes.ts @@ -1,7 +1,6 @@ 'use server'; -import { db } from '@comp/db'; -import { PolicyStatus } from '@comp/db/types'; +import { db, PolicyStatus } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; import { authActionClient } from '../safe-action'; diff --git a/apps/app/src/actions/policies/submit-policy-for-approval-action.ts b/apps/app/src/actions/policies/submit-policy-for-approval-action.ts index 87aafdc89..214046415 100644 --- a/apps/app/src/actions/policies/submit-policy-for-approval-action.ts +++ b/apps/app/src/actions/policies/submit-policy-for-approval-action.ts @@ -1,7 +1,6 @@ 'use server'; -import { db } from '@comp/db'; -import { PolicyStatus } from '@comp/db/types'; +import { db, PolicyStatus } from '@db'; import { revalidatePath } from 'next/cache'; import { authActionClient } from '../safe-action'; import { updatePolicyFormSchema } from '../schema'; diff --git a/apps/app/src/actions/policies/update-policy-action.ts b/apps/app/src/actions/policies/update-policy-action.ts index 759822cf1..940885d85 100644 --- a/apps/app/src/actions/policies/update-policy-action.ts +++ b/apps/app/src/actions/policies/update-policy-action.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { logger } from '@trigger.dev/sdk/v3'; import { revalidatePath, revalidateTag } from 'next/cache'; import { authActionClient } from '../safe-action'; diff --git a/apps/app/src/actions/policies/update-policy-form-action.ts b/apps/app/src/actions/policies/update-policy-form-action.ts index 63b352cb5..cc6dc6e9c 100644 --- a/apps/app/src/actions/policies/update-policy-form-action.ts +++ b/apps/app/src/actions/policies/update-policy-form-action.ts @@ -2,8 +2,7 @@ 'use server'; -import { db } from '@comp/db'; -import { PolicyStatus } from '@comp/db/types'; +import { db, PolicyStatus } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { authActionClient } from '../safe-action'; import { updatePolicyFormSchema } from '../schema'; diff --git a/apps/app/src/actions/policies/update-policy-overview-action.ts b/apps/app/src/actions/policies/update-policy-overview-action.ts index 8b555b0e6..59f363768 100644 --- a/apps/app/src/actions/policies/update-policy-overview-action.ts +++ b/apps/app/src/actions/policies/update-policy-overview-action.ts @@ -2,7 +2,7 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { authActionClient } from '../safe-action'; import { updatePolicyOverviewSchema } from '../schema'; diff --git a/apps/app/src/actions/risk/create-risk-action.ts b/apps/app/src/actions/risk/create-risk-action.ts index ae8519e04..29eb5a03c 100644 --- a/apps/app/src/actions/risk/create-risk-action.ts +++ b/apps/app/src/actions/risk/create-risk-action.ts @@ -2,8 +2,7 @@ 'use server'; -import { db } from '@comp/db'; -import { Impact, Likelihood } from '@comp/db/types'; +import { db, Impact, Likelihood } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { authActionClient } from '../safe-action'; import { createRiskSchema } from '../schema'; diff --git a/apps/app/src/actions/risk/task/update-task-action.ts b/apps/app/src/actions/risk/task/update-task-action.ts index c6572ca16..dd185312a 100644 --- a/apps/app/src/actions/risk/task/update-task-action.ts +++ b/apps/app/src/actions/risk/task/update-task-action.ts @@ -2,8 +2,8 @@ 'use server'; -import { db } from '@comp/db'; -import type { TaskStatus } from '@comp/db/types'; +import type { TaskStatus } from '@db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { authActionClient } from '../../safe-action'; import { updateTaskSchema } from '../../schema'; diff --git a/apps/app/src/actions/risk/update-inherent-risk-action.ts b/apps/app/src/actions/risk/update-inherent-risk-action.ts index 78edc8e15..b21f5f27e 100644 --- a/apps/app/src/actions/risk/update-inherent-risk-action.ts +++ b/apps/app/src/actions/risk/update-inherent-risk-action.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { authActionClient } from '../safe-action'; import { updateInherentRiskSchema } from '../schema'; diff --git a/apps/app/src/actions/risk/update-residual-risk-action.ts b/apps/app/src/actions/risk/update-residual-risk-action.ts index 4dab87dbb..d7b8101db 100644 --- a/apps/app/src/actions/risk/update-residual-risk-action.ts +++ b/apps/app/src/actions/risk/update-residual-risk-action.ts @@ -1,7 +1,6 @@ 'use server'; -import { db } from '@comp/db'; -import { Impact, Likelihood } from '@prisma/client'; +import { db, Impact, Likelihood } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { authActionClient } from '../safe-action'; import { updateResidualRiskSchema } from '../schema'; diff --git a/apps/app/src/actions/risk/update-residual-risk-enum-action.ts b/apps/app/src/actions/risk/update-residual-risk-enum-action.ts index d7e7f3b4c..12adc136d 100644 --- a/apps/app/src/actions/risk/update-residual-risk-enum-action.ts +++ b/apps/app/src/actions/risk/update-residual-risk-enum-action.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { authActionClient } from '../safe-action'; import { updateResidualRiskEnumSchema } from '../schema'; // Use the new enum schema diff --git a/apps/app/src/actions/risk/update-risk-action.ts b/apps/app/src/actions/risk/update-risk-action.ts index 9edcafcfd..69809efef 100644 --- a/apps/app/src/actions/risk/update-risk-action.ts +++ b/apps/app/src/actions/risk/update-risk-action.ts @@ -2,7 +2,7 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { authActionClient } from '../safe-action'; import { updateRiskSchema } from '../schema'; diff --git a/apps/app/src/actions/safe-action.ts b/apps/app/src/actions/safe-action.ts index 007bc1429..44e935b67 100644 --- a/apps/app/src/actions/safe-action.ts +++ b/apps/app/src/actions/safe-action.ts @@ -2,9 +2,8 @@ import { track } from '@/app/posthog'; import { env } from '@/env.mjs'; import { auth } from '@/utils/auth'; import { logger } from '@/utils/logger'; -import { db } from '@comp/db'; -import { AuditLogEntityType } from '@comp/db/types'; import { client } from '@comp/kv'; +import { AuditLogEntityType, db } from '@db'; import { Ratelimit } from '@upstash/ratelimit'; import { DEFAULT_SERVER_ERROR_MESSAGE, createSafeActionClient } from 'next-safe-action'; import { revalidatePath } from 'next/cache'; diff --git a/apps/app/src/actions/schema.ts b/apps/app/src/actions/schema.ts index bf7d07325..ddf56f891 100644 --- a/apps/app/src/actions/schema.ts +++ b/apps/app/src/actions/schema.ts @@ -8,7 +8,7 @@ import { RiskCategory, RiskStatus, TaskStatus, -} from '@comp/db/types'; +} from '@db'; import { z } from 'zod'; export const organizationSchema = z.object({ diff --git a/apps/app/src/app/(app)/[orgId]/components/OnboardingTracker.tsx b/apps/app/src/app/(app)/[orgId]/components/OnboardingTracker.tsx index 6e53f18c3..590596ab6 100644 --- a/apps/app/src/app/(app)/[orgId]/components/OnboardingTracker.tsx +++ b/apps/app/src/app/(app)/[orgId]/components/OnboardingTracker.tsx @@ -1,8 +1,8 @@ 'use client'; import { LogoSpinner } from '@/components/logo-spinner'; -import type { Onboarding } from '@comp/db/types'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@comp/ui/card'; +import type { Onboarding } from '@db'; import { useRealtimeRun } from '@trigger.dev/react-hooks'; import { AnimatePresence, motion } from 'framer-motion'; import { AlertTriangle, Rocket, ShieldAlert, Zap } from 'lucide-react'; @@ -42,15 +42,13 @@ export const OnboardingTracker = ({ const [currentMessageIndex, setCurrentMessageIndex] = useState(0); const triggerJobId = onboarding.triggerJobId; - if (!triggerJobId || !publicAccessToken) { - return
Unable to load onboarding tracker.
; - } - - const { run, error } = useRealtimeRun(triggerJobId, { + const { run, error } = useRealtimeRun(triggerJobId || '', { accessToken: publicAccessToken, }); useEffect(() => { + if (!triggerJobId || !publicAccessToken) return; + let interval: NodeJS.Timeout; if (run && IN_PROGRESS_STATUSES.includes(run.status)) { interval = setInterval(() => { @@ -60,7 +58,11 @@ export const OnboardingTracker = ({ setCurrentMessageIndex(0); // Reset when not in progress } return () => clearInterval(interval); - }, [run?.status]); + }, [run, triggerJobId, publicAccessToken]); + + if (!triggerJobId || !publicAccessToken) { + return
Unable to load onboarding tracker.
; + } if (!triggerJobId) { return ( diff --git a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/actions/delete-control.ts b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/actions/delete-control.ts index 1c2f41582..fd92bd9cd 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/actions/delete-control.ts +++ b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/actions/delete-control.ts @@ -1,7 +1,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/ControlDeleteDialog.tsx b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/ControlDeleteDialog.tsx index 1900f5904..b9e77bd38 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/ControlDeleteDialog.tsx +++ b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/ControlDeleteDialog.tsx @@ -1,7 +1,6 @@ 'use client'; import { deleteControlAction } from '@/app/(app)/[orgId]/controls/[controlId]/actions/delete-control'; -import { Control } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Dialog, @@ -12,6 +11,7 @@ import { DialogTitle, } from '@comp/ui/dialog'; import { Form } from '@comp/ui/form'; +import { Control } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; import { Trash2 } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; diff --git a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/PoliciesTable.tsx b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/PoliciesTable.tsx index 86b56abe3..0f0c7aa21 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/PoliciesTable.tsx +++ b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/PoliciesTable.tsx @@ -4,9 +4,9 @@ import { DataTable } from '@/components/data-table/data-table'; import { DataTableColumnHeader } from '@/components/data-table/data-table-column-header'; import { StatusIndicator } from '@/components/status-indicator'; import { useDataTable } from '@/hooks/use-data-table'; -import { Policy } from '@comp/db/types'; import { Icons } from '@comp/ui/icons'; import { Input } from '@comp/ui/input'; +import { Policy } from '@db'; import { ColumnDef } from '@tanstack/react-table'; import { useMemo, useState } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/RequirementsTable.tsx b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/RequirementsTable.tsx index 31acdd945..1a8be77fb 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/RequirementsTable.tsx +++ b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/RequirementsTable.tsx @@ -3,14 +3,14 @@ import { DataTable } from '@/components/data-table/data-table'; import { DataTableColumnHeader } from '@/components/data-table/data-table-column-header'; import { useDataTable } from '@/hooks/use-data-table'; +import { Icons } from '@comp/ui/icons'; +import { Input } from '@comp/ui/input'; import type { FrameworkEditorFramework, FrameworkEditorRequirement, FrameworkInstance, RequirementMap, -} from '@comp/db/types'; -import { Icons } from '@comp/ui/icons'; -import { Input } from '@comp/ui/input'; +} from '@db'; import { ColumnDef } from '@tanstack/react-table'; import { useMemo, useState } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/SingleControl.tsx b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/SingleControl.tsx index a507707e3..737f34c03 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/SingleControl.tsx +++ b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/SingleControl.tsx @@ -1,15 +1,6 @@ 'use client'; import { StatusIndicator } from '@/components/status-indicator'; -import type { - Control, - FrameworkEditorFramework, - FrameworkEditorRequirement, - FrameworkInstance, - Policy, - RequirementMap, - Task, -} from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { DropdownMenu, @@ -18,6 +9,15 @@ import { DropdownMenuTrigger, } from '@comp/ui/dropdown-menu'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@comp/ui/tabs'; +import type { + Control, + FrameworkEditorFramework, + FrameworkEditorRequirement, + FrameworkInstance, + Policy, + RequirementMap, + Task, +} from '@db'; import { MoreVertical, Trash2 } from 'lucide-react'; import { useParams } from 'next/navigation'; import { useMemo, useState } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/TasksTable.tsx b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/TasksTable.tsx index 2ca9e09e1..ac56bbceb 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/TasksTable.tsx +++ b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/TasksTable.tsx @@ -4,9 +4,9 @@ import { DataTable } from '@/components/data-table/data-table'; import { DataTableColumnHeader } from '@/components/data-table/data-table-column-header'; import { StatusIndicator } from '@/components/status-indicator'; import { useDataTable } from '@/hooks/use-data-table'; -import { Task } from '@comp/db/types'; import { Icons } from '@comp/ui/icons'; import { Input } from '@comp/ui/input'; +import { Task } from '@db'; import { ColumnDef } from '@tanstack/react-table'; import { useMemo, useState } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/table/ControlRequirementsTable.tsx b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/table/ControlRequirementsTable.tsx index a39954400..64e52dbea 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/table/ControlRequirementsTable.tsx +++ b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/components/table/ControlRequirementsTable.tsx @@ -2,8 +2,8 @@ import { flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; -import type { FrameworkEditorRequirement, Policy, Task } from '@comp/db/types'; import { Table, TableBody, TableCell, TableRow } from '@comp/ui/table'; +import type { FrameworkEditorRequirement, Policy, Task } from '@db'; import { useParams, useRouter } from 'next/navigation'; import { ControlRequirementsTableColumns } from './ControlRequirementsTableColumns'; import { ControlRequirementsTableHeader } from './ControlRequirementsTableHeader'; diff --git a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getControl.ts b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getControl.ts index 88b7d4490..206d905ae 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getControl.ts +++ b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getControl.ts @@ -1,5 +1,5 @@ import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; export const getControl = async (id: string) => { diff --git a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getOrganizationControlProgress.ts b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getOrganizationControlProgress.ts index 3d1f58f1a..0668dd8d0 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getOrganizationControlProgress.ts +++ b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getOrganizationControlProgress.ts @@ -1,7 +1,7 @@ 'use server'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; export interface ControlProgressResponse { diff --git a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getRelatedPolicies.ts b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getRelatedPolicies.ts index fe0bfaf1b..10e07648f 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getRelatedPolicies.ts +++ b/apps/app/src/app/(app)/[orgId]/controls/[controlId]/data/getRelatedPolicies.ts @@ -1,8 +1,7 @@ 'use server'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import { Policy } from '@comp/db/types'; +import { db, Policy } from '@db'; import { headers } from 'next/headers'; interface GetRelatedPoliciesParams { diff --git a/apps/app/src/app/(app)/[orgId]/controls/data/queries.ts b/apps/app/src/app/(app)/[orgId]/controls/data/queries.ts index 5242198c5..67f736b83 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/data/queries.ts +++ b/apps/app/src/app/(app)/[orgId]/controls/data/queries.ts @@ -1,8 +1,7 @@ import 'server-only'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import { Prisma } from '@prisma/client'; +import { db, Prisma } from '@db'; import { headers } from 'next/headers'; // import { cache } from "react"; // Already handled: ensure it stays removed or remove if re-introduced import type { GetControlSchema } from './validations'; diff --git a/apps/app/src/app/(app)/[orgId]/controls/data/validations.ts b/apps/app/src/app/(app)/[orgId]/controls/data/validations.ts index 823b9c697..8720ee45c 100644 --- a/apps/app/src/app/(app)/[orgId]/controls/data/validations.ts +++ b/apps/app/src/app/(app)/[orgId]/controls/data/validations.ts @@ -1,5 +1,5 @@ import { getFiltersStateParser, getSortingStateParser } from '@/lib/parsers'; -import { Control } from '@comp/db/types'; +import { Control } from '@db'; import { createSearchParamsCache, parseAsArrayOf, diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/actions/delete-framework.ts b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/actions/delete-framework.ts index 5a734fe50..fb12ad4cc 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/actions/delete-framework.ts +++ b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/actions/delete-framework.ts @@ -1,7 +1,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/FrameworkOverview.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/FrameworkOverview.tsx index 500231a90..975c5384c 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/FrameworkOverview.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/FrameworkOverview.tsx @@ -1,6 +1,5 @@ 'use client'; -import { Control, Task } from '@comp/db/types'; import { Badge } from '@comp/ui/badge'; import { Button } from '@comp/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@comp/ui/card'; @@ -12,6 +11,7 @@ import { DropdownMenuTrigger, } from '@comp/ui/dropdown-menu'; import { Progress } from '@comp/ui/progress'; +import { Control, Task } from '@db'; import { BarChart3, MoreVertical, Target, Trash2 } from 'lucide-react'; import { useState } from 'react'; import { getControlStatus } from '../../lib/utils'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/FrameworkRequirements.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/FrameworkRequirements.tsx index 56cefeea7..af2626a21 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/FrameworkRequirements.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/FrameworkRequirements.tsx @@ -4,7 +4,7 @@ import { DataTable } from '@/components/data-table/data-table'; import { DataTableColumnHeader } from '@/components/data-table/data-table-column-header'; import { DataTableToolbar } from '@/components/data-table/data-table-toolbar'; import { useDataTable } from '@/hooks/use-data-table'; -import type { FrameworkEditorRequirement } from '@comp/db/types'; +import type { FrameworkEditorRequirement } from '@db'; import { ColumnDef } from '@tanstack/react-table'; import { useParams } from 'next/navigation'; import { useMemo } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/table/FrameworkControlsTableColumns.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/table/FrameworkControlsTableColumns.tsx index 1460bc689..4f9f7acac 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/table/FrameworkControlsTableColumns.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/table/FrameworkControlsTableColumns.tsx @@ -1,8 +1,8 @@ 'use client'; import { StatusIndicator, StatusType } from '@/components/status-indicator'; -import type { Policy } from '@comp/db/types'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@comp/ui/tooltip'; +import type { Policy } from '@db'; import type { ColumnDef } from '@tanstack/react-table'; import Link from 'next/link'; import { useParams } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/page.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/page.tsx index 468c4a84f..785c49d5e 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/page.tsx @@ -1,5 +1,5 @@ import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; import PageWithBreadcrumb from '../../../../../components/pages/PageWithBreadcrumb'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/RequirementControls.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/RequirementControls.tsx index 2d35960ff..1bde771dd 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/RequirementControls.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/RequirementControls.tsx @@ -1,6 +1,6 @@ 'use client'; -import type { Control, FrameworkEditorRequirement, RequirementMap, Task } from '@comp/db/types'; +import type { Control, FrameworkEditorRequirement, RequirementMap, Task } from '@db'; import { RequirementControlsTable } from './table/RequirementControlsTable'; interface RequirementControlsProps { diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/table/RequirementControlsTable.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/table/RequirementControlsTable.tsx index 9ab78fd3c..5307600d9 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/table/RequirementControlsTable.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/table/RequirementControlsTable.tsx @@ -3,8 +3,8 @@ import { DataTable } from '@/components/data-table/data-table'; import { DataTableColumnHeader } from '@/components/data-table/data-table-column-header'; import { useDataTable } from '@/hooks/use-data-table'; -import type { Control, Task } from '@comp/db/types'; import { Input } from '@comp/ui/input'; +import type { Control, Task } from '@db'; import { ColumnDef } from '@tanstack/react-table'; import Link from 'next/link'; import { useParams } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/table/RequirementControlsTableColumns.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/table/RequirementControlsTableColumns.tsx index 68bf8b9c2..95eba77d2 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/table/RequirementControlsTableColumns.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/table/RequirementControlsTableColumns.tsx @@ -2,8 +2,8 @@ import { StatusIndicator } from '@/components/status-indicator'; import { isPolicyCompleted } from '@/lib/control-compliance'; -import type { Control, Policy, Task } from '@comp/db/types'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@comp/ui/tooltip'; +import type { Control, Policy, Task } from '@db'; import type { ColumnDef } from '@tanstack/react-table'; import Link from 'next/link'; import { useParams } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/page.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/page.tsx index 420991bfe..a4259e09b 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/page.tsx @@ -1,7 +1,7 @@ import PageWithBreadcrumb from '@/components/pages/PageWithBreadcrumb'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import type { FrameworkEditorRequirement } from '@comp/db/types'; +import type { FrameworkEditorRequirement } from '@db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; import { getSingleFrameworkInstanceWithControls } from '../../../data/getSingleFrameworkInstanceWithControls'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/components/AddFrameworkModal.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/components/AddFrameworkModal.tsx index d803e1619..c5ebbf23d 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/components/AddFrameworkModal.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/components/AddFrameworkModal.tsx @@ -11,7 +11,6 @@ import type { z } from 'zod'; import { addFrameworksToOrganizationAction } from '@/actions/organization/add-frameworks-to-organization-action'; import { addFrameworksSchema } from '@/actions/schema'; import { FrameworkCard } from '@/components/framework-card'; -import type { FrameworkEditorFramework } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { DialogContent, @@ -21,6 +20,7 @@ import { DialogTitle, } from '@comp/ui/dialog'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@comp/ui/form'; +import type { FrameworkEditorFramework } from '@db'; type Props = { onOpenChange: (isOpen: boolean) => void; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworkCard.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworkCard.tsx index e1e102a7d..86de5fd77 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworkCard.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworkCard.tsx @@ -1,10 +1,10 @@ 'use client'; -import type { Control, Task } from '@comp/db/types'; import { Badge } from '@comp/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@comp/ui/card'; import { cn } from '@comp/ui/cn'; import { Progress } from '@comp/ui/progress'; +import type { Control, Task } from '@db'; import { BarChart3, Clock } from 'lucide-react'; import Link from 'next/link'; import { useParams } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworkList.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworkList.tsx index ebc7aac6d..5ad5b796f 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworkList.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworkList.tsx @@ -1,6 +1,6 @@ 'use client'; -import { Control, Task } from '@comp/db/types'; +import { Control, Task } from '@db'; import type { FrameworkInstanceWithControls } from '../types'; import { FrameworkCard } from './FrameworkCard'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworksOverview.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworksOverview.tsx index ef987fbc1..74b3822b1 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworksOverview.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/components/FrameworksOverview.tsx @@ -1,9 +1,9 @@ 'use client'; -import type { FrameworkEditorFramework } from '@comp/db/types'; -import { Control, Task } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Dialog } from '@comp/ui/dialog'; +import type { FrameworkEditorFramework } from '@db'; +import { Control, Task } from '@db'; import { PlusIcon } from 'lucide-react'; import { useParams } from 'next/navigation'; import { useState } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/components/types.ts b/apps/app/src/app/(app)/[orgId]/frameworks/components/types.ts index eacb03f78..508026af1 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/components/types.ts +++ b/apps/app/src/app/(app)/[orgId]/frameworks/components/types.ts @@ -1,4 +1,4 @@ -import type { FrameworkInstance, IntegrationResult, Policy, Task } from '@comp/db/types'; +import type { FrameworkInstance, IntegrationResult, Policy, Task } from '@db'; import { FrameworkInstanceWithControls } from '../types'; export interface ComplianceScoresProps { diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/data/getAllFrameworkInstancesWithControls.ts b/apps/app/src/app/(app)/[orgId]/frameworks/data/getAllFrameworkInstancesWithControls.ts index 318742745..7cd656cd2 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/data/getAllFrameworkInstancesWithControls.ts +++ b/apps/app/src/app/(app)/[orgId]/frameworks/data/getAllFrameworkInstancesWithControls.ts @@ -1,7 +1,7 @@ 'use server'; -import { db } from '@comp/db'; -import type { Control, PolicyStatus, RequirementMap } from '@comp/db/types'; +import type { Control, PolicyStatus, RequirementMap } from '@db'; +import { db } from '@db'; import { cache } from 'react'; import type { FrameworkInstanceWithControls } from '../types'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/data/getFrameworkWithComplianceScores.ts b/apps/app/src/app/(app)/[orgId]/frameworks/data/getFrameworkWithComplianceScores.ts index 19adfd7bc..8e0bb59ee 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/data/getFrameworkWithComplianceScores.ts +++ b/apps/app/src/app/(app)/[orgId]/frameworks/data/getFrameworkWithComplianceScores.ts @@ -4,7 +4,7 @@ import { Control, // Policy might still be useful if full Policy objects were ever passed, but selected fields are more common now type PolicyStatus, // For the selected policy type type Task, -} from '@comp/db/types'; +} from '@db'; import { FrameworkInstanceWithComplianceScore } from '../components/types'; import { FrameworkInstanceWithControls } from '../types'; // This now has policies with selected fields diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/data/getSingleFrameworkInstanceWithControls.ts b/apps/app/src/app/(app)/[orgId]/frameworks/data/getSingleFrameworkInstanceWithControls.ts index 7d5030cc1..738e9940b 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/data/getSingleFrameworkInstanceWithControls.ts +++ b/apps/app/src/app/(app)/[orgId]/frameworks/data/getSingleFrameworkInstanceWithControls.ts @@ -1,7 +1,7 @@ 'use server'; -import { db } from '@comp/db'; -import type { Control, PolicyStatus, RequirementMap } from '@comp/db/types'; +import type { Control, PolicyStatus, RequirementMap } from '@db'; +import { db } from '@db'; import type { FrameworkInstanceWithControls } from '../types'; export const getSingleFrameworkInstanceWithControls = async ({ diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/lib/utils.ts b/apps/app/src/app/(app)/[orgId]/frameworks/lib/utils.ts index e0f0b4687..3d83d6a57 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/lib/utils.ts +++ b/apps/app/src/app/(app)/[orgId]/frameworks/lib/utils.ts @@ -1,7 +1,7 @@ import { StatusType } from '@/components/status-indicator'; // Import base types explicitly -import type { Control, PolicyStatus } from '@comp/db/types'; -import { Task } from '@comp/db/types'; +import type { Control, PolicyStatus } from '@db'; +import { Task } from '@db'; // Define the expected structure for policies passed to getControlStatus // This should match the data structure provided by the calling code (e.g., from a Prisma select) diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/page.tsx b/apps/app/src/app/(app)/[orgId]/frameworks/page.tsx index 3c8c28235..546836e31 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/frameworks/page.tsx @@ -1,7 +1,7 @@ import PageWithBreadcrumb from '@/components/pages/PageWithBreadcrumb'; import { CheckoutCompleteTracking } from '@/components/tracking/CheckoutCompleteTracking'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; import { cache } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/frameworks/types.ts b/apps/app/src/app/(app)/[orgId]/frameworks/types.ts index 6dccfa4b6..a50e40e38 100644 --- a/apps/app/src/app/(app)/[orgId]/frameworks/types.ts +++ b/apps/app/src/app/(app)/[orgId]/frameworks/types.ts @@ -4,7 +4,7 @@ import { FrameworkInstance, PolicyStatus, RequirementMap, -} from '@comp/db/types'; +} from '@db'; export type FrameworkInstanceWithControls = FrameworkInstance & { framework: FrameworkEditorFramework; diff --git a/apps/app/src/app/(app)/[orgId]/integrations/page.tsx b/apps/app/src/app/(app)/[orgId]/integrations/page.tsx index 0b294ca2d..9c4077e71 100644 --- a/apps/app/src/app/(app)/[orgId]/integrations/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/integrations/page.tsx @@ -1,7 +1,7 @@ import { IntegrationsHeader } from '@/components/integrations/integrations-header'; import { IntegrationsServer } from '@/components/integrations/integrations.server'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/layout.tsx b/apps/app/src/app/(app)/[orgId]/layout.tsx index ce709bf12..d6ec8ddcf 100644 --- a/apps/app/src/app/(app)/[orgId]/layout.tsx +++ b/apps/app/src/app/(app)/[orgId]/layout.tsx @@ -5,7 +5,7 @@ import { AssistantSheet } from '@/components/sheets/assistant-sheet'; import { Sidebar } from '@/components/sidebar'; import { SidebarProvider } from '@/context/sidebar-context'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import dynamic from 'next/dynamic'; import { cookies, headers } from 'next/headers'; import { redirect } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/get-employee-details.ts b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/get-employee-details.ts index a4506718e..aa95073b8 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/get-employee-details.ts +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/get-employee-details.ts @@ -2,7 +2,7 @@ import { authActionClient } from '@/actions/safe-action'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { type AppError, appErrors, employeeDetailsInputSchema } from '../types'; diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-department.ts b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-department.ts index 22f55acbf..13f166395 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-department.ts +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-department.ts @@ -2,8 +2,8 @@ import { authActionClient } from '@/actions/safe-action'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import type { Departments } from '@comp/db/types'; +import type { Departments } from '@db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { type AppError, appErrors, updateEmployeeDepartmentSchema } from '../types'; diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee-details.ts b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee-details.ts index 1d8c7143a..39e12a432 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee-details.ts +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee-details.ts @@ -2,7 +2,7 @@ import { authActionClient } from '@/actions/safe-action'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee-status.ts b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee-status.ts index 2831004eb..bde8ccf74 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee-status.ts +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee-status.ts @@ -2,7 +2,7 @@ import { authActionClient } from '@/actions/safe-action'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee.ts b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee.ts index 36b296003..cee6a511a 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee.ts +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/actions/update-employee.ts @@ -1,9 +1,8 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; -import type { Departments } from '@comp/db/types'; -import { Prisma } from '@prisma/client'; +import type { Departments } from '@db'; +import { db, Prisma } from '@db'; import { revalidatePath } from 'next/cache'; import { z } from 'zod'; import { appErrors } from '../types'; diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EditableDepartment.tsx b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EditableDepartment.tsx index 84e641c18..2f503b158 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EditableDepartment.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EditableDepartment.tsx @@ -1,7 +1,7 @@ 'use client'; -import type { Departments } from '@comp/db/types'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; +import type { Departments } from '@db'; import { useAction } from 'next-safe-action/hooks'; import { useState } from 'react'; import { toast } from 'sonner'; diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/Employee.tsx b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/Employee.tsx index 3a2ad46ef..ed9631250 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/Employee.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/Employee.tsx @@ -1,7 +1,7 @@ 'use client'; import type { TrainingVideo } from '@/lib/data/training-videos'; -import type { EmployeeTrainingVideoCompletion, Member, Policy, User } from '@comp/db/types'; +import type { EmployeeTrainingVideoCompletion, Member, Policy, User } from '@db'; import type { FleetPolicy, Host } from '../../devices/types'; import { EmployeeDetails } from './EmployeeDetails'; import { EmployeeTasks } from './EmployeeTasks'; diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EmployeeDetails.tsx b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EmployeeDetails.tsx index d1c3902ee..df5cc75f0 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EmployeeDetails.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EmployeeDetails.tsx @@ -1,9 +1,9 @@ 'use client'; -import type { Departments, Member, User } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@comp/ui/card'; import { Form } from '@comp/ui/form'; +import type { Departments, Member, User } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; import { Save } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EmployeeTasks.tsx b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EmployeeTasks.tsx index afdb48cf0..35a938e3f 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EmployeeTasks.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/EmployeeTasks.tsx @@ -1,5 +1,5 @@ import type { TrainingVideo } from '@/lib/data/training-videos'; -import type { EmployeeTrainingVideoCompletion, Member, Policy, User } from '@comp/db/types'; +import type { EmployeeTrainingVideoCompletion, Member, Policy, User } from '@db'; import { cn } from '@/lib/utils'; import { Card, CardContent, CardHeader, CardTitle } from '@comp/ui/card'; diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/Fields/Department.tsx b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/Fields/Department.tsx index 9a1003bfd..6bcc57493 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/Fields/Department.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/components/Fields/Department.tsx @@ -1,6 +1,6 @@ -import type { Departments } from '@comp/db/types'; import { FormControl, FormField, FormItem, FormLabel, FormMessage } from '@comp/ui/form'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; +import type { Departments } from '@db'; import type { Control } from 'react-hook-form'; import type { EmployeeFormValues } from '../EmployeeDetails'; diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/layout.tsx b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/layout.tsx index ccd02cd74..bc524b694 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/layout.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/layout.tsx @@ -1,4 +1,3 @@ -import { db } from '@comp/db'; import { Breadcrumb, BreadcrumbItem, @@ -7,6 +6,7 @@ import { BreadcrumbPage, BreadcrumbSeparator, } from '@comp/ui/breadcrumb'; +import { db } from '@db'; export default async function Layout({ children, diff --git a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/page.tsx b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/page.tsx index 59fb61641..587b8abfc 100644 --- a/apps/app/src/app/(app)/[orgId]/people/[employeeId]/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/[employeeId]/page.tsx @@ -6,8 +6,8 @@ import { trainingVideos as trainingVideosData, } from '@/lib/data/training-videos'; import { getFleetInstance } from '@/lib/fleet'; -import { db } from '@comp/db'; -import type { EmployeeTrainingVideoCompletion, Member } from '@comp/db/types'; +import type { EmployeeTrainingVideoCompletion, Member } from '@db'; +import { db } from '@db'; import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { notFound, redirect } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/people/all/actions/addEmployeeWithoutInvite.ts b/apps/app/src/app/(app)/[orgId]/people/all/actions/addEmployeeWithoutInvite.ts index 95574432b..027701778 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/actions/addEmployeeWithoutInvite.ts +++ b/apps/app/src/app/(app)/[orgId]/people/all/actions/addEmployeeWithoutInvite.ts @@ -1,8 +1,8 @@ 'use server'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import type { Role } from '@comp/db/types'; +import type { Role } from '@db'; +import { db } from '@db'; export const addEmployeeWithoutInvite = async ({ email, diff --git a/apps/app/src/app/(app)/[orgId]/people/all/actions/removeMember.ts b/apps/app/src/app/(app)/[orgId]/people/all/actions/removeMember.ts index baa576c90..a734a9124 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/actions/removeMember.ts +++ b/apps/app/src/app/(app)/[orgId]/people/all/actions/removeMember.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; // Adjust safe-action import for colocalized structure diff --git a/apps/app/src/app/(app)/[orgId]/people/all/actions/revokeInvitation.ts b/apps/app/src/app/(app)/[orgId]/people/all/actions/revokeInvitation.ts index a2d5a515e..59fa6a18a 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/actions/revokeInvitation.ts +++ b/apps/app/src/app/(app)/[orgId]/people/all/actions/revokeInvitation.ts @@ -1,6 +1,6 @@ 'use server'; -import { db } from '@comp/db'; +import { db } from '@db'; // Remove unused Role import if not needed elsewhere // import { Role } from "@comp/db/types"; import { revalidatePath, revalidateTag } from 'next/cache'; diff --git a/apps/app/src/app/(app)/[orgId]/people/all/actions/updateMemberRole.ts b/apps/app/src/app/(app)/[orgId]/people/all/actions/updateMemberRole.ts index 13cd93c63..cc6ce1e9a 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/actions/updateMemberRole.ts +++ b/apps/app/src/app/(app)/[orgId]/people/all/actions/updateMemberRole.ts @@ -1,7 +1,6 @@ 'use server'; -import { db } from '@comp/db'; -import { Departments, Role } from '@prisma/client'; +import { db, Departments, Role } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; // Adjust safe-action import for colocalized structure diff --git a/apps/app/src/app/(app)/[orgId]/people/all/components/InviteMembersModal.tsx b/apps/app/src/app/(app)/[orgId]/people/all/components/InviteMembersModal.tsx index 85a7b42fe..175da2647 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/components/InviteMembersModal.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/all/components/InviteMembersModal.tsx @@ -1,7 +1,7 @@ 'use client'; +import type { Role } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; -import type { Role } from '@prisma/client'; import { Loader2, PlusCircle, Trash2 } from 'lucide-react'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/people/all/components/MemberRow.tsx b/apps/app/src/app/(app)/[orgId]/people/all/components/MemberRow.tsx index bb2a73f42..18114c662 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/components/MemberRow.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/all/components/MemberRow.tsx @@ -34,7 +34,7 @@ import { DropdownMenuTrigger, } from '@comp/ui/dropdown-menu'; import { Label } from '@comp/ui/label'; -import type { Role } from '@prisma/client'; +import type { Role } from '@db'; import { MultiRoleCombobox } from './MultiRoleCombobox'; import type { MemberWithUser } from './TeamMembers'; diff --git a/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleCombobox.tsx b/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleCombobox.tsx index 31eea8077..79e9a86bc 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleCombobox.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleCombobox.tsx @@ -1,6 +1,6 @@ 'use client'; -import type { Role } from '@prisma/client'; +import type { Role } from '@db'; import * as React from 'react'; import { Dialog, DialogContent } from '@comp/ui/dialog'; diff --git a/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleComboboxContent.tsx b/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleComboboxContent.tsx index 586700a64..56c320e16 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleComboboxContent.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleComboboxContent.tsx @@ -8,7 +8,7 @@ import { CommandItem, CommandList, } from '@comp/ui/command'; -import type { Role } from '@prisma/client'; // Assuming Role is from prisma +import type { Role } from '@db'; // Assuming Role is from prisma import { Check } from 'lucide-react'; import { cn } from '@comp/ui/cn'; diff --git a/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleComboboxTrigger.tsx b/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleComboboxTrigger.tsx index e0ca2a7cf..ce7eb4fd5 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleComboboxTrigger.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/all/components/MultiRoleComboboxTrigger.tsx @@ -4,7 +4,7 @@ import { Badge } from '@comp/ui/badge'; import { Button } from '@comp/ui/button'; import { cn } from '@comp/ui/cn'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@comp/ui/tooltip'; -import type { Role } from '@prisma/client'; // Assuming Role is from prisma +import type { Role } from '@db'; // Assuming Role is from prisma import { ChevronsUpDown, Lock, X } from 'lucide-react'; interface MultiRoleComboboxTriggerProps { diff --git a/apps/app/src/app/(app)/[orgId]/people/all/components/PendingInvitationRow.tsx b/apps/app/src/app/(app)/[orgId]/people/all/components/PendingInvitationRow.tsx index e756f0d8f..8079a0c74 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/components/PendingInvitationRow.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/all/components/PendingInvitationRow.tsx @@ -18,7 +18,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from '@comp/ui/dropdown-menu'; -import type { Invitation } from '@prisma/client'; +import type { Invitation } from '@db'; import { Clock, MoreHorizontal, Trash2 } from 'lucide-react'; import { useEffect, useMemo, useRef, useState } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembers.tsx b/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembers.tsx index 6b4a1a501..7e4df9538 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembers.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembers.tsx @@ -1,8 +1,8 @@ 'use server'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import type { Invitation, Member, User } from '@prisma/client'; +import type { Invitation, Member, User } from '@db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { removeMember } from '../actions/removeMember'; import { revokeInvitation } from '../actions/revokeInvitation'; diff --git a/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembersClient.tsx b/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembersClient.tsx index 373bad50d..65e842714 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembersClient.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembersClient.tsx @@ -12,7 +12,7 @@ import { Card, CardContent } from '@comp/ui/card'; import { Input } from '@comp/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; import { Separator } from '@comp/ui/separator'; -import type { Invitation, Role } from '@prisma/client'; +import type { Invitation, Role } from '@db'; import { MemberRow } from './MemberRow'; import { PendingInvitationRow } from './PendingInvitationRow'; diff --git a/apps/app/src/app/(app)/[orgId]/people/dashboard/components/EmployeeCompletionChart.tsx b/apps/app/src/app/(app)/[orgId]/people/dashboard/components/EmployeeCompletionChart.tsx index 48bba11f9..18270cb3d 100644 --- a/apps/app/src/app/(app)/[orgId]/people/dashboard/components/EmployeeCompletionChart.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/dashboard/components/EmployeeCompletionChart.tsx @@ -6,7 +6,7 @@ import * as React from 'react'; // Use correct types from the database import { TrainingVideo } from '@/lib/data/training-videos'; -import { EmployeeTrainingVideoCompletion, Member, Policy, User } from '@comp/db/types'; +import { EmployeeTrainingVideoCompletion, Member, Policy, User } from '@db'; interface EmployeeCompletionChartProps { employees: (Member & { diff --git a/apps/app/src/app/(app)/[orgId]/people/dashboard/components/EmployeesOverview.tsx b/apps/app/src/app/(app)/[orgId]/people/dashboard/components/EmployeesOverview.tsx index 4df240f63..b5faa8fb7 100644 --- a/apps/app/src/app/(app)/[orgId]/people/dashboard/components/EmployeesOverview.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/dashboard/components/EmployeesOverview.tsx @@ -1,7 +1,7 @@ import { trainingVideos as trainingVideosData } from '@/lib/data/training-videos'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import type { Member, Policy, User } from '@prisma/client'; +import type { Member, Policy, User } from '@db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { EmployeeCompletionChart } from './EmployeeCompletionChart'; diff --git a/apps/app/src/app/(app)/[orgId]/people/devices/data/index.ts b/apps/app/src/app/(app)/[orgId]/people/devices/data/index.ts index f95377807..058239ea1 100644 --- a/apps/app/src/app/(app)/[orgId]/people/devices/data/index.ts +++ b/apps/app/src/app/(app)/[orgId]/people/devices/data/index.ts @@ -2,7 +2,7 @@ import { getFleetInstance } from '@/lib/fleet'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import type { Host } from '../types'; diff --git a/apps/app/src/app/(app)/[orgId]/people/layout.tsx b/apps/app/src/app/(app)/[orgId]/people/layout.tsx index 0a9cb206c..f0aa85263 100644 --- a/apps/app/src/app/(app)/[orgId]/people/layout.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/layout.tsx @@ -1,7 +1,7 @@ import { getPostHogClient } from '@/app/posthog'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; import { SecondaryMenu } from '@comp/ui/secondary-menu'; +import { db } from '@db'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/(overview)/components/policy-assignee-chart.tsx b/apps/app/src/app/(app)/[orgId]/policies/(overview)/components/policy-assignee-chart.tsx index a0195277c..5cf5afbbf 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/(overview)/components/policy-assignee-chart.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/(overview)/components/policy-assignee-chart.tsx @@ -35,6 +35,26 @@ const CHART_COLORS = { }; export function PolicyAssigneeChart({ data }: PolicyAssigneeChartProps) { + // Sort assignees by total policies (descending) + const sortedData = React.useMemo(() => { + if (!data || data.length === 0) return []; + return [...data] + .sort((a, b) => b.total - a.total) + .slice(0, 4) + .reverse(); + }, [data]); + + // Calculate total policies and top assignee + const totalPolicies = React.useMemo(() => { + if (!data || data.length === 0) return 0; + return data.reduce((sum, item) => sum + item.total, 0); + }, [data]); + + const topAssignee = React.useMemo(() => { + if (!data || data.length === 0) return null; + return data.reduce((prev, current) => (prev.total > current.total ? prev : current)); + }, [data]); + if (!data || data.length === 0) { return ( @@ -64,14 +84,6 @@ export function PolicyAssigneeChart({ data }: PolicyAssigneeChartProps) { ); } - // Sort assignees by total policies (descending) - const sortedData = React.useMemo(() => { - return [...data] - .sort((a, b) => b.total - a.total) - .slice(0, 4) - .reverse(); - }, [data]); - const chartData = sortedData.map((item) => ({ name: item.name, published: item.published, @@ -99,17 +111,6 @@ export function PolicyAssigneeChart({ data }: PolicyAssigneeChartProps) { }, } satisfies ChartConfig; - // Calculate total policies and top assignee - const totalPolicies = React.useMemo(() => { - if (!data.length) return 0; - return data.reduce((sum, item) => sum + item.total, 0); - }, [data]); - - const topAssignee = React.useMemo(() => { - if (!data.length) return null; - return data.reduce((prev, current) => (prev.total > current.total ? prev : current)); - }, [data]); - return ( diff --git a/apps/app/src/app/(app)/[orgId]/policies/(overview)/components/policy-status-chart.tsx b/apps/app/src/app/(app)/[orgId]/policies/(overview)/components/policy-status-chart.tsx index f99236491..f35a200ec 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/(overview)/components/policy-status-chart.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/(overview)/components/policy-status-chart.tsx @@ -49,6 +49,39 @@ const StatusTooltip = ({ active, payload }: any) => { }; export function PolicyStatusChart({ data }: PolicyStatusChartProps) { + const chartData = React.useMemo(() => { + if (!data) return []; + const items = [ + { + name: 'Published', + value: data.publishedPolicies, + fill: CHART_COLORS.published, + }, + { + name: 'Draft', + value: data.draftPolicies, + fill: CHART_COLORS.draft, + }, + { + name: 'Needs Review', + value: data.needsReviewPolicies, + fill: CHART_COLORS.needs_review, + }, + { + name: 'Archived', + value: data.archivedPolicies, + fill: CHART_COLORS.archived, + }, + ]; + return items.filter((item) => item.value > 0); + }, [data]); + + // Calculate most common status + const mostCommonStatus = React.useMemo(() => { + if (!chartData.length) return null; + return chartData.reduce((prev, current) => (prev.value > current.value ? prev : current)); + }, [chartData]); + if (!data) { return ( @@ -75,45 +108,12 @@ export function PolicyStatusChart({ data }: PolicyStatusChartProps) { ); } - const chartData = React.useMemo(() => { - const items = [ - { - name: 'Published', - value: data.publishedPolicies, - fill: CHART_COLORS.published, - }, - { - name: 'Draft', - value: data.draftPolicies, - fill: CHART_COLORS.draft, - }, - { - name: 'Archived', - value: data.archivedPolicies, - fill: CHART_COLORS.archived, - }, - { - name: 'Needs Review', - value: data.needsReviewPolicies, - fill: CHART_COLORS.needs_review, - }, - ]; - - return items.filter((item) => item.value); - }, [data]); - const chartConfig = { value: { label: 'Count', }, } satisfies ChartConfig; - // Calculate most common status - const mostCommonStatus = React.useMemo(() => { - if (!chartData.length) return null; - return chartData.reduce((prev, current) => (prev.value > current.value ? prev : current)); - }, [chartData]); - return ( diff --git a/apps/app/src/app/(app)/[orgId]/policies/(overview)/page.tsx b/apps/app/src/app/(app)/[orgId]/policies/(overview)/page.tsx index 324aaf0cd..6e70e7573 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/(overview)/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/(overview)/page.tsx @@ -1,5 +1,5 @@ import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { Suspense } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/actions/mapPolicyToControls.ts b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/actions/mapPolicyToControls.ts index 7e0153dae..2e6ab33f4 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/actions/mapPolicyToControls.ts +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/actions/mapPolicyToControls.ts @@ -1,7 +1,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/actions/unmapPolicyFromControl.ts b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/actions/unmapPolicyFromControl.ts index 094e79c0d..3f4343198 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/actions/unmapPolicyFromControl.ts +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/actions/unmapPolicyFromControl.ts @@ -1,7 +1,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyArchiveSheet.tsx b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyArchiveSheet.tsx index 2309e0c70..5d169fff5 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyArchiveSheet.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyArchiveSheet.tsx @@ -1,11 +1,11 @@ 'use client'; import { archivePolicyAction } from '@/actions/policies/archive-policy'; -import { Policy } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Drawer, DrawerContent, DrawerTitle } from '@comp/ui/drawer'; import { useMediaQuery } from '@comp/ui/hooks'; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@comp/ui/sheet'; +import { Policy } from '@db'; import { ArchiveIcon, ArchiveRestoreIcon, X } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; import { useRouter } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappingConfirmDeleteModal.tsx b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappingConfirmDeleteModal.tsx index a32e4b7d9..24e353dae 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappingConfirmDeleteModal.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappingConfirmDeleteModal.tsx @@ -1,4 +1,3 @@ -import type { Control } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Dialog, @@ -9,6 +8,7 @@ import { DialogTitle, DialogTrigger, } from '@comp/ui/dialog'; +import type { Control } from '@db'; import { X } from 'lucide-react'; import { useParams } from 'next/navigation'; import { useState } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappingModal.tsx b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappingModal.tsx index bcdc9f85c..d76dfb849 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappingModal.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappingModal.tsx @@ -1,4 +1,3 @@ -import { Control } from '@comp/db/types'; import { Badge } from '@comp/ui/badge'; import { Button } from '@comp/ui/button'; import { @@ -11,6 +10,7 @@ import { DialogTrigger, } from '@comp/ui/dialog'; import MultipleSelector, { Option } from '@comp/ui/multiple-selector'; +import { Control } from '@db'; import { PlusIcon } from 'lucide-react'; import { useParams } from 'next/navigation'; import { useEffect, useState } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappings.tsx b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappings.tsx index e782e3870..c93e87896 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappings.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyControlMappings.tsx @@ -1,6 +1,6 @@ -import { Control } from '@comp/db/types'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@comp/ui/card'; import { SelectPills } from '@comp/ui/select-pills'; +import { Control } from '@db'; import { useAction } from 'next-safe-action/hooks'; import { useParams } from 'next/navigation'; import { useState } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyDeleteDialog.tsx b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyDeleteDialog.tsx index f07890ff0..df8c72871 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyDeleteDialog.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyDeleteDialog.tsx @@ -1,7 +1,6 @@ 'use client'; import { deletePolicyAction } from '@/actions/policies/delete-policy'; -import { Policy } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Dialog, @@ -12,6 +11,7 @@ import { DialogTitle, } from '@comp/ui/dialog'; import { Form } from '@comp/ui/form'; +import { Policy } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; import { Trash2 } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyOverview.tsx b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyOverview.tsx index ff541ec2c..a62789053 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyOverview.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyOverview.tsx @@ -3,8 +3,6 @@ import { acceptRequestedPolicyChangesAction } from '@/actions/policies/accept-requested-policy-changes'; import { denyRequestedPolicyChangesAction } from '@/actions/policies/deny-requested-policy-changes'; import { authClient } from '@/utils/auth-client'; -import type { Member, Policy, User } from '@comp/db/types'; -import { Control } from '@comp/db/types'; import { Alert, AlertDescription, AlertTitle } from '@comp/ui/alert'; import { Button } from '@comp/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@comp/ui/card'; @@ -15,6 +13,8 @@ import { DropdownMenuTrigger, } from '@comp/ui/dropdown-menu'; import { Icons } from '@comp/ui/icons'; +import type { Member, Policy, User } from '@db'; +import { Control } from '@db'; import { format } from 'date-fns'; import { ArchiveIcon, diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyOverviewSheet.tsx b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyOverviewSheet.tsx index 47c0edb68..942d0812e 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyOverviewSheet.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyOverviewSheet.tsx @@ -1,12 +1,12 @@ 'use client'; import { UpdatePolicyForm } from '@/components/forms/policies/update-policy-form'; -import { Policy } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Drawer, DrawerContent, DrawerTitle } from '@comp/ui/drawer'; import { useMediaQuery } from '@comp/ui/hooks'; import { ScrollArea } from '@comp/ui/scroll-area'; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@comp/ui/sheet'; +import { Policy } from '@db'; import { X } from 'lucide-react'; import { useQueryState } from 'nuqs'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyPage.tsx b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyPage.tsx index a6e032237..a1e98b434 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyPage.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/PolicyPage.tsx @@ -1,4 +1,4 @@ -import { Control, Member, Policy, User } from '@comp/db/types'; +import { Control, Member, Policy, User } from '@db'; import type { JSONContent } from '@tiptap/react'; import { Comments, CommentWithAuthor } from '../../../../../../components/comments/Comments'; import { AuditLogWithRelations } from '../data'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/RecentAuditLogs.tsx b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/RecentAuditLogs.tsx index c558caeb6..f9af8cb7b 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/RecentAuditLogs.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/RecentAuditLogs.tsx @@ -1,9 +1,9 @@ -import { AuditLog, AuditLogEntityType } from '@comp/db/types'; import { Avatar, AvatarFallback, AvatarImage } from '@comp/ui/avatar'; import { Badge } from '@comp/ui/badge'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@comp/ui/card'; import { cn } from '@comp/ui/cn'; import { ScrollArea } from '@comp/ui/scroll-area'; +import { AuditLog, AuditLogEntityType } from '@db'; import { format } from 'date-fns'; import { ActivityIcon, diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/SubmitApprovalDialog.tsx b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/SubmitApprovalDialog.tsx index f0cc514f5..bff873117 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/SubmitApprovalDialog.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/SubmitApprovalDialog.tsx @@ -1,7 +1,6 @@ 'use client'; import { SelectAssignee } from '@/components/SelectAssignee'; -import { Member, User } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Dialog, @@ -11,6 +10,7 @@ import { DialogHeader, DialogTitle, } from '@comp/ui/dialog'; +import { Member, User } from '@db'; import { Loader2 } from 'lucide-react'; interface SubmitApprovalDialogProps { diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/UpdatePolicyOverview.tsx b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/UpdatePolicyOverview.tsx index 3dcee8017..3781bdbb4 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/UpdatePolicyOverview.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/components/UpdatePolicyOverview.tsx @@ -4,13 +4,13 @@ import { submitPolicyForApprovalAction } from '@/actions/policies/submit-policy- import { updatePolicyFormAction } from '@/actions/policies/update-policy-form-action'; import { SelectAssignee } from '@/components/SelectAssignee'; import { StatusIndicator } from '@/components/status-indicator'; -import { Departments, Frequency, Member, type Policy, PolicyStatus, User } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Calendar } from '@comp/ui/calendar'; import { cn } from '@comp/ui/cn'; import { Popover, PopoverContent, PopoverTrigger } from '@comp/ui/popover'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; import { Switch } from '@comp/ui/switch'; +import { Departments, Frequency, Member, type Policy, PolicyStatus, User } from '@db'; import { format } from 'date-fns'; import { CalendarIcon, Loader2 } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/data/index.ts b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/data/index.ts index 4e3914c49..76b4eb300 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/data/index.ts +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/data/index.ts @@ -2,16 +2,16 @@ import { CommentWithAuthor } from '@/components/comments/Comments'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; import { AttachmentEntityType, AuditLog, AuditLogEntityType, CommentEntityType, + db, Member, Organization, User, -} from '@comp/db/types'; +} from '@db'; import { headers } from 'next/headers'; // Define the type for AuditLog with its relations diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/editor/actions/get-policy-details.ts b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/editor/actions/get-policy-details.ts index 766c6a482..406915123 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/editor/actions/get-policy-details.ts +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/editor/actions/get-policy-details.ts @@ -2,7 +2,7 @@ import { authActionClient } from '@/actions/safe-action'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { appErrors, policyDetailsInputSchema } from '../types'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/editor/actions/update-policy.ts b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/editor/actions/update-policy.ts index d925e7396..85b268f10 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/[policyId]/editor/actions/update-policy.ts +++ b/apps/app/src/app/(app)/[orgId]/policies/[policyId]/editor/actions/update-policy.ts @@ -3,7 +3,7 @@ import { authActionClient } from '@/actions/safe-action'; import type { ActionResponse } from '@/actions/types'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { appErrors, updatePolicySchema } from '../types'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/all/components/policies-table-columns.tsx b/apps/app/src/app/(app)/[orgId]/policies/all/components/policies-table-columns.tsx index bc61d6a9d..722e685db 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/all/components/policies-table-columns.tsx +++ b/apps/app/src/app/(app)/[orgId]/policies/all/components/policies-table-columns.tsx @@ -3,7 +3,7 @@ import { DataTableColumnHeader } from '@/components/data-table/data-table-column-header'; import { StatusIndicator } from '@/components/status-indicator'; import { formatDate } from '@/lib/format'; -import { Policy } from '@comp/db/types'; +import { Policy } from '@db'; import { ColumnDef } from '@tanstack/react-table'; export function getPolicyColumns(): ColumnDef[] { diff --git a/apps/app/src/app/(app)/[orgId]/policies/all/data/queries.ts b/apps/app/src/app/(app)/[orgId]/policies/all/data/queries.ts index cf48de29f..4b0a59987 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/all/data/queries.ts +++ b/apps/app/src/app/(app)/[orgId]/policies/all/data/queries.ts @@ -1,8 +1,7 @@ import 'server-only'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import { Prisma } from '@prisma/client'; +import { db, Prisma } from '@db'; import { headers } from 'next/headers'; import { cache } from 'react'; import type { GetPolicySchema } from './validations'; diff --git a/apps/app/src/app/(app)/[orgId]/policies/all/data/validations.ts b/apps/app/src/app/(app)/[orgId]/policies/all/data/validations.ts index 0eecab1fb..444ccd6ee 100644 --- a/apps/app/src/app/(app)/[orgId]/policies/all/data/validations.ts +++ b/apps/app/src/app/(app)/[orgId]/policies/all/data/validations.ts @@ -1,5 +1,5 @@ import { getFiltersStateParser, getSortingStateParser } from '@/lib/parsers'; -import { Policy, PolicyStatus } from '@comp/db/types'; +import { Policy, PolicyStatus } from '@db'; import { createSearchParamsCache, parseAsArrayOf, diff --git a/apps/app/src/app/(app)/[orgId]/risk/(overview)/RisksTable.tsx b/apps/app/src/app/(app)/[orgId]/risk/(overview)/RisksTable.tsx index 92d99b759..5ce63cbd5 100644 --- a/apps/app/src/app/(app)/[orgId]/risk/(overview)/RisksTable.tsx +++ b/apps/app/src/app/(app)/[orgId]/risk/(overview)/RisksTable.tsx @@ -5,7 +5,7 @@ import { DataTableToolbar } from '@/components/data-table/data-table-toolbar'; import { CreateRiskSheet } from '@/components/sheets/create-risk-sheet'; import { useDataTable } from '@/hooks/use-data-table'; import { useSession } from '@/utils/auth-client'; -import type { Member, Risk, User } from '@comp/db/types'; +import type { Member, Risk, User } from '@db'; import { ColumnDef } from '@tanstack/react-table'; import { useQueryState } from 'nuqs'; import { useMemo } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/risk/(overview)/data/getRisks.ts b/apps/app/src/app/(app)/[orgId]/risk/(overview)/data/getRisks.ts index ede1225b8..707589d97 100644 --- a/apps/app/src/app/(app)/[orgId]/risk/(overview)/data/getRisks.ts +++ b/apps/app/src/app/(app)/[orgId]/risk/(overview)/data/getRisks.ts @@ -1,8 +1,7 @@ import 'server-only'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import { Prisma, type User } from '@comp/db/types'; +import { db, Prisma, type User } from '@db'; import { headers } from 'next/headers'; import type { GetRiskSchema } from './validations'; diff --git a/apps/app/src/app/(app)/[orgId]/risk/(overview)/data/validations.ts b/apps/app/src/app/(app)/[orgId]/risk/(overview)/data/validations.ts index 88213f6c0..969f0bf1c 100644 --- a/apps/app/src/app/(app)/[orgId]/risk/(overview)/data/validations.ts +++ b/apps/app/src/app/(app)/[orgId]/risk/(overview)/data/validations.ts @@ -1,5 +1,5 @@ import { getFiltersStateParser, getSortingStateParser } from '@/lib/parsers'; -import { Risk } from '@comp/db/types'; +import { Risk } from '@db'; import { createSearchParamsCache, parseAsArrayOf, diff --git a/apps/app/src/app/(app)/[orgId]/risk/(overview)/page.tsx b/apps/app/src/app/(app)/[orgId]/risk/(overview)/page.tsx index 746bb7880..87115bbce 100644 --- a/apps/app/src/app/(app)/[orgId]/risk/(overview)/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/risk/(overview)/page.tsx @@ -3,7 +3,7 @@ import PageWithBreadcrumb from '@/components/pages/PageWithBreadcrumb'; import { CreateRiskSheet } from '@/components/sheets/create-risk-sheet'; import { getValidFilters } from '@/lib/data-table'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { cache } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/risk/[riskId]/page.tsx b/apps/app/src/app/(app)/[orgId]/risk/[riskId]/page.tsx index c896557e0..da975de93 100644 --- a/apps/app/src/app/(app)/[orgId]/risk/[riskId]/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/risk/[riskId]/page.tsx @@ -3,8 +3,7 @@ import { InherentRiskChart } from '@/components/risks/charts/InherentRiskChart'; import { ResidualRiskChart } from '@/components/risks/charts/ResidualRiskChart'; import { RiskOverview } from '@/components/risks/risk-overview'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import { AttachmentEntityType, CommentEntityType } from '@comp/db/types'; +import { AttachmentEntityType, CommentEntityType, db } from '@db'; import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/risk/[riskId]/tasks/[taskId]/page.tsx b/apps/app/src/app/(app)/[orgId]/risk/[riskId]/tasks/[taskId]/page.tsx index e13f7fd63..c40ad82d6 100644 --- a/apps/app/src/app/(app)/[orgId]/risk/[riskId]/tasks/[taskId]/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/risk/[riskId]/tasks/[taskId]/page.tsx @@ -1,7 +1,7 @@ import { TaskOverview } from '@/components/risks/tasks/task-overview'; import { getUsers } from '@/hooks/use-users'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/api-keys/page.tsx b/apps/app/src/app/(app)/[orgId]/settings/api-keys/page.tsx index 9ea7f11cb..b09fd8a05 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/api-keys/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/settings/api-keys/page.tsx @@ -3,7 +3,7 @@ import { headers } from 'next/headers'; import { cache } from 'react'; import PageCore from '@/components/pages/PageCore.tsx'; -import { db } from '@comp/db'; +import { db } from '@db'; import type { Metadata } from 'next'; import { ApiKeysTable } from './components/table/ApiKeysTable'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/context-hub/ContextTable.tsx b/apps/app/src/app/(app)/[orgId]/settings/context-hub/ContextTable.tsx index 185098448..3381b4830 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/context-hub/ContextTable.tsx +++ b/apps/app/src/app/(app)/[orgId]/settings/context-hub/ContextTable.tsx @@ -3,7 +3,7 @@ import { DataTable } from '@/components/data-table/data-table'; import { DataTableToolbar } from '@/components/data-table/data-table-toolbar'; import { useDataTable } from '@/hooks/use-data-table'; import { Button } from '@comp/ui/button'; -import type { Context } from '@prisma/client'; +import type { Context } from '@db'; import { Plus } from 'lucide-react'; import { useQueryState } from 'nuqs'; import { useMemo } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-form.tsx b/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-form.tsx index 1209b31cb..f130f9428 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-form.tsx +++ b/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-form.tsx @@ -7,7 +7,7 @@ import { Button } from '@comp/ui/button'; import { Input } from '@comp/ui/input'; import { Label } from '@comp/ui/label'; import { Textarea } from '@comp/ui/textarea'; -import type { Context } from '@prisma/client'; +import type { Context } from '@db'; import { Loader2 } from 'lucide-react'; import { useTransition } from 'react'; import { toast } from 'sonner'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-hub-list.tsx b/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-hub-list.tsx index 3ce47d9fa..0883b99d4 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-hub-list.tsx +++ b/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-hub-list.tsx @@ -1,6 +1,6 @@ import { Badge } from '@comp/ui/badge'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@comp/ui/card'; -import type { Context } from '@prisma/client'; +import type { Context } from '@db'; export async function ContextHubList({ entries }: { entries: Context[] }) { return ( diff --git a/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-list.tsx b/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-list.tsx index 19c9e60cc..e8ca2081a 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-list.tsx +++ b/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/context-list.tsx @@ -29,7 +29,7 @@ import { DialogTitle, DialogTrigger, } from '@comp/ui/dialog'; -import type { Context } from '@prisma/client'; +import type { Context } from '@db'; import { Pencil, Plus } from 'lucide-react'; import { useState } from 'react'; import { toast } from 'sonner'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/table/ContextColumns.tsx b/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/table/ContextColumns.tsx index 940d3bdcb..636d78c23 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/table/ContextColumns.tsx +++ b/apps/app/src/app/(app)/[orgId]/settings/context-hub/components/table/ContextColumns.tsx @@ -12,7 +12,7 @@ import { AlertDialogTrigger, } from '@comp/ui/alert-dialog'; import { Button } from '@comp/ui/button'; -import type { Context } from '@prisma/client'; +import type { Context } from '@db'; import type { ColumnDef } from '@tanstack/react-table'; import { Trash2 } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/context-hub/data/getContextEntries.ts b/apps/app/src/app/(app)/[orgId]/settings/context-hub/data/getContextEntries.ts index 2eb242381..85e429cd8 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/context-hub/data/getContextEntries.ts +++ b/apps/app/src/app/(app)/[orgId]/settings/context-hub/data/getContextEntries.ts @@ -1,5 +1,5 @@ import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { cache } from 'react'; import 'server-only'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/page.tsx b/apps/app/src/app/(app)/[orgId]/settings/page.tsx index 23c95e5ee..8b3a39311 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/settings/page.tsx @@ -2,7 +2,7 @@ import { DeleteOrganization } from '@/components/forms/organization/delete-organ import { UpdateOrganizationName } from '@/components/forms/organization/update-organization-name'; import { UpdateOrganizationWebsite } from '@/components/forms/organization/update-organization-website'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { cache } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/check-dns-record.ts b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/check-dns-record.ts index 77591c99e..0c2cc28b1 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/check-dns-record.ts +++ b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/check-dns-record.ts @@ -2,7 +2,7 @@ import { authActionClient } from '@/actions/safe-action'; import { env } from '@/env.mjs'; -import { db } from '@comp/db'; +import { db } from '@db'; import { Vercel } from '@vercel/sdk'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/custom-domain.ts b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/custom-domain.ts index 49f522a20..c2039536e 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/custom-domain.ts +++ b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/custom-domain.ts @@ -3,7 +3,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { Vercel } from '@vercel/sdk'; import { revalidatePath, revalidateTag } from 'next/cache'; import { env } from 'node:process'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/is-friendly-available.ts b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/is-friendly-available.ts index 6ba4d69cd..aa4f1c2d5 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/is-friendly-available.ts +++ b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/is-friendly-available.ts @@ -1,7 +1,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { z } from 'zod'; const isFriendlyAvailableSchema = z.object({ diff --git a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/trust-portal-switch.ts b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/trust-portal-switch.ts index c73ce1d43..5c8522e2f 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/trust-portal-switch.ts +++ b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/trust-portal-switch.ts @@ -3,7 +3,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/update-trust-portal-frameworks.ts b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/update-trust-portal-frameworks.ts index 99dffb959..f898c53af 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/update-trust-portal-frameworks.ts +++ b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/actions/update-trust-portal-frameworks.ts @@ -1,7 +1,7 @@ 'use server'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { headers } from 'next/headers'; diff --git a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/components/TrustPortalDomain.tsx b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/components/TrustPortalDomain.tsx index 3e92c899e..62495cc81 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/components/TrustPortalDomain.tsx +++ b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/components/TrustPortalDomain.tsx @@ -58,7 +58,7 @@ export function TrustPortalDomain({ setIsCnameVerified(isCnameVerified === 'true'); setIsTxtVerified(isTxtVerified === 'true'); setIsVercelTxtVerified(isVercelTxtVerified === 'true'); - }, []); + }, [initialDomain]); const updateCustomDomain = useAction(customDomainAction, { onSuccess: (data) => { diff --git a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/components/TrustPortalSwitch.tsx b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/components/TrustPortalSwitch.tsx index f3578fc1d..6f69379b5 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/components/TrustPortalSwitch.tsx +++ b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/components/TrustPortalSwitch.tsx @@ -86,9 +86,12 @@ export function TrustPortalSwitch({ }, }); - const onSubmit = async (data: z.infer) => { - await trustPortalSwitch.execute(data); - }; + const onSubmit = useCallback( + async (data: z.infer) => { + await trustPortalSwitch.execute(data); + }, + [trustPortalSwitch], + ); const portalUrl = domainVerified ? `https://${domain}` : `https://trust.inc/${slug}`; @@ -121,7 +124,7 @@ export function TrustPortalSwitch({ form.setValue('contactEmail', debouncedContactEmail); autoSave('contactEmail', debouncedContactEmail); } - }, [debouncedContactEmail]); + }, [debouncedContactEmail, autoSave, form]); const handleContactEmailBlur = useCallback( (e: React.FocusEvent) => { @@ -145,7 +148,7 @@ export function TrustPortalSwitch({ } setFriendlyUrlStatus('checking'); checkFriendlyUrl.execute({ friendlyUrl: debouncedFriendlyUrl, orgId }); - }, [debouncedFriendlyUrl, orgId, friendlyUrl]); + }, [debouncedFriendlyUrl, orgId, friendlyUrl, checkFriendlyUrl]); useEffect(() => { if (checkFriendlyUrl.status === 'executing') return; if (checkFriendlyUrl.result?.data?.isAvailable === true) { @@ -158,7 +161,7 @@ export function TrustPortalSwitch({ } else if (checkFriendlyUrl.result?.data?.isAvailable === false) { setFriendlyUrlStatus('unavailable'); } - }, [checkFriendlyUrl.status, checkFriendlyUrl.result]); + }, [checkFriendlyUrl.status, checkFriendlyUrl.result, autoSave, form, debouncedFriendlyUrl]); const handleFriendlyUrlBlur = useCallback( (e: React.FocusEvent) => { diff --git a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/page.tsx b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/page.tsx index 4211c9407..8bf074bf0 100644 --- a/apps/app/src/app/(app)/[orgId]/settings/trust-portal/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/settings/trust-portal/page.tsx @@ -1,5 +1,5 @@ import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { cache } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/actions/delete-task.ts b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/actions/delete-task.ts index ba4f74ec1..c5950816b 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/actions/delete-task.ts +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/actions/delete-task.ts @@ -1,7 +1,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/AttachmentItem.tsx b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/AttachmentItem.tsx index b2c83fe9f..2b3d82fc6 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/AttachmentItem.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/AttachmentItem.tsx @@ -1,4 +1,3 @@ -import type { Attachment, AttachmentType } from '@comp/db/types'; import { AlertDialog, AlertDialogAction, @@ -12,6 +11,7 @@ import { } from '@comp/ui/alert-dialog'; import { Button } from '@comp/ui/button'; import { cn } from '@comp/ui/cn'; +import type { Attachment, AttachmentType } from '@db'; import { Loader2, Trash2 } from 'lucide-react'; import React from 'react'; import { getAttachmentIconAndColor } from '../utils/attachmentUtils'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/SingleTask.tsx b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/SingleTask.tsx index 03b5d44d5..edbbaa264 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/SingleTask.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/SingleTask.tsx @@ -1,7 +1,7 @@ 'use client'; -import type { Attachment, Member, Task, User } from '@comp/db/types'; import { Card } from '@comp/ui/card'; +import type { Attachment, Member, Task, User } from '@db'; import { useMemo, useState } from 'react'; import { CommentWithAuthor } from '../../../../../../components/comments/Comments'; import { updateTask } from '../../actions/updateTask'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskBody.tsx b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskBody.tsx index 88bafa3ce..226df8ea6 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskBody.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskBody.tsx @@ -1,11 +1,11 @@ 'use client'; import { uploadFile } from '@/actions/files/upload-file'; -import type { Attachment } from '@comp/db/types'; -import { AttachmentEntityType } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Label } from '@comp/ui/label'; import { Textarea } from '@comp/ui/textarea'; +import type { Attachment } from '@db'; +import { AttachmentEntityType } from '@db'; import { Loader2, Paperclip, Plus } from 'lucide-react'; import { useRouter } from 'next/navigation'; import type React from 'react'; @@ -106,7 +106,7 @@ export function TaskBody({ setIsUploading(false); } }, - [taskId, uploadFile, onAttachmentsChange, router], + [taskId, onAttachmentsChange, router], ); const triggerFileInput = () => { @@ -141,7 +141,7 @@ export function TaskBody({ onAttachmentsChange?.(); router.refresh(); }, - [deleteTaskAttachment, onAttachmentsChange, router], + [onAttachmentsChange, router], ); const isUploadingFile = isUploading; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskDeleteDialog.tsx b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskDeleteDialog.tsx index dd90e7c19..1f4feb880 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskDeleteDialog.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskDeleteDialog.tsx @@ -1,6 +1,5 @@ 'use client'; -import { Task } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Dialog, @@ -11,6 +10,7 @@ import { DialogTitle, } from '@comp/ui/dialog'; import { Form } from '@comp/ui/form'; +import { Task } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; import { Trash2 } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskMainContent.tsx b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskMainContent.tsx index 5a05bcbde..892519a7d 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskMainContent.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskMainContent.tsx @@ -1,7 +1,7 @@ 'use client'; -import { CommentEntityType, type Attachment, type Task } from '@comp/db/types'; import { Separator } from '@comp/ui/separator'; +import { CommentEntityType, type Attachment, type Task } from '@db'; import { useEffect, useState } from 'react'; import { useDebouncedCallback } from 'use-debounce'; import { CommentForm } from '../../../../../../components/comments/CommentForm'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskPropertiesSidebar.tsx b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskPropertiesSidebar.tsx index 985facf78..93bbb6f47 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskPropertiesSidebar.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/TaskPropertiesSidebar.tsx @@ -1,4 +1,3 @@ -import type { Departments, Member, Task, TaskFrequency, TaskStatus, User } from '@comp/db/types'; import { Avatar, AvatarFallback, AvatarImage } from '@comp/ui/avatar'; import { Badge } from '@comp/ui/badge'; import { Button } from '@comp/ui/button'; @@ -8,6 +7,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from '@comp/ui/dropdown-menu'; +import type { Departments, Member, Task, TaskFrequency, TaskStatus, User } from '@db'; import { MoreVertical, Trash2 } from 'lucide-react'; import { useState } from 'react'; import { TaskStatusIndicator } from '../../components/TaskStatusIndicator'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/commentUtils.tsx b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/commentUtils.tsx index 1a0e87202..c3f238b6b 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/commentUtils.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/commentUtils.tsx @@ -1,4 +1,4 @@ -import { AttachmentType } from '@comp/db/types'; +import { AttachmentType } from '@db'; import { FileAudio, FileQuestion, FileText, FileVideo } from 'lucide-react'; // Formats a date object into relative time string (e.g., "5m ago") diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/constants.ts b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/constants.ts index 1787b438d..40fba4180 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/constants.ts +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/components/constants.ts @@ -1,4 +1,4 @@ -import { Departments, TaskFrequency, TaskStatus } from '@comp/db/types'; +import { Departments, TaskFrequency, TaskStatus } from '@db'; // Define possible statuses based on the Prisma schema export const taskStatuses: TaskStatus[] = ['todo', 'in_progress', 'done', 'not_relevant']; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/layout.tsx b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/layout.tsx index 6c72e1541..bde7444b6 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/layout.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/layout.tsx @@ -1,5 +1,5 @@ import PageWithBreadcrumb from '@/components/pages/PageWithBreadcrumb'; -import { db } from '@comp/db'; +import { db } from '@db'; export default async function Layout({ children, diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/page.tsx b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/page.tsx index 772cf831e..45c031452 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/page.tsx @@ -1,7 +1,6 @@ import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import type { Attachment } from '@comp/db/types'; -import { AttachmentEntityType, CommentEntityType } from '@comp/db/types'; +import type { Attachment } from '@db'; +import { AttachmentEntityType, CommentEntityType, db } from '@db'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; import { CommentWithAuthor } from '../../../../../components/comments/Comments'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/utils/attachmentUtils.ts b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/utils/attachmentUtils.ts index a275a4d04..3be85ca9c 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/utils/attachmentUtils.ts +++ b/apps/app/src/app/(app)/[orgId]/tasks/[taskId]/utils/attachmentUtils.ts @@ -1,4 +1,4 @@ -import type { AttachmentType } from '@comp/db/types'; +import type { AttachmentType } from '@db'; import { FileAudio, FileIcon, FileImage, FileText, FileVideo } from 'lucide-react'; import type React from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/actions/deleteTaskAttachment.ts b/apps/app/src/app/(app)/[orgId]/tasks/actions/deleteTaskAttachment.ts index e6bc5c8cb..1c1ddae2f 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/actions/deleteTaskAttachment.ts +++ b/apps/app/src/app/(app)/[orgId]/tasks/actions/deleteTaskAttachment.ts @@ -3,8 +3,7 @@ import { BUCKET_NAME, extractS3KeyFromUrl, s3Client } from '@/app/s3'; import { auth } from '@/utils/auth'; import { DeleteObjectCommand } from '@aws-sdk/client-s3'; -import { db } from '@comp/db'; -import { Attachment, AttachmentEntityType } from '@comp/db/types'; +import { Attachment, AttachmentEntityType, db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/actions/getTaskAttachmentUrl.ts b/apps/app/src/app/(app)/[orgId]/tasks/actions/getTaskAttachmentUrl.ts index 238bb87f6..1f8f93867 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/actions/getTaskAttachmentUrl.ts +++ b/apps/app/src/app/(app)/[orgId]/tasks/actions/getTaskAttachmentUrl.ts @@ -4,8 +4,7 @@ import { BUCKET_NAME, extractS3KeyFromUrl, s3Client } from '@/app/s3'; // Import import { auth } from '@/utils/auth'; import { GetObjectCommand } from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; -import { db } from '@comp/db'; -import { AttachmentEntityType } from '@comp/db/types'; +import { AttachmentEntityType, db } from '@db'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/actions/updateTask.ts b/apps/app/src/app/(app)/[orgId]/tasks/actions/updateTask.ts index 050e3f846..25a30e5d9 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/actions/updateTask.ts +++ b/apps/app/src/app/(app)/[orgId]/tasks/actions/updateTask.ts @@ -1,8 +1,7 @@ 'use server'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import { Task } from '@comp/db/types'; +import { db, Task } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/actions/updateTaskOrder.ts b/apps/app/src/app/(app)/[orgId]/tasks/actions/updateTaskOrder.ts index 3dc55fe63..4134c612b 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/actions/updateTaskOrder.ts +++ b/apps/app/src/app/(app)/[orgId]/tasks/actions/updateTaskOrder.ts @@ -2,8 +2,7 @@ import type { ActionResponse } from '@/types/actions'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import { TaskStatus } from '@comp/db/types'; +import { db, TaskStatus } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/components/StatusGroup.tsx b/apps/app/src/app/(app)/[orgId]/tasks/components/StatusGroup.tsx index 12b35d153..baae7caea 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/components/StatusGroup.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/components/StatusGroup.tsx @@ -1,6 +1,6 @@ 'use client'; -import type { Member, Task, User } from '@comp/db/types'; +import type { Member, Task, User } from '@db'; import clsx from 'clsx'; import { useRef } from 'react'; import { useDrop } from 'react-dnd'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/components/TaskCard.tsx b/apps/app/src/app/(app)/[orgId]/tasks/components/TaskCard.tsx index 317077518..c03c04cb6 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/components/TaskCard.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/components/TaskCard.tsx @@ -1,6 +1,6 @@ 'use client'; -import type { Member, Task, TaskStatus, User } from '@comp/db/types'; +import type { Member, Task, TaskStatus, User } from '@db'; import Image from 'next/image'; import { usePathname, useRouter } from 'next/navigation'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/components/TaskList.tsx b/apps/app/src/app/(app)/[orgId]/tasks/components/TaskList.tsx index 252ea6d9e..fd56d3d78 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/components/TaskList.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/components/TaskList.tsx @@ -1,6 +1,6 @@ 'use client'; -import type { Member, Task, User } from '@comp/db/types'; +import type { Member, Task, User } from '@db'; import { useAction } from 'next-safe-action/hooks'; import { parseAsStringLiteral, useQueryState } from 'nuqs'; import { useCallback, useMemo } from 'react'; diff --git a/apps/app/src/app/(app)/[orgId]/tasks/components/TaskStatusIndicator.tsx b/apps/app/src/app/(app)/[orgId]/tasks/components/TaskStatusIndicator.tsx index e601b6498..6fac19f05 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/components/TaskStatusIndicator.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/components/TaskStatusIndicator.tsx @@ -1,6 +1,6 @@ import { STATUS_COLORS } from '@/components/status-indicator'; -import type { TaskStatus } from '@comp/db/types'; import { cn } from '@comp/ui/cn'; +import type { TaskStatus } from '@db'; import { Check, Circle, CircleX, Loader2 } from 'lucide-react'; interface TaskStatusIndicatorProps { diff --git a/apps/app/src/app/(app)/[orgId]/tasks/page.tsx b/apps/app/src/app/(app)/[orgId]/tasks/page.tsx index 1ce089fbb..67441bc66 100644 --- a/apps/app/src/app/(app)/[orgId]/tasks/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/tasks/page.tsx @@ -1,7 +1,6 @@ import PageWithBreadcrumb from '@/components/pages/PageWithBreadcrumb'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import { Role, TaskStatus } from '@comp/db/types'; +import { db, Role, TaskStatus } from '@db'; import { Metadata } from 'next'; import { headers } from 'next/headers'; import { TaskList } from './components/TaskList'; diff --git a/apps/app/src/app/(app)/[orgId]/tests/dashboard/actions/run-tests.ts b/apps/app/src/app/(app)/[orgId]/tests/dashboard/actions/run-tests.ts index c3cde9041..40f6768ba 100644 --- a/apps/app/src/app/(app)/[orgId]/tests/dashboard/actions/run-tests.ts +++ b/apps/app/src/app/(app)/[orgId]/tests/dashboard/actions/run-tests.ts @@ -2,7 +2,7 @@ import { sendIntegrationResults } from '@/jobs/tasks/integration/integration-results'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { runs, tasks } from '@trigger.dev/sdk/v3'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; diff --git a/apps/app/src/app/(app)/[orgId]/tests/dashboard/components/TestsLayout.tsx b/apps/app/src/app/(app)/[orgId]/tests/dashboard/components/TestsLayout.tsx index 0db3a1216..8ca481a46 100644 --- a/apps/app/src/app/(app)/[orgId]/tests/dashboard/components/TestsLayout.tsx +++ b/apps/app/src/app/(app)/[orgId]/tests/dashboard/components/TestsLayout.tsx @@ -1,9 +1,9 @@ 'use client'; -import { Integration } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@comp/ui/tabs'; +import { Integration } from '@db'; import { RefreshCw } from 'lucide-react'; import { useEffect, useState } from 'react'; import { toast } from 'sonner'; diff --git a/apps/app/src/app/(app)/[orgId]/tests/dashboard/page.tsx b/apps/app/src/app/(app)/[orgId]/tests/dashboard/page.tsx index 418386a4e..6fa80e69f 100644 --- a/apps/app/src/app/(app)/[orgId]/tests/dashboard/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/tests/dashboard/page.tsx @@ -1,5 +1,5 @@ import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { TestsLayout } from './components/TestsLayout'; diff --git a/apps/app/src/app/(app)/[orgId]/tests/page.tsx b/apps/app/src/app/(app)/[orgId]/tests/page.tsx index 3cde5d4b8..69b1eb625 100644 --- a/apps/app/src/app/(app)/[orgId]/tests/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/tests/page.tsx @@ -1,6 +1,6 @@ import { AppOnboarding } from '@/components/app-onboarding'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { Metadata } from 'next'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/(overview)/components/VendorsTable.tsx b/apps/app/src/app/(app)/[orgId]/vendors/(overview)/components/VendorsTable.tsx index c5f9c7a21..0da8d6548 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/(overview)/components/VendorsTable.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/(overview)/components/VendorsTable.tsx @@ -20,7 +20,7 @@ export function VendorsTable({ promises }: VendorsTableProps) { const [{ data: vendors, pageCount }, assignees] = React.use(promises); // Define columns memoized - const memoizedColumns = React.useMemo(() => columns, [orgId]); + const memoizedColumns = React.useMemo(() => columns, []); const { table } = useDataTable({ data: vendors, diff --git a/apps/app/src/app/(app)/[orgId]/vendors/(overview)/data/queries.ts b/apps/app/src/app/(app)/[orgId]/vendors/(overview)/data/queries.ts index 9d6568f3c..1579a8172 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/(overview)/data/queries.ts +++ b/apps/app/src/app/(app)/[orgId]/vendors/(overview)/data/queries.ts @@ -1,5 +1,5 @@ -import { db } from '@comp/db'; -import type { Member, User, Vendor } from '@comp/db/types'; +import type { Member, User, Vendor } from '@db'; +import { db } from '@db'; import { cache } from 'react'; import type { GetVendorsSchema } from './validations'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/(overview)/data/validations.ts b/apps/app/src/app/(app)/[orgId]/vendors/(overview)/data/validations.ts index c1b91d8b0..d284f0a13 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/(overview)/data/validations.ts +++ b/apps/app/src/app/(app)/[orgId]/vendors/(overview)/data/validations.ts @@ -1,5 +1,5 @@ import { getFiltersStateParser, getSortingStateParser } from '@/lib/parsers'; -import { Departments, Vendor, VendorStatus } from '@comp/db/types'; +import { Departments, Vendor, VendorStatus } from '@db'; import { createSearchParamsCache, parseAsInteger, diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/schema.ts b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/schema.ts index 95904d96f..fa93708db 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/schema.ts +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/schema.ts @@ -1,4 +1,4 @@ -import { TaskStatus, VendorCategory, VendorStatus } from '@comp/db/types'; +import { TaskStatus, VendorCategory, VendorStatus } from '@db'; import { z } from 'zod'; export const createVendorTaskCommentSchema = z.object({ diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/task/create-task-action.ts b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/task/create-task-action.ts index 67903d277..18039c216 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/task/create-task-action.ts +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/task/create-task-action.ts @@ -3,7 +3,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { createVendorTaskSchema } from '../schema'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/task/update-task-action.ts b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/task/update-task-action.ts index 491b3a6bd..9cb1ebd8d 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/task/update-task-action.ts +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/task/update-task-action.ts @@ -3,8 +3,8 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; -import type { TaskStatus } from '@comp/db/types'; +import type { TaskStatus } from '@db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { updateVendorTaskSchema } from '../schema'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-action.ts b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-action.ts index b6d3bece3..b7336da7c 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-action.ts +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-action.ts @@ -3,7 +3,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath, revalidateTag } from 'next/cache'; import { updateVendorSchema } from './schema'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-inherent-risk.ts b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-inherent-risk.ts index 718088dd7..835d943b4 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-inherent-risk.ts +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-inherent-risk.ts @@ -2,8 +2,7 @@ import { appErrors } from '@/lib/errors'; import type { ActionResponse } from '@/types/actions'; -import { db } from '@comp/db'; -import { Impact, Likelihood } from '@prisma/client'; +import { db, Impact, Likelihood } from '@db'; import { createSafeActionClient } from 'next-safe-action'; import { revalidatePath } from 'next/cache'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-residual-risk.ts b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-residual-risk.ts index 4414b0447..50a066d76 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-residual-risk.ts +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/actions/update-vendor-residual-risk.ts @@ -2,8 +2,7 @@ import { appErrors } from '@/lib/errors'; import type { ActionResponse } from '@/types/actions'; -import { db } from '@comp/db'; -import { Impact, Likelihood } from '@prisma/client'; +import { db, Impact, Likelihood } from '@db'; import { createSafeActionClient } from 'next-safe-action'; import { revalidatePath } from 'next/cache'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorInherentRiskChart.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorInherentRiskChart.tsx index 2cec194ac..886f636b8 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorInherentRiskChart.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorInherentRiskChart.tsx @@ -1,7 +1,7 @@ 'use client'; import { RiskMatrixChart } from '@/components/risks/charts/RiskMatrixChart'; -import type { Vendor } from '@comp/db/types'; +import type { Vendor } from '@db'; import { updateVendorInherentRisk } from '../actions/update-vendor-inherent-risk'; interface InherentRiskChartProps { diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorInherentRiskSheet.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorInherentRiskSheet.tsx index c820ce043..be0c9a485 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorInherentRiskSheet.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorInherentRiskSheet.tsx @@ -6,7 +6,7 @@ import { Drawer, DrawerContent, DrawerTitle } from '@comp/ui/drawer'; import { useMediaQuery } from '@comp/ui/hooks'; import { ScrollArea } from '@comp/ui/scroll-area'; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@comp/ui/sheet'; -import { Impact, Likelihood } from '@prisma/client'; +import { Impact, Likelihood } from '@db'; import { X } from 'lucide-react'; import { useQueryState } from 'nuqs'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorResidualRiskChart.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorResidualRiskChart.tsx index 425475d53..5a02945d8 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorResidualRiskChart.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorResidualRiskChart.tsx @@ -1,7 +1,7 @@ 'use client'; import { RiskMatrixChart } from '@/components/risks/charts/RiskMatrixChart'; -import type { Vendor } from '@comp/db/types'; +import type { Vendor } from '@db'; import { updateVendorResidualRisk } from '../actions/update-vendor-residual-risk'; interface ResidualRiskChartProps { diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorResidualRiskSheet.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorResidualRiskSheet.tsx index 8c7eb2eda..b7cd3fd55 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorResidualRiskSheet.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/VendorResidualRiskSheet.tsx @@ -1,12 +1,12 @@ 'use client'; import { ResidualRiskForm } from '@/app/(app)/[orgId]/vendors/[vendorId]/forms/risks/ResidualRiskForm'; -import type { Vendor } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Drawer, DrawerContent, DrawerTitle } from '@comp/ui/drawer'; import { useMediaQuery } from '@comp/ui/hooks'; import { ScrollArea } from '@comp/ui/scroll-area'; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@comp/ui/sheet'; +import type { Vendor } from '@db'; import { X } from 'lucide-react'; import { useQueryState } from 'nuqs'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/secondary-fields/secondary-fields.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/secondary-fields/secondary-fields.tsx index 3ec42ffee..6281f18fe 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/secondary-fields/secondary-fields.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/secondary-fields/secondary-fields.tsx @@ -1,8 +1,8 @@ 'use client'; -import type { GlobalVendors, Member, User, Vendor } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@comp/ui/card'; +import type { GlobalVendors, Member, User, Vendor } from '@db'; import { PencilIcon } from 'lucide-react'; import { useQueryState } from 'nuqs'; import { UpdateTitleAndDescriptionSheet } from '../title-and-description/update-title-and-description-sheet'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/secondary-fields/update-secondary-fields-form.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/secondary-fields/update-secondary-fields-form.tsx index ba6b2a066..4e030e3bc 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/secondary-fields/update-secondary-fields-form.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/secondary-fields/update-secondary-fields-form.tsx @@ -2,10 +2,10 @@ import { SelectAssignee } from '@/components/SelectAssignee'; import { VENDOR_STATUS_TYPES, VendorStatus } from '@/components/vendor-status'; -import { Member, type User, type Vendor, VendorCategory } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@comp/ui/form'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; +import { Member, type User, type Vendor, VendorCategory } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; import { Loader2 } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/create-vendor-task-form.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/create-vendor-task-form.tsx index 3c3fee71c..718b1d4f4 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/create-vendor-task-form.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/create-vendor-task-form.tsx @@ -1,7 +1,6 @@ 'use client'; import { SelectAssignee } from '@/components/SelectAssignee'; -import { Member, User } from '@comp/db/types'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@comp/ui/accordion'; import { Button } from '@comp/ui/button'; import { Calendar } from '@comp/ui/calendar'; @@ -10,6 +9,7 @@ import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from ' import { Input } from '@comp/ui/input'; import { Popover, PopoverContent, PopoverTrigger } from '@comp/ui/popover'; import { Textarea } from '@comp/ui/textarea'; +import { Member, User } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; import { format } from 'date-fns'; import { ArrowRightIcon, CalendarIcon } from 'lucide-react'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/client-columns.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/client-columns.tsx index 97c59d29a..86cdc92de 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/client-columns.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/client-columns.tsx @@ -1,6 +1,6 @@ -import { Task, TaskStatus } from '@comp/db/types'; import { Avatar, AvatarFallback, AvatarImage } from '@comp/ui/avatar'; import { Badge } from '@comp/ui/badge'; +import { Task, TaskStatus } from '@db'; import type { ColumnDef } from '@tanstack/react-table'; import { format } from 'date-fns'; import Link from 'next/link'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/columns.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/columns.tsx index 9bc8c3b64..e62d5d8df 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/columns.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/columns.tsx @@ -1,8 +1,8 @@ 'use client'; -import { VendorStatus } from '@comp/db/types'; import { Avatar, AvatarFallback, AvatarImage } from '@comp/ui/avatar'; import { Badge } from '@comp/ui/badge'; +import { VendorStatus } from '@db'; import type { ColumnDef } from '@tanstack/react-table'; import { format } from 'date-fns'; import Link from 'next/link'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/data-table.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/data-table.tsx index b3bd9546e..2ccaff2b3 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/data-table.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/data-table.tsx @@ -1,7 +1,7 @@ 'use client'; -import type { Task } from '@comp/db/types'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@comp/ui/table'; +import type { Task } from '@db'; import { flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; import { usePathname, useRouter, useSearchParams } from 'next/navigation'; import { useGetColumnHeaders } from './client-columns'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/filter-toolbar.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/filter-toolbar.tsx index 805f3647e..9e29ab6bd 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/filter-toolbar.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/tasks/data-table/filter-toolbar.tsx @@ -1,9 +1,9 @@ 'use client'; -import type { TaskStatus, User } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Input } from '@comp/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; +import type { TaskStatus, User } from '@db'; import { XIcon } from 'lucide-react'; import { usePathname, useRouter, useSearchParams } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/title-and-description.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/title-and-description.tsx index 34fdc8aaa..91e5c8286 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/title-and-description.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/title-and-description.tsx @@ -1,9 +1,9 @@ 'use client'; -import type { User, Vendor } from '@comp/db/types'; import { Alert, AlertDescription, AlertTitle } from '@comp/ui/alert'; import { Button } from '@comp/ui/button'; import { Icons } from '@comp/ui/icons'; +import type { User, Vendor } from '@db'; import { PencilIcon } from 'lucide-react'; import { useQueryState } from 'nuqs'; import { UpdateTitleAndDescriptionSheet } from './update-title-and-description-sheet'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/update-title-and-description-form.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/update-title-and-description-form.tsx index bef6c9cea..80c88a99e 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/update-title-and-description-form.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/update-title-and-description-form.tsx @@ -1,11 +1,11 @@ 'use client'; -import type { Vendor } from '@comp/db/types'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@comp/ui/accordion'; import { Button } from '@comp/ui/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@comp/ui/form'; import { Input } from '@comp/ui/input'; import { Textarea } from '@comp/ui/textarea'; +import type { Vendor } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; import { Loader2 } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/update-title-and-description-sheet.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/update-title-and-description-sheet.tsx index c1ea94293..ad743854b 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/update-title-and-description-sheet.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/components/title-and-description/update-title-and-description-sheet.tsx @@ -1,11 +1,11 @@ 'use client'; -import type { Vendor } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Drawer, DrawerContent, DrawerTitle } from '@comp/ui/drawer'; import { useMediaQuery } from '@comp/ui/hooks'; import { ScrollArea } from '@comp/ui/scroll-area'; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@comp/ui/sheet'; +import type { Vendor } from '@db'; import { X } from 'lucide-react'; import { useQueryState } from 'nuqs'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/forms/risks/InherentRiskForm.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/forms/risks/InherentRiskForm.tsx index f80a98146..83713894f 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/forms/risks/InherentRiskForm.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/forms/risks/InherentRiskForm.tsx @@ -5,8 +5,8 @@ import { Button } from '@comp/ui/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@comp/ui/form'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; import { useToast } from '@comp/ui/use-toast'; +import { Impact, Likelihood } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; -import { Impact, Likelihood } from '@prisma/client'; import { useQueryState } from 'nuqs'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/forms/risks/ResidualRiskForm.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/forms/risks/ResidualRiskForm.tsx index 25ec35e8e..768a8a792 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/forms/risks/ResidualRiskForm.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/forms/risks/ResidualRiskForm.tsx @@ -5,8 +5,8 @@ import { Button } from '@comp/ui/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@comp/ui/form'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; import { useToast } from '@comp/ui/use-toast'; +import { Impact, Likelihood } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; -import { Impact, Likelihood } from '@prisma/client'; import { useQueryState } from 'nuqs'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/page.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/page.tsx index 0943869da..f13a29856 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/page.tsx @@ -2,8 +2,7 @@ import PageWithBreadcrumb from '@/components/pages/PageWithBreadcrumb'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import { AttachmentEntityType, CommentEntityType } from '@comp/db/types'; +import { AttachmentEntityType, CommentEntityType, db } from '@db'; import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/secondary-fields/secondary-fields.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/secondary-fields/secondary-fields.tsx index 001509030..120151982 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/secondary-fields/secondary-fields.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/secondary-fields/secondary-fields.tsx @@ -1,11 +1,11 @@ 'use client'; import { SelectAssignee } from '@/components/SelectAssignee'; -import type { Member, Task, User } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@comp/ui/card'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@comp/ui/form'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; +import type { Member, Task, User } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; import { ArrowRightIcon, Loader2 } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/title/title.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/title/title.tsx index 63a190488..8eb3fd57c 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/title/title.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/title/title.tsx @@ -1,10 +1,10 @@ 'use client'; -import type { Member, Task, User } from '@comp/db/types'; import { Alert, AlertDescription, AlertTitle } from '@comp/ui/alert'; import { Button } from '@comp/ui/button'; import { Icons } from '@comp/ui/icons'; import { Sheet, SheetContent } from '@comp/ui/sheet'; +import type { Member, Task, User } from '@db'; import { PencilIcon } from 'lucide-react'; import dynamic from 'next/dynamic'; import { useQueryState } from 'nuqs'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/title/update-task-sheet.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/title/update-task-sheet.tsx index 265f28328..3d391c8e8 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/title/update-task-sheet.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/components/title/update-task-sheet.tsx @@ -1,13 +1,13 @@ 'use client'; import { SelectAssignee } from '@/components/SelectAssignee'; -import type { Member, Task, User } from '@comp/db/types'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@comp/ui/accordion'; import { Button } from '@comp/ui/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@comp/ui/form'; import { Input } from '@comp/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; import { Textarea } from '@comp/ui/textarea'; +import type { Member, Task, User } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; import { ArrowRightIcon } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/page.tsx b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/page.tsx index 49f22e4b0..2276efa3a 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/page.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/[vendorId]/tasks/[taskId]/page.tsx @@ -1,7 +1,7 @@ 'use server'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { notFound, redirect } from 'next/navigation'; import SecondaryFields from './components/secondary-fields/secondary-fields'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/actions/create-vendor-action.ts b/apps/app/src/app/(app)/[orgId]/vendors/actions/create-vendor-action.ts index 644dafa2d..ec18e43d7 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/actions/create-vendor-action.ts +++ b/apps/app/src/app/(app)/[orgId]/vendors/actions/create-vendor-action.ts @@ -2,8 +2,7 @@ import type { ActionResponse } from '@/types/actions'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import { type Vendor, VendorCategory, VendorStatus } from '@comp/db/types'; +import { db, type Vendor, VendorCategory, VendorStatus } from '@db'; import { createSafeActionClient } from 'next-safe-action'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/actions/search-global-vendors-action.ts b/apps/app/src/app/(app)/[orgId]/vendors/actions/search-global-vendors-action.ts index e775b0174..f345cdb06 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/actions/search-global-vendors-action.ts +++ b/apps/app/src/app/(app)/[orgId]/vendors/actions/search-global-vendors-action.ts @@ -1,7 +1,7 @@ 'use server'; import { authActionClient } from '@/actions/safe-action'; -import { db } from '@comp/db'; +import { db } from '@db'; import { z } from 'zod'; const schema = z.object({ diff --git a/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/components/charts/vendors-by-category.tsx b/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/components/charts/vendors-by-category.tsx index ff97dc061..314d4a3bf 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/components/charts/vendors-by-category.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/components/charts/vendors-by-category.tsx @@ -1,6 +1,5 @@ -import { db } from '@comp/db'; -import { VendorCategory } from '@comp/db/types'; import { Card, CardContent, CardHeader, CardTitle } from '@comp/ui/card'; +import { db, VendorCategory } from '@db'; import { VendorCategoryChart } from './category-chart'; const VENDOR_CATEGORIES = Object.values(VendorCategory); diff --git a/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/components/charts/vendors-by-status.tsx b/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/components/charts/vendors-by-status.tsx index bdf30e355..d98fe1ed7 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/components/charts/vendors-by-status.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/components/charts/vendors-by-status.tsx @@ -1,5 +1,5 @@ -import { db } from '@comp/db'; import { Card, CardContent, CardHeader, CardTitle } from '@comp/ui/card'; +import { db } from '@db'; import { StatusChart } from './status-chart'; interface Props { organizationId: string; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/layout.tsx b/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/layout.tsx index 75e9da01c..056f41476 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/layout.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/backup-overview/layout.tsx @@ -1,7 +1,7 @@ import { AppOnboarding } from '@/components/app-onboarding'; import { getServersideSession } from '@/lib/get-session'; -import { db } from '@comp/db'; import { SecondaryMenu } from '@comp/ui/secondary-menu'; +import { db } from '@db'; import { headers } from 'next/headers'; import { Suspense, cache } from 'react'; import { CreateVendorSheet } from '../components/create-vendor-sheet'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/components/create-vendor-form.tsx b/apps/app/src/app/(app)/[orgId]/vendors/components/create-vendor-form.tsx index f3a675283..4dbefb8ae 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/components/create-vendor-form.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/components/create-vendor-form.tsx @@ -3,14 +3,14 @@ import { researchVendorAction } from '@/actions/research-vendor'; import { SelectAssignee } from '@/components/SelectAssignee'; import { useDebouncedCallback } from '@/hooks/use-debounced-callback'; -import type { GlobalVendors } from '@comp/db/types'; -import { type Member, type User, VendorCategory, VendorStatus } from '@comp/db/types'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@comp/ui/accordion'; import { Button } from '@comp/ui/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@comp/ui/form'; import { Input } from '@comp/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; import { Textarea } from '@comp/ui/textarea'; +import type { GlobalVendors } from '@db'; +import { type Member, type User, VendorCategory, VendorStatus } from '@db'; import { zodResolver } from '@hookform/resolvers/zod'; import { ArrowRightIcon } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; diff --git a/apps/app/src/app/(app)/[orgId]/vendors/components/create-vendor-sheet.tsx b/apps/app/src/app/(app)/[orgId]/vendors/components/create-vendor-sheet.tsx index a926d607e..32d037400 100644 --- a/apps/app/src/app/(app)/[orgId]/vendors/components/create-vendor-sheet.tsx +++ b/apps/app/src/app/(app)/[orgId]/vendors/components/create-vendor-sheet.tsx @@ -1,11 +1,11 @@ 'use client'; -import { Member, User } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Drawer, DrawerContent, DrawerTitle } from '@comp/ui/drawer'; import { useMediaQuery } from '@comp/ui/hooks'; import { ScrollArea } from '@comp/ui/scroll-area'; import { Sheet, SheetContent, SheetHeader, SheetTitle } from '@comp/ui/sheet'; +import { Member, User } from '@db'; import { X } from 'lucide-react'; import { useQueryState } from 'nuqs'; import { CreateVendorForm } from './create-vendor-form'; diff --git a/apps/app/src/app/(app)/invite/[code]/page.tsx b/apps/app/src/app/(app)/invite/[code]/page.tsx index ccc91eb32..ad2b78e88 100644 --- a/apps/app/src/app/(app)/invite/[code]/page.tsx +++ b/apps/app/src/app/(app)/invite/[code]/page.tsx @@ -1,7 +1,7 @@ import { getOrganizations } from '@/data/getOrganizations'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import type { Organization } from '@comp/db/types'; +import type { Organization } from '@db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { notFound, redirect } from 'next/navigation'; import { AcceptInvite } from '../../setup/components/accept-invite'; diff --git a/apps/app/src/app/(app)/no-access/page.tsx b/apps/app/src/app/(app)/no-access/page.tsx index c9fab7482..392b34cb7 100644 --- a/apps/app/src/app/(app)/no-access/page.tsx +++ b/apps/app/src/app/(app)/no-access/page.tsx @@ -1,6 +1,6 @@ import { OrganizationSwitcher } from '@/components/organization-switcher'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import Link from 'next/link'; import { redirect } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/onboarding/[orgId]/layout.tsx b/apps/app/src/app/(app)/onboarding/[orgId]/layout.tsx index 1e7cb570e..8152247a3 100644 --- a/apps/app/src/app/(app)/onboarding/[orgId]/layout.tsx +++ b/apps/app/src/app/(app)/onboarding/[orgId]/layout.tsx @@ -1,7 +1,7 @@ import { CheckoutCompleteDialog } from '@/components/dialogs/checkout-complete-dialog'; import { OnboardingLayout } from '@/components/onboarding/OnboardingLayout'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { notFound } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/onboarding/[orgId]/page.tsx b/apps/app/src/app/(app)/onboarding/[orgId]/page.tsx index 747faa504..a2e03e646 100644 --- a/apps/app/src/app/(app)/onboarding/[orgId]/page.tsx +++ b/apps/app/src/app/(app)/onboarding/[orgId]/page.tsx @@ -1,5 +1,5 @@ import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { notFound, redirect } from 'next/navigation'; import { PostPaymentOnboarding } from '../components/PostPaymentOnboarding'; diff --git a/apps/app/src/app/(app)/onboarding/actions/complete-onboarding.ts b/apps/app/src/app/(app)/onboarding/actions/complete-onboarding.ts index a3e062534..6d19b4d30 100644 --- a/apps/app/src/app/(app)/onboarding/actions/complete-onboarding.ts +++ b/apps/app/src/app/(app)/onboarding/actions/complete-onboarding.ts @@ -4,7 +4,7 @@ import { authActionClient } from '@/actions/safe-action'; import { steps } from '@/app/(app)/setup/lib/constants'; import { createFleetLabelForOrg } from '@/jobs/tasks/device/create-fleet-label-for-org'; import { onboardOrganization as onboardOrganizationTask } from '@/jobs/tasks/onboarding/onboard-organization'; -import { db } from '@comp/db'; +import { db } from '@db'; import { tasks } from '@trigger.dev/sdk/v3'; import { revalidatePath } from 'next/cache'; import { cookies, headers } from 'next/headers'; diff --git a/apps/app/src/app/(app)/onboarding/components/PostPaymentOnboarding.tsx b/apps/app/src/app/(app)/onboarding/components/PostPaymentOnboarding.tsx index 00e33e6a4..1cc297926 100644 --- a/apps/app/src/app/(app)/onboarding/components/PostPaymentOnboarding.tsx +++ b/apps/app/src/app/(app)/onboarding/components/PostPaymentOnboarding.tsx @@ -2,10 +2,10 @@ import { OnboardingStepInput } from '@/app/(app)/setup/components/OnboardingStepInput'; import { LogoSpinner } from '@/components/logo-spinner'; -import type { Organization } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@comp/ui/card'; import { Form, FormControl, FormField, FormItem, FormMessage } from '@comp/ui/form'; +import type { Organization } from '@db'; import { ArrowLeft, ArrowRight } from 'lucide-react'; import { useEffect } from 'react'; import { usePostPaymentOnboarding } from '../hooks/usePostPaymentOnboarding'; diff --git a/apps/app/src/app/(app)/onboarding/hooks/usePostPaymentOnboarding.ts b/apps/app/src/app/(app)/onboarding/hooks/usePostPaymentOnboarding.ts index 28a355745..988eb0cbf 100644 --- a/apps/app/src/app/(app)/onboarding/hooks/usePostPaymentOnboarding.ts +++ b/apps/app/src/app/(app)/onboarding/hooks/usePostPaymentOnboarding.ts @@ -64,7 +64,7 @@ export function usePostPaymentOnboarding({ setStepIndex(initialStep); setIsLoading(false); - }, []); + }, [savedAnswers, savedStepIndex]); const step = postPaymentSteps[stepIndex]; const stepSchema = z.object({ diff --git a/apps/app/src/app/(app)/setup/[setupId]/page.tsx b/apps/app/src/app/(app)/setup/[setupId]/page.tsx index 40277da13..13ade6e4d 100644 --- a/apps/app/src/app/(app)/setup/[setupId]/page.tsx +++ b/apps/app/src/app/(app)/setup/[setupId]/page.tsx @@ -1,6 +1,6 @@ import { getOrganizations } from '@/data/getOrganizations'; import { auth } from '@/utils/auth'; -import type { Organization } from '@comp/db/types'; +import type { Organization } from '@db'; import { Metadata } from 'next'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/setup/actions/create-organization-minimal.ts b/apps/app/src/app/(app)/setup/actions/create-organization-minimal.ts index 990743bbf..12d326ef6 100644 --- a/apps/app/src/app/(app)/setup/actions/create-organization-minimal.ts +++ b/apps/app/src/app/(app)/setup/actions/create-organization-minimal.ts @@ -7,7 +7,7 @@ import { isHubSpotConfigured } from '@/hubspot/api-client'; import { createOrUpdateCompany, findCompanyByDomain } from '@/hubspot/companies'; import { findContactByEmail } from '@/hubspot/contacts'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { revalidatePath } from 'next/cache'; import { headers } from 'next/headers'; import { z } from 'zod'; diff --git a/apps/app/src/app/(app)/setup/actions/create-organization.ts b/apps/app/src/app/(app)/setup/actions/create-organization.ts index a143c891f..4b5b7fa65 100644 --- a/apps/app/src/app/(app)/setup/actions/create-organization.ts +++ b/apps/app/src/app/(app)/setup/actions/create-organization.ts @@ -9,7 +9,7 @@ import { findContactByEmail } from '@/hubspot/contacts'; import { createFleetLabelForOrg } from '@/jobs/tasks/device/create-fleet-label-for-org'; import { onboardOrganization as onboardOrganizationTask } from '@/jobs/tasks/onboarding/onboard-organization'; import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { tasks } from '@trigger.dev/sdk/v3'; import { revalidatePath } from 'next/cache'; import { cookies, headers } from 'next/headers'; diff --git a/apps/app/src/app/(app)/setup/components/FrameworkSelection.tsx b/apps/app/src/app/(app)/setup/components/FrameworkSelection.tsx index 1ff61cb6a..27fbd5ca4 100644 --- a/apps/app/src/app/(app)/setup/components/FrameworkSelection.tsx +++ b/apps/app/src/app/(app)/setup/components/FrameworkSelection.tsx @@ -1,8 +1,8 @@ 'use client'; import { FrameworkCard } from '@/components/framework-card'; -import type { FrameworkEditorFramework } from '@comp/db/types'; -import { useEffect, useState } from 'react'; +import type { FrameworkEditorFramework } from '@db'; +import { useEffect, useRef, useState } from 'react'; interface FrameworkSelectionProps { value: string[]; @@ -15,6 +15,14 @@ export function FrameworkSelection({ value, onChange, onLoadingChange }: Framewo Pick[] >([]); const [isLoading, setIsLoading] = useState(true); + const onChangeRef = useRef(onChange); + const valueRef = useRef(value); + + // Keep refs up to date + useEffect(() => { + onChangeRef.current = onChange; + valueRef.current = value; + }); useEffect(() => { async function fetchFrameworks() { @@ -24,12 +32,6 @@ export function FrameworkSelection({ value, onChange, onLoadingChange }: Framewo if (!response.ok) throw new Error('Failed to fetch frameworks'); const data = await response.json(); setFrameworks(data.frameworks); - - // Auto-select the first visible framework if none selected - const visibleFrameworks = data.frameworks.filter((f: any) => f.visible); - if (visibleFrameworks.length > 0 && (!value || value.length === 0)) { - onChange([visibleFrameworks[0].id]); - } } catch (error) { console.error('Error fetching frameworks:', error); } finally { @@ -39,7 +41,17 @@ export function FrameworkSelection({ value, onChange, onLoadingChange }: Framewo } fetchFrameworks(); - }, [onLoadingChange]); // Removed onChange and value from dependencies to prevent infinite loop + }, []); // Only run once on mount + + // Separate effect for auto-selection - only when frameworks first load + useEffect(() => { + if (frameworks.length > 0 && (!valueRef.current || valueRef.current.length === 0)) { + const visibleFrameworks = frameworks.filter((f) => f.visible); + if (visibleFrameworks.length > 0) { + onChangeRef.current([visibleFrameworks[0].id]); + } + } + }, [frameworks]); // Only depend on frameworks if (isLoading) { return null; diff --git a/apps/app/src/app/(app)/setup/components/OrganizationSetupForm.tsx b/apps/app/src/app/(app)/setup/components/OrganizationSetupForm.tsx index 3022bd333..04fd50184 100644 --- a/apps/app/src/app/(app)/setup/components/OrganizationSetupForm.tsx +++ b/apps/app/src/app/(app)/setup/components/OrganizationSetupForm.tsx @@ -2,9 +2,9 @@ import { changeOrganizationAction } from '@/actions/change-organization'; import { LogoSpinner } from '@/components/logo-spinner'; -import type { Organization } from '@comp/db/types'; import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@comp/ui/card'; import { Form, FormControl, FormField, FormItem, FormMessage } from '@comp/ui/form'; +import type { Organization } from '@db'; import { useAction } from 'next-safe-action/hooks'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; diff --git a/apps/app/src/app/(app)/setup/loading/[orgId]/page.tsx b/apps/app/src/app/(app)/setup/loading/[orgId]/page.tsx index 4df98884c..12c934b43 100644 --- a/apps/app/src/app/(app)/setup/loading/[orgId]/page.tsx +++ b/apps/app/src/app/(app)/setup/loading/[orgId]/page.tsx @@ -1,7 +1,7 @@ import { SetupLoadingStep } from '@/app/(app)/setup/components/SetupLoadingStep'; import { getOrganizations } from '@/data/getOrganizations'; import { auth } from '@/utils/auth'; -import type { Organization } from '@comp/db/types'; +import type { Organization } from '@db'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; diff --git a/apps/app/src/app/(app)/upgrade/[orgId]/page.tsx b/apps/app/src/app/(app)/upgrade/[orgId]/page.tsx index f62e36c7d..f3c621015 100644 --- a/apps/app/src/app/(app)/upgrade/[orgId]/page.tsx +++ b/apps/app/src/app/(app)/upgrade/[orgId]/page.tsx @@ -1,5 +1,5 @@ import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; import { BookingStep } from './components/booking-step'; diff --git a/apps/app/src/app/(app)/upgrade/components/MinimalOrganizationSwitcher.tsx b/apps/app/src/app/(app)/upgrade/components/MinimalOrganizationSwitcher.tsx index ad31eccc7..d5878ea08 100644 --- a/apps/app/src/app/(app)/upgrade/components/MinimalOrganizationSwitcher.tsx +++ b/apps/app/src/app/(app)/upgrade/components/MinimalOrganizationSwitcher.tsx @@ -1,7 +1,6 @@ 'use client'; import { changeOrganizationAction } from '@/actions/change-organization'; -import type { Organization } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { DropdownMenu, @@ -9,6 +8,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from '@comp/ui/dropdown-menu'; +import type { Organization } from '@db'; import { Check, ChevronsUpDown, Loader2 } from 'lucide-react'; import { useAction } from 'next-safe-action/hooks'; import { useRouter } from 'next/navigation'; diff --git a/apps/app/src/app/api/auth/test-db/route.ts b/apps/app/src/app/api/auth/test-db/route.ts index 076a7a1d5..2f0e0036d 100644 --- a/apps/app/src/app/api/auth/test-db/route.ts +++ b/apps/app/src/app/api/auth/test-db/route.ts @@ -1,5 +1,4 @@ -import { db } from '@comp/db'; -import { Departments } from '@prisma/client'; +import { db, Departments } from '@db'; import { NextResponse } from 'next/server'; export const dynamic = 'force-dynamic'; diff --git a/apps/app/src/app/api/auth/test-grant-access/route.ts b/apps/app/src/app/api/auth/test-grant-access/route.ts index 3c5f8373f..3bd83621c 100644 --- a/apps/app/src/app/api/auth/test-grant-access/route.ts +++ b/apps/app/src/app/api/auth/test-grant-access/route.ts @@ -1,4 +1,4 @@ -import { db } from '@comp/db'; +import { db } from '@db'; import { NextRequest, NextResponse } from 'next/server'; // Force dynamic rendering for this route diff --git a/apps/app/src/app/api/auth/test-login/route.ts b/apps/app/src/app/api/auth/test-login/route.ts index 4ca6f6e3c..25330a9b1 100644 --- a/apps/app/src/app/api/auth/test-login/route.ts +++ b/apps/app/src/app/api/auth/test-login/route.ts @@ -1,6 +1,5 @@ import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; -import { Departments } from '@prisma/client'; +import { db, Departments } from '@db'; import { NextRequest, NextResponse } from 'next/server'; // Force dynamic rendering for this route diff --git a/apps/app/src/app/api/frameworks/route.ts b/apps/app/src/app/api/frameworks/route.ts index 8a9d0523e..cf2a98a7c 100644 --- a/apps/app/src/app/api/frameworks/route.ts +++ b/apps/app/src/app/api/frameworks/route.ts @@ -1,4 +1,4 @@ -import { db } from '@comp/db'; +import { db } from '@db'; import { NextResponse } from 'next/server'; export async function GET() { diff --git a/apps/app/src/app/api/health/route.ts b/apps/app/src/app/api/health/route.ts index dd7897706..67eca7ec7 100644 --- a/apps/app/src/app/api/health/route.ts +++ b/apps/app/src/app/api/health/route.ts @@ -1,4 +1,4 @@ -import { db } from '@comp/db'; +import { db } from '@db'; import { NextResponse } from 'next/server'; export const dynamic = 'force-dynamic'; diff --git a/apps/app/src/app/api/retool/reset-org/route.ts b/apps/app/src/app/api/retool/reset-org/route.ts index 7d038e678..46d634309 100644 --- a/apps/app/src/app/api/retool/reset-org/route.ts +++ b/apps/app/src/app/api/retool/reset-org/route.ts @@ -1,5 +1,5 @@ import { initializeOrganization } from '@/actions/organization/lib/initialize-organization'; -import { db } from '@comp/db'; +import { db } from '@db'; import { type NextRequest, NextResponse } from 'next/server'; // Configure this route to use Node.js runtime instead of Edge diff --git a/apps/app/src/app/api/v1/employees/[id]/route.ts b/apps/app/src/app/api/v1/employees/[id]/route.ts deleted file mode 100644 index 92f9ec66c..000000000 --- a/apps/app/src/app/api/v1/employees/[id]/route.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { getOrganizationFromApiKey } from '@/lib/api-key'; -import { db } from '@comp/db'; -import { type NextRequest, NextResponse } from 'next/server'; - -// Configure this route to use Node.js runtime instead of Edge -export const runtime = 'nodejs'; - -/** - * GET /api/v1/people/:id - * - * Get a single employee by ID for the organization associated with the API key - * - * Headers: - * - Authorization: Bearer {api_key} or X-API-Key: {api_key} - * - * Path Parameters: - * - id: string - The ID of the employee to fetch - * - * Returns: - * - 200: { success: true, data: Employee } - * - 401: { success: false, error: "Invalid or missing API key" } - * - 404: { success: false, error: "Employee not found" } - * - 500: { success: false, error: "Failed to fetch employee" } - */ -export async function GET(request: NextRequest, { params }: { params: Promise<{ id: string }> }) { - // Get the organization ID from the API key - const { organizationId, errorResponse } = await getOrganizationFromApiKey(request); - - // If there's an error response, return it - if (errorResponse) { - return errorResponse; - } - - try { - const employeeId = (await params).id; - - // Fetch the employee - const employee = await db.member.findFirst({ - where: { - id: employeeId, - organizationId: organizationId!, - }, - select: { - id: true, - user: { - select: { - name: true, - email: true, - }, - }, - department: true, - isActive: true, - }, - }); - - // If employee not found, return 404 - if (!employee) { - return NextResponse.json( - { - success: false, - error: 'Employee not found', - }, - { status: 404 }, - ); - } - - return NextResponse.json({ - success: true, - data: employee, - }); - } catch (error) { - console.error('Error fetching employee:', error); - return NextResponse.json( - { - success: false, - error: 'Failed to fetch employee', - }, - { status: 500 }, - ); - } -} - -/** - * DELETE /api/v1/people/:id - * - * Delete an employee by ID for the organization associated with the API key - * - * Headers: - * - Authorization: Bearer {api_key} or X-API-Key: {api_key} - * - * Path Parameters: - * - id: string - The ID of the employee to delete - * - * Returns: - * - 200: { success: true, data: { message: string } } - * - 401: { success: false, error: string } - * - 404: { success: false, error: string } - * - 500: { success: false, error: string } - */ -export async function DELETE( - request: NextRequest, - { params }: { params: Promise<{ id: string }> }, -) { - // Get the organization ID from the API key - const { organizationId, errorResponse } = await getOrganizationFromApiKey(request); - - // If there's an error response, return it - if (errorResponse) { - return errorResponse; - } - - try { - const employeeId = (await params).id; - - // Check if the employee exists and belongs to the organization - const existingEmployee = await db.member.findFirst({ - where: { - id: employeeId, - organizationId: organizationId!, - }, - }); - - if (!existingEmployee) { - return NextResponse.json( - { - success: false, - error: 'Employee not found', - }, - { status: 404 }, - ); - } - - // Delete the employee - await db.member.delete({ - where: { - id: employeeId, - }, - }); - - return NextResponse.json({ - success: true, - data: { - message: 'Employee deleted successfully', - }, - }); - } catch (error) { - console.error('Error deleting employee:', error); - return NextResponse.json( - { - success: false, - error: 'Failed to delete employee', - }, - { status: 500 }, - ); - } -} diff --git a/apps/app/src/app/api/v1/employees/route.ts b/apps/app/src/app/api/v1/employees/route.ts deleted file mode 100644 index 1f773fffd..000000000 --- a/apps/app/src/app/api/v1/employees/route.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { getOrganizationFromApiKey } from '@/lib/api-key'; -import { db } from '@comp/db'; -import { Departments, Role } from '@comp/db/types'; -import { type NextRequest, NextResponse } from 'next/server'; -import { z } from 'zod'; - -// Configure this route to use Node.js runtime instead of Edge -export const runtime = 'nodejs'; - -// Define the schema for query parameters -const queryParamsSchema = z.object({ - active: z - .string() - .optional() - .transform((val) => val === 'true'), - department: z.nativeEnum(Departments).optional(), - search: z.string().optional(), -}); - -// Define the schema for employee creation -const employeeCreateSchema = z.object({ - name: z.string().min(1, { message: 'Name is required' }), - email: z.string().email({ message: 'Valid email is required' }), - department: z.nativeEnum(Departments).optional().default(Departments.none), - isActive: z.boolean().optional().default(true), - externalEmployeeId: z.string().optional().nullable(), - role: z.string().optional().default('member'), -}); - -// Type for the validated query parameters -type QueryParams = z.infer; - -// Type for the validated employee creation data -type EmployeeCreateInput = z.infer; - -/** - * GET /api/v1/people - * - * Get all employees for the organization associated with the API key - * - * Headers: - * - Authorization: Bearer {api_key} or X-API-Key: {api_key} - * - * Query Parameters: - * - active: boolean - Filter by active status (optional) - * - department: string - Filter by department (optional) - * - search: string - Search by name or email (optional) - * - * Returns: - * - 200: { success: true, data: Employee[] } - * - 401: { error: "Invalid or missing API key" } - * - 400: { error: "Validation failed", details: {...} } - * - 500: { error: "Failed to fetch employees" } - */ -export async function GET(request: NextRequest) { - // Get the organization ID from the API key - const { organizationId, errorResponse } = await getOrganizationFromApiKey(request); - - // If there's an error response, return it - if (errorResponse) { - return errorResponse; - } - - try { - // Get query parameters - const searchParams = request.nextUrl.searchParams; - - // Create an object from the search params - const queryParamsObj = { - active: searchParams.get('active') || undefined, - department: searchParams.get('department') || undefined, - search: searchParams.get('search') || undefined, - }; - - // Validate query parameters - const validationResult = queryParamsSchema.safeParse(queryParamsObj); - - if (!validationResult.success) { - return NextResponse.json( - { - error: 'Validation failed', - details: validationResult.error.format(), - }, - { status: 400 }, - ); - } - - // Extract validated query parameters - const { active, department, search } = validationResult.data; - - // Build the where clause - const where: any = { - organizationId: organizationId!, - }; - - // Add active filter if provided - if (active !== undefined) { - where.isActive = active; - } - - // Add department filter if provided - if (department) { - where.department = department; - } - - // Query members with their associated users - const members = await db.member.findMany({ - where, - include: { - user: true, - }, - orderBy: { - user: { - name: 'asc', - }, - }, - }); - - // Apply search filter if provided (we need to do this in memory due to nested user data) - let filteredMembers = members; - if (search) { - const searchLower = search.toLowerCase(); - filteredMembers = members.filter( - (member) => - member.user.name.toLowerCase().includes(searchLower) || - member.user.email.toLowerCase().includes(searchLower), - ); - } - - // Format the response to include both member and user data - const formattedEmployees = filteredMembers.map((member) => ({ - id: member.id, - userId: member.userId, - name: member.user.name, - email: member.user.email, - department: member.department, - isActive: member.isActive, - role: member.role, - createdAt: member.createdAt.toISOString(), - })); - - return NextResponse.json({ success: true, data: formattedEmployees }); - } catch (error) { - console.error('Error fetching employees:', error); - return NextResponse.json({ error: 'Failed to fetch employees' }, { status: 500 }); - } -} - -/** - * POST /api/v1/people - * - * Create a new employee for the organization associated with the API key - * - * Headers: - * - Authorization: Bearer {api_key} or X-API-Key: {api_key} - * - * Body: - * - name: string - The name of the employee (required) - * - email: string - The email of the employee (required) - * - department: Departments - The department of the employee (optional, defaults to "none") - * - isActive: boolean - Whether the employee is active (optional, defaults to true) - * - externalEmployeeId: string - External employee ID (optional) - * - role: string - Role in the organization (optional, defaults to "member") - * - * Returns: - * - 200: { success: true, data: Employee } - * - 400: { error: "Validation failed", details: {...} } - * - 401: { error: "Invalid or missing API key" } - * - 500: { error: "Failed to create employee" } - */ -export async function POST(request: NextRequest) { - // Get the organization ID from the API key - const { organizationId, errorResponse } = await getOrganizationFromApiKey(request); - - // If there's an error response, return it - if (errorResponse) { - return errorResponse; - } - - try { - const body = await request.json(); - - // Validate the request body against the schema - const validationResult = employeeCreateSchema.safeParse(body); - - if (!validationResult.success) { - // Return validation errors - return NextResponse.json( - { - success: false, - error: 'Validation failed', - details: validationResult.error.format(), - }, - { status: 400 }, - ); - } - - // Extract validated data - const validatedData: EmployeeCreateInput = validationResult.data; - - // Start a transaction to ensure both user and member are created successfully - const result = await db.$transaction(async (tx) => { - // Check if a user with this email already exists - let user = await tx.user.findUnique({ - where: { - email: validatedData.email, - }, - }); - - // Create the user if they don't exist already - if (!user) { - user = await tx.user.create({ - data: { - name: validatedData.name, - email: validatedData.email, - emailVerified: false, // Default as not verified - createdAt: new Date(), - updatedAt: new Date(), - }, - }); - } - - // Create the member record to link the user to the organization - const member = await tx.member.create({ - data: { - userId: user.id, - organizationId: organizationId!, - role: validatedData.role as Role, - department: validatedData.department, - isActive: validatedData.isActive ?? true, - createdAt: new Date(), - }, - include: { - user: true, - }, - }); - - return { - id: member.id, - userId: user.id, - name: user.name, - email: user.email, - department: member.department, - isActive: member.isActive, - role: member.role, - createdAt: member.createdAt.toISOString(), - }; - }); - - return NextResponse.json({ - success: true, - data: result, - }); - } catch (error) { - console.error('Error creating employee:', error); - return NextResponse.json( - { - success: false, - error: 'Failed to create employee', - }, - { status: 500 }, - ); - } -} diff --git a/apps/app/src/app/api/v1/risks/[id]/route.ts b/apps/app/src/app/api/v1/risks/[id]/route.ts deleted file mode 100644 index 4b705ef27..000000000 --- a/apps/app/src/app/api/v1/risks/[id]/route.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { getOrganizationFromApiKey } from '@/lib/api-key'; -import { db } from '@comp/db'; -import { type NextRequest, NextResponse } from 'next/server'; - -// Configure this route to use Node.js runtime instead of Edge -export const runtime = 'nodejs'; - -/** - * GET /api/v1/risks/:id - * - * Get a single risk by ID for the organization associated with the API key - * - * Headers: - * - Authorization: Bearer {api_key} or X-API-Key: {api_key} - * - * Path Parameters: - * - id: string - The ID of the risk to fetch - * - * Returns: - * - 200: { success: true, data: Risk } - * - 401: { success: false, error: "Invalid or missing API key" } - * - 404: { success: false, error: "Risk not found" } - * - 500: { success: false, error: "Failed to fetch risk" } - */ -export async function GET(request: NextRequest, { params }: { params: Promise<{ id: string }> }) { - // Get the organization ID from the API key - const { organizationId, errorResponse } = await getOrganizationFromApiKey(request); - - // If there's an error response, return it - if (errorResponse) { - return errorResponse; - } - - try { - const riskId = (await params).id; - - // Fetch the risk - const risk = await db.risk.findFirst({ - where: { - id: riskId, - organizationId: organizationId!, - }, - select: { - id: true, - title: true, - description: true, - category: true, - department: true, - status: true, - likelihood: true, - impact: true, - residualLikelihood: true, - residualImpact: true, - createdAt: true, - updatedAt: true, - assigneeId: true, - treatmentStrategy: true, - treatmentStrategyDescription: true, - assignee: { - select: { - id: true, - user: { - select: { - name: true, - email: true, - }, - }, - }, - }, - }, - }); - - // If risk not found, return 404 - if (!risk) { - return NextResponse.json( - { - success: false, - error: 'Risk not found', - }, - { status: 404 }, - ); - } - - // Fetch tasks for this risk - const tasks = await db.task.findMany({ - where: { - risks: { - some: { - id: riskId, - }, - }, - organizationId: organizationId!, - }, - select: { - id: true, - title: true, - description: true, - status: true, - createdAt: true, - updatedAt: true, - assigneeId: true, - assignee: { - select: { - user: { - select: { - name: true, - email: true, - }, - }, - }, - }, - }, - orderBy: { - createdAt: 'desc', - }, - }); - - // Format dates for JSON response - const formattedRisk = { - ...risk, - createdAt: risk.createdAt.toISOString(), - updatedAt: risk.updatedAt.toISOString(), - tasks: tasks.map((task) => ({ - ...task, - createdAt: task.createdAt.toISOString(), - updatedAt: task.updatedAt.toISOString(), - })), - }; - - return NextResponse.json({ - success: true, - data: formattedRisk, - }); - } catch (error) { - console.error('Error fetching risk:', error); - return NextResponse.json( - { - success: false, - error: 'Failed to fetch risk', - }, - { status: 500 }, - ); - } -} - -/** - * DELETE /api/v1/risks/:id - * - * Delete a risk by ID for the organization associated with the API key - * - * Headers: - * - Authorization: Bearer {api_key} or X-API-Key: {api_key} - * - * Path Parameters: - * - id: string - The ID of the risk to delete - * - * Returns: - * - 200: { success: true, data: { message: string } } - * - 401: { success: false, error: string } - * - 404: { success: false, error: string } - * - 500: { success: false, error: string } - */ -export async function DELETE( - request: NextRequest, - { params }: { params: Promise<{ id: string }> }, -) { - // Get the organization ID from the API key - const { organizationId, errorResponse } = await getOrganizationFromApiKey(request); - - // If there's an error response, return it - if (errorResponse) { - return errorResponse; - } - - try { - const riskId = (await params).id; - - // Check if the risk exists and belongs to the organization - const existingRisk = await db.risk.findFirst({ - where: { - id: riskId, - organizationId: organizationId!, - }, - }); - - if (!existingRisk) { - return NextResponse.json( - { - success: false, - error: 'Risk not found', - }, - { status: 404 }, - ); - } - - // Delete the risk - await db.risk.delete({ - where: { - id: riskId, - }, - }); - - return NextResponse.json({ - success: true, - data: { - message: 'Risk deleted successfully', - }, - }); - } catch (error) { - console.error('Error deleting risk:', error); - return NextResponse.json( - { - success: false, - error: 'Failed to delete risk', - }, - { status: 500 }, - ); - } -} diff --git a/apps/app/src/app/api/v1/risks/route.ts b/apps/app/src/app/api/v1/risks/route.ts deleted file mode 100644 index 4b9b11b08..000000000 --- a/apps/app/src/app/api/v1/risks/route.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { getOrganizationFromApiKey } from '@/lib/api-key'; -import { db } from '@comp/db'; -import { Departments, Impact, Likelihood, RiskCategory, RiskStatus } from '@comp/db/types'; -import { type NextRequest, NextResponse } from 'next/server'; -import { z } from 'zod'; - -// Configure this route to use Node.js runtime instead of Edge -export const runtime = 'nodejs'; - -// Define the schema for query parameters -const queryParamsSchema = z.object({ - status: z.nativeEnum(RiskStatus).optional(), - category: z.nativeEnum(RiskCategory).optional(), - department: z.nativeEnum(Departments).optional(), - search: z.string().optional(), -}); - -// Define the schema for risk creation -const riskCreateSchema = z.object({ - title: z.string().min(1, { message: 'Title is required' }), - description: z.string().min(1, { message: 'Description is required' }), - category: z.nativeEnum(RiskCategory), - department: z.nativeEnum(Departments).optional(), - status: z.nativeEnum(RiskStatus).optional().default(RiskStatus.open), - likelihood: z.nativeEnum(Likelihood).optional().default(Likelihood.very_unlikely), - impact: z.nativeEnum(Impact).optional().default(Impact.insignificant), - residualLikelihood: z.nativeEnum(Likelihood).optional().default(Likelihood.very_unlikely), - residualImpact: z.nativeEnum(Impact).optional().default(Impact.insignificant), - assigneeId: z.string().optional().nullable(), -}); - -// Type for the validated risk creation data -type RiskCreateInput = z.infer; - -/** - * GET /api/v1/risks - * - * Get all risks for the organization associated with the API key - * - * Headers: - * - Authorization: Bearer {api_key} or X-API-Key: {api_key} - * - * Query Parameters: - * - status: string - Filter by risk status (optional) - * - category: string - Filter by risk category (optional) - * - department: string - Filter by department (optional) - * - search: string - Search by title (optional) - * - * Returns: - * - 200: { success: true, data: Risk[] } - * - 401: { error: "Invalid or missing API key" } - * - 400: { error: "Validation failed", details: {...} } - * - 500: { error: "Failed to fetch risks" } - */ -export async function GET(request: NextRequest) { - // Get the organization ID from the API key - const { organizationId, errorResponse } = await getOrganizationFromApiKey(request); - - // If there's an error response, return it - if (errorResponse) { - return errorResponse; - } - - try { - // Get query parameters - const searchParams = request.nextUrl.searchParams; - - // Create an object from the search params - const queryParamsObj = { - status: searchParams.get('status') || undefined, - category: searchParams.get('category') || undefined, - department: searchParams.get('department') || undefined, - search: searchParams.get('search') || undefined, - }; - - // Validate query parameters - const validationResult = queryParamsSchema.safeParse(queryParamsObj); - - if (!validationResult.success) { - return NextResponse.json( - { - success: false, - error: 'Validation failed', - details: validationResult.error.format(), - }, - { status: 400 }, - ); - } - - // Extract validated query parameters - const { status, category, department, search } = validationResult.data; - - // Build the where clause - const where: any = { - organizationId: organizationId!, - }; - - // Add status filter if provided - if (status) { - where.status = status; - } - - // Add category filter if provided - if (category) { - where.category = category; - } - - // Add department filter if provided - if (department) { - where.department = department; - } - - // Add search filter if provided - if (search) { - where.OR = [ - { - title: { - contains: search, - mode: 'insensitive', - }, - }, - { - description: { - contains: search, - mode: 'insensitive', - }, - }, - ]; - } - - // Fetch risks - const risks = await db.risk.findMany({ - where, - select: { - id: true, - title: true, - description: true, - category: true, - department: true, - status: true, - likelihood: true, - impact: true, - residualLikelihood: true, - residualImpact: true, - createdAt: true, - updatedAt: true, - assigneeId: true, - assignee: { - select: { - id: true, - user: { - select: { - name: true, - email: true, - }, - }, - }, - }, - }, - orderBy: { - updatedAt: 'desc', - }, - }); - - // Format dates for JSON response - const formattedRisks = risks.map((risk) => ({ - ...risk, - createdAt: risk.createdAt.toISOString(), - updatedAt: risk.updatedAt.toISOString(), - })); - - return NextResponse.json({ success: true, data: formattedRisks }); - } catch (error) { - console.error('Error fetching risks:', error); - return NextResponse.json({ success: false, error: 'Failed to fetch risks' }, { status: 500 }); - } -} - -/** - * POST /api/v1/risks - * - * Create a new risk for the organization associated with the API key - * - * Headers: - * - Authorization: Bearer {api_key} or X-API-Key: {api_key} - * - * Body: - * - title: string - The title of the risk (required) - * - description: string - The description of the risk (required) - * - category: RiskCategory - The category of the risk (required) - * - department: Departments - The department associated with the risk (optional) - * - status: RiskStatus - The status of the risk (optional, defaults to "open") - * - likelihood: Likelihood - The likelihood score (optional, defaults to "very_unlikely") - * - impact: Impact - The impact score (optional, defaults to "insignificant") - * - residualLikelihood: Likelihood - The residual likelihood score (optional, defaults to "very_unlikely") - * - residualImpact: Impact - The residual impact score (optional, defaults to "insignificant") - * - assigneeId: string - The ID of the user who owns the risk (optional) - * - * Returns: - * - 200: { success: true, data: Risk } - * - 400: { success: false, error: "Validation failed", details: {...} } - * - 401: { success: false, error: "Invalid or missing API key" } - * - 500: { success: false, error: "Failed to create risk" } - */ -export async function POST(request: NextRequest) { - // Get the organization ID from the API key - const { organizationId, errorResponse } = await getOrganizationFromApiKey(request); - - // If there's an error response, return it - if (errorResponse) { - return errorResponse; - } - - try { - const body = await request.json(); - - // Validate the request body against the schema - const validationResult = riskCreateSchema.safeParse(body); - - if (!validationResult.success) { - // Return validation errors - return NextResponse.json( - { - success: false, - error: 'Validation failed', - details: validationResult.error.format(), - }, - { status: 400 }, - ); - } - - // Extract validated data - const validatedData: RiskCreateInput = validationResult.data; - - // Create the risk using the organization ID from the API key - const risk = await db.risk.create({ - data: { - ...validatedData, - organizationId: organizationId!, - }, - }); - - // Format dates for JSON response - const formattedRisk = { - ...risk, - createdAt: risk.createdAt.toISOString(), - updatedAt: risk.updatedAt.toISOString(), - }; - - return NextResponse.json({ - success: true, - data: formattedRisk, - }); - } catch (error) { - console.error('Error creating risk:', error); - return NextResponse.json( - { - success: false, - error: 'Failed to create risk', - }, - { status: 500 }, - ); - } -} diff --git a/apps/app/src/app/api/v1/route-config.ts b/apps/app/src/app/api/v1/route-config.ts deleted file mode 100644 index 1573bc6f5..000000000 --- a/apps/app/src/app/api/v1/route-config.ts +++ /dev/null @@ -1,2 +0,0 @@ -// This file contains shared configuration for API routes -export const runtime = 'nodejs'; diff --git a/apps/app/src/app/page.tsx b/apps/app/src/app/page.tsx index 3be2e01e4..e62c8bf81 100644 --- a/apps/app/src/app/page.tsx +++ b/apps/app/src/app/page.tsx @@ -1,5 +1,5 @@ import { auth } from '@/utils/auth'; -import { db } from '@comp/db'; +import { db } from '@db'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; diff --git a/apps/app/src/components/SelectAssignee.tsx b/apps/app/src/components/SelectAssignee.tsx index 1861b2e45..b6f801f65 100644 --- a/apps/app/src/components/SelectAssignee.tsx +++ b/apps/app/src/components/SelectAssignee.tsx @@ -1,7 +1,7 @@ import { authClient } from '@/utils/auth-client'; -import { Member, User } from '@comp/db/types'; import { Avatar, AvatarFallback, AvatarImage } from '@comp/ui/avatar'; import { Select, SelectContent, SelectItem, SelectTrigger } from '@comp/ui/select'; +import { Member, User } from '@db'; import { UserIcon } from 'lucide-react'; import { useEffect, useState } from 'react'; diff --git a/apps/app/src/components/ai-work-preview.tsx b/apps/app/src/components/ai-work-preview.tsx index c16556799..02bb4d6a3 100644 --- a/apps/app/src/components/ai-work-preview.tsx +++ b/apps/app/src/components/ai-work-preview.tsx @@ -224,7 +224,7 @@ export function AiWorkPreview() { return () => { if (timeoutId) clearTimeout(timeoutId); }; - }, [currentIndex, workItems.length]); + }, [currentIndex, workItems.length, workItems]); // Get visible items (previous, current, next) const getVisibleItems = () => { diff --git a/apps/app/src/components/comments/CommentForm.tsx b/apps/app/src/components/comments/CommentForm.tsx index c36fd474d..f1ce2b680 100644 --- a/apps/app/src/components/comments/CommentForm.tsx +++ b/apps/app/src/components/comments/CommentForm.tsx @@ -2,11 +2,11 @@ import { createComment } from '@/actions/comments/createComment'; import { authClient } from '@/utils/auth-client'; -import type { CommentEntityType } from '@comp/db/types'; import { Button } from '@comp/ui/button'; import { Input } from '@comp/ui/input'; import { Label } from '@comp/ui/label'; import { Textarea } from '@comp/ui/textarea'; +import type { CommentEntityType } from '@db'; import clsx from 'clsx'; import { ArrowUp, Loader2, Paperclip } from 'lucide-react'; import { useParams, useRouter } from 'next/navigation'; @@ -62,68 +62,65 @@ export function CommentForm({ entityId, entityType }: CommentFormProps) { fileInputRef.current?.click(); }; - const handleFileSelect = useCallback( - (event: React.ChangeEvent) => { - const files = event.target.files; - if (!files || files.length === 0) return; + const handleFileSelect = useCallback((event: React.ChangeEvent) => { + const files = event.target.files; + if (!files || files.length === 0) return; - setIsUploading(true); - setIsLoading(true); + setIsUploading(true); + setIsLoading(true); - // Helper to process a single file - const processFile = (file: File) => { - return new Promise((resolve) => { - // Add file size check here - const MAX_FILE_SIZE_MB = 5; - const MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_MB * 1024 * 1024; - if (file.size > MAX_FILE_SIZE_BYTES) { - toast.error(`File "${file.name}" exceeds the ${MAX_FILE_SIZE_MB}MB limit.`); - return resolve(); // Skip processing this file - } + // Helper to process a single file + const processFile = (file: File) => { + return new Promise((resolve) => { + // Add file size check here + const MAX_FILE_SIZE_MB = 5; + const MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_MB * 1024 * 1024; + if (file.size > MAX_FILE_SIZE_BYTES) { + toast.error(`File "${file.name}" exceeds the ${MAX_FILE_SIZE_MB}MB limit.`); + return resolve(); // Skip processing this file + } - const reader = new FileReader(); - reader.onloadend = () => { - const dataUrlResult = reader.result as string; - const base64Data = dataUrlResult?.split(',')[1]; - if (!base64Data) { - toast.error(`Failed to read file data for ${file.name}`); - return resolve(); - } + const reader = new FileReader(); + reader.onloadend = () => { + const dataUrlResult = reader.result as string; + const base64Data = dataUrlResult?.split(',')[1]; + if (!base64Data) { + toast.error(`Failed to read file data for ${file.name}`); + return resolve(); + } - // Store file in memory instead of uploading - setPendingAttachments((prev) => [ - ...prev, - { - id: `temp-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, // Generate temporary ID - name: file.name, - fileType: file.type, - fileData: base64Data, - }, - ]); - toast.success(`File "${file.name}" ready for attachment.`); - setIsLoading(false); - resolve(); - }; - reader.onerror = () => { - toast.error(`Error reading file: ${file.name}`); - setIsLoading(false); - resolve(); - }; - reader.readAsDataURL(file); - }); - }; + // Store file in memory instead of uploading + setPendingAttachments((prev) => [ + ...prev, + { + id: `temp-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, // Generate temporary ID + name: file.name, + fileType: file.type, + fileData: base64Data, + }, + ]); + toast.success(`File "${file.name}" ready for attachment.`); + setIsLoading(false); + resolve(); + }; + reader.onerror = () => { + toast.error(`Error reading file: ${file.name}`); + setIsLoading(false); + resolve(); + }; + reader.readAsDataURL(file); + }); + }; - // Process all files sequentially - (async () => { - for (const file of Array.from(files)) { - await processFile(file); - } - setIsUploading(false); - if (fileInputRef.current) fileInputRef.current.value = ''; - })(); - }, - [entityId, entityType, pendingAttachments.length], - ); + // Process all files sequentially + (async () => { + for (const file of Array.from(files)) { + await processFile(file); + } + setIsUploading(false); + if (fileInputRef.current) fileInputRef.current.value = ''; + })(); + }, []); const handleRemovePendingAttachment = (attachmentIdToRemove: string) => { setPendingAttachments((prev) => prev.filter((att) => att.id !== attachmentIdToRemove)); @@ -219,7 +216,9 @@ export function CommentForm({ entityId, entityType }: CommentFormProps) { placeholder="Leave a comment..." className="resize-none border-none p-4 shadow-none" value={newComment} - onChange={(e) => setNewComment(e.target.value)} + onChange={(e: { target: { value: React.SetStateAction } }) => + setNewComment(e.target.value) + } disabled={isLoading} onKeyDown={handleKeyDown} rows={2} diff --git a/apps/app/src/components/comments/CommentItem.tsx b/apps/app/src/components/comments/CommentItem.tsx index 8c6ee12f2..e0b0bcc10 100644 --- a/apps/app/src/components/comments/CommentItem.tsx +++ b/apps/app/src/components/comments/CommentItem.tsx @@ -5,8 +5,6 @@ import { deleteCommentAttachment } from '@/actions/comments/deleteCommentAttachm import { getCommentAttachmentUrl } from '@/actions/comments/getCommentAttachmentUrl'; // Import action import { updateComment } from '@/actions/comments/updateComment'; import { uploadFile } from '@/actions/files/upload-file'; -import type { AttachmentType } from '@comp/db/types'; -import { AttachmentEntityType } from '@comp/db/types'; // Import AttachmentEntityType import { Avatar, AvatarFallback, AvatarImage } from '@comp/ui/avatar'; import { Button } from '@comp/ui/button'; import { Card, CardContent } from '@comp/ui/card'; @@ -18,6 +16,8 @@ import { } from '@comp/ui/dropdown-menu'; import { Label } from '@comp/ui/label'; import { Textarea } from '@comp/ui/textarea'; +import type { AttachmentType } from '@db'; +import { AttachmentEntityType } from '@db'; // Import AttachmentEntityType import { Loader2, // Import Loader2 MoreHorizontal, // Import Paperclip @@ -358,7 +358,9 @@ export function CommentItem({ comment }: { comment: CommentWithAuthor }) { ) : (