improvement(code-structure): move db into separate package (#1364)

* improvement(code-structure): move db into separate package

* make db separate package

* remake bun lock

* update imports to not maintain two separate ones

* fix CI for tests by adding dummy url

* vercel build fix attempt

* update bun lock

* regenerate bun lock

* fix mocks

* remove db commands from apps/sim package json
This commit is contained in:
Vikhyath Mondreti
2025-09-17 15:41:13 -07:00
committed by GitHub
parent 325a666a8b
commit 9de7a00373
400 changed files with 1054 additions and 966 deletions

View File

@@ -32,6 +32,7 @@ jobs:
env:
NODE_OPTIONS: '--no-warnings'
NEXT_PUBLIC_APP_URL: 'https://www.sim.ai'
DATABASE_URL: 'postgresql://postgres:postgres@localhost:5432/simstudio'
ENCRYPTION_KEY: '7cf672e460e430c1fba707575c2b0e2ad5a99dddf9b7b7e3b5646e630861db1c' # dummy key for CI only
run: bun run test
@@ -39,6 +40,7 @@ jobs:
env:
NODE_OPTIONS: '--no-warnings'
NEXT_PUBLIC_APP_URL: 'https://www.sim.ai'
DATABASE_URL: 'postgresql://postgres:postgres@localhost:5432/simstudio'
STRIPE_SECRET_KEY: 'dummy_key_for_ci_only'
STRIPE_WEBHOOK_SECRET: 'dummy_secret_for_ci_only'
RESEND_API_KEY: 'dummy_key_for_ci_only'
@@ -71,7 +73,7 @@ jobs:
run: bun install
- name: Apply migrations
working-directory: ./apps/sim
working-directory: ./packages/db
env:
DATABASE_URL: ${{ github.ref == 'refs/heads/main' && secrets.DATABASE_URL || secrets.STAGING_DATABASE_URL }}
run: bunx drizzle-kit migrate
run: bunx drizzle-kit migrate --config=./drizzle.config.ts

View File

@@ -125,10 +125,11 @@ Update your `.env` file with the database URL:
DATABASE_URL="postgresql://postgres:your_password@localhost:5432/simstudio"
```
4. Set up the database:
4. Set up the database (from packages/db):
```bash
bunx drizzle-kit migrate
cd packages/db
bunx drizzle-kit migrate --config=./drizzle.config.ts
```
5. Start the development servers:

View File

@@ -349,7 +349,7 @@ export function mockExecutionDependencies() {
})),
}))
vi.mock('@/db', () => ({
vi.mock('@sim/db', () => ({
db: mockDb,
}))
}
@@ -395,7 +395,7 @@ export async function getMockedDependencies() {
const workflowUtilsModule = await import('@/lib/workflows/utils')
const executorModule = await import('@/executor')
const serializerModule = await import('@/serializer')
const dbModule = await import('@/db')
const dbModule = await import('@sim/db')
return {
decryptSecret: utilsModule.decryptSecret,
@@ -428,7 +428,7 @@ export function mockScheduleStatusDb({
schedule?: any[]
workflow?: any[]
} = {}) {
vi.doMock('@/db', () => {
vi.doMock('@sim/db', () => {
let callCount = 0
const select = vi.fn().mockImplementation(() => ({
@@ -469,7 +469,7 @@ export function mockScheduleExecuteDb({
workflowRecord?: any
envRecord?: any
}): void {
vi.doMock('@/db', () => {
vi.doMock('@sim/db', () => {
const select = vi.fn().mockImplementation(() => ({
from: vi.fn().mockImplementation((table: any) => {
const tbl = String(table)
@@ -544,7 +544,7 @@ export function mockAuth(user: MockUser = mockUser): MockAuthResult {
* Mock common schema patterns
*/
export function mockCommonSchemas() {
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
workflowFolder: {
id: 'id',
userId: 'userId',
@@ -597,7 +597,7 @@ export function mockDrizzleOrm() {
* Mock knowledge-related database schemas
*/
export function mockKnowledgeSchemas() {
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
knowledgeBase: {
id: 'kb_id',
userId: 'user_id',
@@ -1091,7 +1091,7 @@ export function createMockDatabase(options: MockDatabaseOptions = {}) {
transaction: createTransactionMock(),
}
vi.doMock('@/db', () => ({ db: mockDb }))
vi.doMock('@sim/db', () => ({ db: mockDb }))
return {
mockDb,

View File

@@ -34,13 +34,11 @@ describe('OAuth Connections API Route', () => {
getSession: mockGetSession,
}))
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: mockDb,
}))
vi.doMock('@/db/schema', () => ({
account: { userId: 'userId', providerId: 'providerId' },
user: { email: 'email', id: 'id' },
eq: vi.fn((field, value) => ({ field, value, type: 'eq' })),
}))
vi.doMock('drizzle-orm', () => ({

View File

@@ -1,11 +1,10 @@
import { account, db, user } from '@sim/db'
import { eq } from 'drizzle-orm'
import { jwtDecode } from 'jwt-decode'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { account, user } from '@/db/schema'
const logger = createLogger('OAuthConnectionsAPI')

View File

@@ -45,11 +45,11 @@ describe('OAuth Credentials API Route', () => {
parseProvider: mockParseProvider,
}))
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: mockDb,
}))
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
account: { userId: 'userId', providerId: 'providerId' },
user: { email: 'email', id: 'id' },
}))

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { account, user, workflow } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { jwtDecode } from 'jwt-decode'
import { type NextRequest, NextResponse } from 'next/server'
@@ -7,8 +9,6 @@ import type { OAuthService } from '@/lib/oauth/oauth'
import { parseProvider } from '@/lib/oauth/oauth'
import { getUserEntityPermissions } from '@/lib/permissions/utils'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { account, user, workflow } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -32,11 +32,11 @@ describe('OAuth Disconnect API Route', () => {
getSession: mockGetSession,
}))
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: mockDb,
}))
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
account: { userId: 'userId', providerId: 'providerId' },
}))

View File

@@ -1,10 +1,10 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { and, eq, like, or } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -31,7 +31,7 @@ describe('OAuth Utils', () => {
getSession: vi.fn().mockResolvedValue(mockSession),
}))
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: mockDb,
}))

View File

@@ -1,9 +1,9 @@
import { db } from '@sim/db'
import { account, workflow } from '@sim/db/schema'
import { and, desc, eq } from 'drizzle-orm'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { refreshOAuthToken } from '@/lib/oauth/oauth'
import { db } from '@/db'
import { account, workflow } from '@/db/schema'
const logger = createLogger('OAuthUtilsAPI')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { subscription as subscriptionTable, user } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { requireStripeClient } from '@/lib/billing/stripe-client'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { subscription as subscriptionTable, user } from '@/db/schema'
const logger = createLogger('BillingPortal')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { member, userStats } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { getSimplifiedBillingSummary } from '@/lib/billing/core/billing'
import { getOrganizationBillingData } from '@/lib/billing/core/organization'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { member, userStats } from '@/db/schema'
const logger = createLogger('UnifiedBillingAPI')

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { userStats } from '@sim/db/schema'
import { eq, sql } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
@@ -5,8 +7,6 @@ import { checkInternalApiKey } from '@/lib/copilot/utils'
import { isBillingEnabled } from '@/lib/environment'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { userStats } from '@/db/schema'
import { calculateCost } from '@/providers/utils'
const logger = createLogger('billing-update-cost')

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { chat } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import type { NextRequest } from 'next/server'
import { z } from 'zod'
@@ -8,8 +10,6 @@ import { getRedisClient, markMessageAsProcessed, releaseLock } from '@/lib/redis
import { generateRequestId } from '@/lib/utils'
import { addCorsHeaders, setChatAuthCookie } from '@/app/api/chat/utils'
import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { chat } from '@/db/schema'
const logger = createLogger('ChatOtpAPI')

View File

@@ -84,7 +84,7 @@ describe('Chat Subdomain API Route', () => {
}),
}))
vi.doMock('@/db', () => {
vi.doMock('@sim/db', () => {
const mockSelect = vi.fn().mockImplementation((fields) => {
if (fields && fields.isDeployed !== undefined) {
return {
@@ -153,7 +153,7 @@ describe('Chat Subdomain API Route', () => {
})
it('should return 404 for non-existent subdomain', async () => {
vi.doMock('@/db', () => {
vi.doMock('@sim/db', () => {
const mockLimit = vi.fn().mockReturnValue([])
const mockWhere = vi.fn().mockReturnValue({ limit: mockLimit })
const mockFrom = vi.fn().mockReturnValue({ where: mockWhere })
@@ -181,7 +181,7 @@ describe('Chat Subdomain API Route', () => {
})
it('should return 403 for inactive chat', async () => {
vi.doMock('@/db', () => {
vi.doMock('@sim/db', () => {
const mockLimit = vi.fn().mockReturnValue([
{
id: 'chat-id',
@@ -299,7 +299,7 @@ describe('Chat Subdomain API Route', () => {
it('should return 503 when workflow is not available', async () => {
// Override the default workflow result to return non-deployed
vi.doMock('@/db', () => {
vi.doMock('@sim/db', () => {
// Track call count to return different results
let callCount = 0

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { chat, workflow } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
@@ -10,8 +12,6 @@ import {
validateChatAuth,
} from '@/app/api/chat/utils'
import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { chat, workflow } from '@/db/schema'
const logger = createLogger('ChatSubdomainAPI')

View File

@@ -30,7 +30,7 @@ describe('Chat Edit API Route', () => {
mockSet.mockReturnValue({ where: mockWhere })
mockDelete.mockReturnValue({ where: mockWhere })
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: {
select: mockSelect,
update: mockUpdate,
@@ -38,7 +38,7 @@ describe('Chat Edit API Route', () => {
},
}))
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
chat: { id: 'id', subdomain: 'subdomain', userId: 'userId' },
}))

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { chat } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import type { NextRequest } from 'next/server'
import { z } from 'zod'
@@ -8,8 +10,6 @@ import { getEmailDomain } from '@/lib/urls/utils'
import { encryptSecret } from '@/lib/utils'
import { checkChatAccess } from '@/app/api/chat/utils'
import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { chat } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -29,14 +29,14 @@ describe('Chat API Route', () => {
mockInsert.mockReturnValue({ values: mockValues })
mockValues.mockReturnValue({ returning: mockReturning })
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: {
select: mockSelect,
insert: mockInsert,
},
}))
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
chat: { userId: 'userId', subdomain: 'subdomain' },
workflow: { id: 'id', userId: 'userId', isDeployed: 'isDeployed' },
}))

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { chat } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import type { NextRequest } from 'next/server'
import { v4 as uuidv4 } from 'uuid'
@@ -9,8 +11,6 @@ import { createLogger } from '@/lib/logs/console/logger'
import { encryptSecret } from '@/lib/utils'
import { checkWorkflowAccessForChatCreation } from '@/app/api/chat/utils'
import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { chat } from '@/db/schema'
const logger = createLogger('ChatAPI')

View File

@@ -27,14 +27,14 @@ describe('Subdomain Validation API Route', () => {
mockWhere.mockReturnValue({ limit: mockLimit })
// Mock the database
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: {
select: mockSelect,
},
}))
// Mock the schema
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
chat: {
subdomain: 'subdomain',
},

View File

@@ -1,10 +1,10 @@
import { db } from '@sim/db'
import { chat } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { chat } from '@/db/schema'
const logger = createLogger('SubdomainValidateAPI')

View File

@@ -7,7 +7,7 @@ import type { NextResponse } from 'next/server'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { env } from '@/lib/env'
vi.mock('@/db', () => ({
vi.mock('@sim/db', () => ({
db: {
select: vi.fn(),
update: vi.fn(),

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { chat, userStats, workflow } from '@sim/db/schema'
import { eq, sql } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { v4 as uuidv4 } from 'uuid'
@@ -12,8 +14,6 @@ import { processStreamingBlockLogs } from '@/lib/tokenization'
import { getEmailDomain } from '@/lib/urls/utils'
import { decryptSecret, generateRequestId } from '@/lib/utils'
import { getBlock } from '@/blocks'
import { db } from '@/db'
import { chat, userStats, workflow } from '@/db/schema'
import { Executor } from '@/executor'
import type { BlockLog, ExecutionResult } from '@/executor/types'
import { Serializer } from '@/serializer'

View File

@@ -1,9 +1,9 @@
import { db } from '@sim/db'
import { userStats } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalApiKey } from '@/lib/copilot/utils'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { userStats } from '@/db/schema'
const logger = createLogger('CopilotApiKeysValidate')

View File

@@ -46,7 +46,7 @@ describe('Copilot Chat API Route', () => {
mockUpdate.mockReturnValue({ set: mockSet })
mockSet.mockReturnValue({ where: mockWhere })
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: {
select: mockSelect,
insert: mockInsert,
@@ -54,7 +54,7 @@ describe('Copilot Chat API Route', () => {
},
}))
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
copilotChats: {
id: 'id',
userId: 'userId',

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { copilotChats } from '@sim/db/schema'
import { and, desc, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
@@ -18,8 +20,6 @@ import { generateChatTitle } from '@/lib/sim-agent/utils'
import { createFileContent, isSupportedFileType } from '@/lib/uploads/file-utils'
import { S3_COPILOT_CONFIG } from '@/lib/uploads/setup'
import { downloadFile, getStorageProvider } from '@/lib/uploads/storage-client'
import { db } from '@/db'
import { copilotChats } from '@/db/schema'
const logger = createLogger('CopilotChatAPI')

View File

@@ -32,14 +32,14 @@ describe('Copilot Chat Update Messages API Route', () => {
mockUpdate.mockReturnValue({ set: mockSet })
mockSet.mockReturnValue({ where: vi.fn().mockResolvedValue(undefined) }) // Different where for update
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: {
select: mockSelect,
update: mockUpdate,
},
}))
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
copilotChats: {
id: 'id',
userId: 'userId',

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { copilotChats } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
@@ -9,8 +11,6 @@ import {
createUnauthorizedResponse,
} from '@/lib/copilot/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { copilotChats } from '@/db/schema'
const logger = createLogger('CopilotChatUpdateAPI')

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { copilotChats } from '@sim/db/schema'
import { desc, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import {
@@ -6,8 +8,6 @@ import {
createUnauthorizedResponse,
} from '@/lib/copilot/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { copilotChats } from '@/db/schema'
const logger = createLogger('CopilotChatsListAPI')

View File

@@ -28,13 +28,13 @@ describe('Copilot Checkpoints Revert API Route', () => {
mockWhere.mockReturnValue({ then: mockThen })
mockThen.mockResolvedValue(null) // Default: no data found
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: {
select: mockSelect,
},
}))
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
workflowCheckpoints: {
id: 'id',
userId: 'userId',

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { workflowCheckpoints, workflow as workflowTable } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
@@ -9,8 +11,6 @@ import {
createUnauthorizedResponse,
} from '@/lib/copilot/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { workflowCheckpoints, workflow as workflowTable } from '@/db/schema'
const logger = createLogger('CheckpointRevertAPI')

View File

@@ -49,14 +49,14 @@ describe('Copilot Checkpoints API Route', () => {
mockInsert.mockReturnValue({ values: mockValues })
mockValues.mockReturnValue({ returning: mockReturning })
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: {
select: mockSelect,
insert: mockInsert,
},
}))
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
copilotChats: mockCopilotChats,
workflowCheckpoints: mockWorkflowCheckpoints,
}))

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { copilotChats, workflowCheckpoints } from '@sim/db/schema'
import { and, desc, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
@@ -9,8 +11,6 @@ import {
createUnauthorizedResponse,
} from '@/lib/copilot/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { copilotChats, workflowCheckpoints } from '@/db/schema'
const logger = createLogger('WorkflowCheckpointsAPI')

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { copilotFeedback } from '@sim/db/schema'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import {
@@ -8,8 +10,6 @@ import {
createUnauthorizedResponse,
} from '@/lib/copilot/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { copilotFeedback } from '@/db/schema'
const logger = createLogger('CopilotFeedbackAPI')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { environment } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { decryptSecret, encryptSecret, generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { environment } from '@/db/schema'
import type { EnvironmentVariable } from '@/stores/settings/environment/types'
const logger = createLogger('EnvironmentAPI')

View File

@@ -127,7 +127,7 @@ describe('Individual Folder API Route', () => {
mockAuthenticatedUser()
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('PUT', {
name: 'Updated Folder Name',
@@ -152,7 +152,7 @@ describe('Individual Folder API Route', () => {
mockAuthenticatedUser()
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('PUT', {
name: 'Updated Folder',
@@ -171,7 +171,7 @@ describe('Individual Folder API Route', () => {
mockUnauthenticated()
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('PUT', {
name: 'Updated Folder',
@@ -193,7 +193,7 @@ describe('Individual Folder API Route', () => {
mockGetUserEntityPermissions.mockResolvedValue('read') // Read-only permissions
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('PUT', {
name: 'Updated Folder',
@@ -215,7 +215,7 @@ describe('Individual Folder API Route', () => {
mockGetUserEntityPermissions.mockResolvedValue('write') // Write permissions
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('PUT', {
name: 'Updated Folder',
@@ -237,7 +237,7 @@ describe('Individual Folder API Route', () => {
mockGetUserEntityPermissions.mockResolvedValue('admin') // Admin permissions
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('PUT', {
name: 'Updated Folder',
@@ -258,7 +258,7 @@ describe('Individual Folder API Route', () => {
mockAuthenticatedUser()
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('PUT', {
name: 'Updated Folder',
@@ -293,7 +293,7 @@ describe('Individual Folder API Route', () => {
}),
})
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('PUT', {
name: ' Folder With Spaces ',
@@ -314,7 +314,7 @@ describe('Individual Folder API Route', () => {
const dbMock = createFolderDbMock({
throwError: true,
})
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('PUT', {
name: 'Updated Folder',
@@ -340,7 +340,7 @@ describe('Individual Folder API Route', () => {
mockAuthenticatedUser()
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('PUT', {
name: '', // Empty name
@@ -359,7 +359,7 @@ describe('Individual Folder API Route', () => {
mockAuthenticatedUser()
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
// Create a request with invalid JSON
const req = new Request('http://localhost:3000/api/folders/folder-1', {
@@ -396,7 +396,7 @@ describe('Individual Folder API Route', () => {
folderLookupResult: { id: 'folder-3', parentId: null, name: 'Folder 3' },
circularCheckResults,
})
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('PUT', {
name: 'Updated Folder 3',
@@ -425,7 +425,7 @@ describe('Individual Folder API Route', () => {
})
// Mock the recursive deletion function
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })
@@ -445,7 +445,7 @@ describe('Individual Folder API Route', () => {
mockUnauthenticated()
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })
@@ -465,7 +465,7 @@ describe('Individual Folder API Route', () => {
mockGetUserEntityPermissions.mockResolvedValue('read') // Read-only permissions
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })
@@ -485,7 +485,7 @@ describe('Individual Folder API Route', () => {
mockGetUserEntityPermissions.mockResolvedValue('write') // Write permissions (not enough for delete)
const dbMock = createFolderDbMock()
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })
@@ -507,7 +507,7 @@ describe('Individual Folder API Route', () => {
const dbMock = createFolderDbMock({
folderLookupResult: mockFolder,
})
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })
@@ -528,7 +528,7 @@ describe('Individual Folder API Route', () => {
const dbMock = createFolderDbMock({
throwError: true,
})
vi.doMock('@/db', () => dbMock)
vi.doMock('@sim/db', () => dbMock)
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })

View File

@@ -1,10 +1,10 @@
import { db } from '@sim/db'
import { workflow, workflowFolder } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { getUserEntityPermissions } from '@/lib/permissions/utils'
import { db } from '@/db'
import { workflow, workflowFolder } from '@/db/schema'
const logger = createLogger('FoldersIDAPI')

View File

@@ -75,7 +75,7 @@ describe('Folders API Route', () => {
mockGetUserEntityPermissions.mockResolvedValue('admin')
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: {
select: mockSelect,
insert: mockInsert,

View File

@@ -1,10 +1,10 @@
import { db } from '@sim/db'
import { workflowFolder } from '@sim/db/schema'
import { and, asc, desc, eq, isNull } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { getUserEntityPermissions } from '@/lib/permissions/utils'
import { db } from '@/db'
import { workflowFolder } from '@/db/schema'
const logger = createLogger('FoldersAPI')

View File

@@ -83,7 +83,7 @@ describe('Document By ID API Route', () => {
beforeEach(async () => {
resetMocks()
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: mockDbChain,
}))

View File

@@ -90,7 +90,7 @@ describe('Knowledge Base Documents API Route', () => {
beforeEach(async () => {
resetMocks()
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: mockDbChain,
}))

View File

@@ -72,7 +72,7 @@ describe('Knowledge Base By ID API Route', () => {
beforeEach(async () => {
vi.clearAllMocks()
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: mockDbChain,
}))

View File

@@ -33,7 +33,7 @@ describe('Knowledge Base API Route', () => {
beforeEach(async () => {
vi.clearAllMocks()
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: mockDbChain,
}))

View File

@@ -128,7 +128,7 @@ describe('Knowledge Search API Route', () => {
beforeEach(async () => {
vi.clearAllMocks()
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: mockDbChain,
}))

View File

@@ -15,7 +15,7 @@ vi.mock('@/lib/logs/console/logger', () => ({
error: vi.fn(),
})),
}))
vi.mock('@/db')
vi.mock('@sim/db')
vi.mock('@/lib/knowledge/documents/utils', () => ({
retryWithExponentialBackoff: (fn: any) => fn(),
}))

View File

@@ -1,7 +1,7 @@
import { db } from '@sim/db'
import { document, embedding } from '@sim/db/schema'
import { and, eq, inArray, isNull, sql } from 'drizzle-orm'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { document, embedding } from '@/db/schema'
const logger = createLogger('KnowledgeSearchUtils')

View File

@@ -84,7 +84,7 @@ vi.stubGlobal(
})
)
vi.mock('@/db', () => {
vi.mock('@sim/db', () => {
const selectBuilder = {
from(table: any) {
return {

View File

@@ -1,7 +1,7 @@
import { db } from '@sim/db'
import { document, embedding, knowledgeBase } from '@sim/db/schema'
import { and, eq, isNull } from 'drizzle-orm'
import { getUserEntityPermissions } from '@/lib/permissions/utils'
import { db } from '@/db'
import { document, embedding, knowledgeBase } from '@/db/schema'
export interface KnowledgeBaseData {
id: string

View File

@@ -1,10 +1,10 @@
import { db } from '@sim/db'
import { permissions, workflow, workflowExecutionLogs } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { permissions, workflow, workflowExecutionLogs } from '@/db/schema'
const logger = createLogger('LogDetailsByIdAPI')

View File

@@ -1,4 +1,7 @@
import { PutObjectCommand } from '@aws-sdk/client-s3'
// Dynamic import for S3 client to avoid client-side bundling
import { db } from '@sim/db'
import { subscription, user, workflow, workflowExecutionLogs } from '@sim/db/schema'
import { and, eq, inArray, lt, sql } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { verifyCronAuth } from '@/lib/auth/internal'
@@ -6,9 +9,6 @@ import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
import { snapshotService } from '@/lib/logs/execution/snapshot/service'
import { deleteFile, isUsingCloudStorage } from '@/lib/uploads'
// Dynamic import for S3 client to avoid client-side bundling
import { db } from '@/db'
import { subscription, user, workflow, workflowExecutionLogs } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,8 +1,8 @@
import { db } from '@sim/db'
import { workflowExecutionLogs, workflowExecutionSnapshots } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { workflowExecutionLogs, workflowExecutionSnapshots } from '@/db/schema'
const logger = createLogger('LogsByExecutionIdAPI')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { permissions, workflow, workflowExecutionLogs } from '@sim/db/schema'
import { and, desc, eq, gte, inArray, lte, type SQL, sql } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { permissions, workflow, workflowExecutionLogs } from '@/db/schema'
const logger = createLogger('LogsAPI')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { mcpServers } from '@sim/db/schema'
import { and, eq, isNull } from 'drizzle-orm'
import type { NextRequest } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
import { withMcpAuth } from '@/lib/mcp/middleware'
import { mcpService } from '@/lib/mcp/service'
import { createMcpErrorResponse, createMcpSuccessResponse } from '@/lib/mcp/utils'
import { db } from '@/db'
import { mcpServers } from '@/db/schema'
const logger = createLogger('McpServerRefreshAPI')

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { mcpServers } from '@sim/db/schema'
import { and, eq, isNull } from 'drizzle-orm'
import type { NextRequest } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
@@ -5,8 +7,6 @@ import { getParsedBody, withMcpAuth } from '@/lib/mcp/middleware'
import { mcpService } from '@/lib/mcp/service'
import { validateMcpServerUrl } from '@/lib/mcp/url-validator'
import { createMcpErrorResponse, createMcpSuccessResponse } from '@/lib/mcp/utils'
import { db } from '@/db'
import { mcpServers } from '@/db/schema'
const logger = createLogger('McpServerAPI')

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { mcpServers } from '@sim/db/schema'
import { and, eq, isNull } from 'drizzle-orm'
import type { NextRequest } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
@@ -6,8 +8,6 @@ import { mcpService } from '@/lib/mcp/service'
import type { McpTransport } from '@/lib/mcp/types'
import { validateMcpServerUrl } from '@/lib/mcp/url-validator'
import { createMcpErrorResponse, createMcpSuccessResponse } from '@/lib/mcp/utils'
import { db } from '@/db'
import { mcpServers } from '@/db/schema'
const logger = createLogger('McpServersAPI')

View File

@@ -1,9 +1,9 @@
import { db } from '@sim/db'
import { memory } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { memory } from '@/db/schema'
const logger = createLogger('MemoryByIdAPI')

View File

@@ -1,9 +1,9 @@
import { db } from '@sim/db'
import { memory } from '@sim/db/schema'
import { and, eq, isNull, like } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { memory } from '@/db/schema'
const logger = createLogger('MemoryAPI')

View File

@@ -1,9 +1,5 @@
import { randomUUID } from 'crypto'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { db } from '@sim/db'
import {
invitation,
member,
@@ -12,7 +8,11 @@ import {
user,
type WorkspaceInvitationStatus,
workspaceInvitation,
} from '@/db/schema'
} from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
const logger = createLogger('OrganizationInvitation')

View File

@@ -1,4 +1,14 @@
import { randomUUID } from 'crypto'
import { db } from '@sim/db'
import {
invitation,
member,
organization,
user,
type WorkspaceInvitationStatus,
workspace,
workspaceInvitation,
} from '@sim/db/schema'
import { and, eq, inArray, isNull } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import {
@@ -16,16 +26,6 @@ import { quickValidateEmail } from '@/lib/email/validation'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
import { hasWorkspaceAdminAccess } from '@/lib/permissions/utils'
import { db } from '@/db'
import {
invitation,
member,
organization,
user,
type WorkspaceInvitationStatus,
workspace,
workspaceInvitation,
} from '@/db/schema'
const logger = createLogger('OrganizationInvitations')

View File

@@ -1,10 +1,10 @@
import { db } from '@sim/db'
import { member, user, userStats } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { getUserUsageData } from '@/lib/billing/core/usage'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { member, user, userStats } from '@/db/schema'
const logger = createLogger('OrganizationMemberAPI')

View File

@@ -1,4 +1,6 @@
import { randomUUID } from 'crypto'
import { db } from '@sim/db'
import { invitation, member, organization, user, userStats } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getEmailSubject, renderInvitationEmail } from '@/components/emails/render-email'
@@ -9,8 +11,6 @@ import { sendEmail } from '@/lib/email/mailer'
import { quickValidateEmail } from '@/lib/email/validation'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { invitation, member, organization, user, userStats } from '@/db/schema'
const logger = createLogger('OrganizationMembersAPI')

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { member, organization } from '@sim/db/schema'
import { and, eq, ne } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
@@ -7,8 +9,6 @@ import {
updateOrganizationSeats,
} from '@/lib/billing/validation/seat-management'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { member, organization } from '@/db/schema'
const logger = createLogger('OrganizationAPI')

View File

@@ -1,9 +1,9 @@
import { db } from '@sim/db'
import { member, permissions, user, workspace } from '@sim/db/schema'
import { and, eq, or } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { member, permissions, user, workspace } from '@/db/schema'
const logger = createLogger('OrganizationWorkspacesAPI')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { workflow, workflowSchedule } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { getUserEntityPermissions } from '@/lib/permissions/utils'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { workflow, workflowSchedule } from '@/db/schema'
const logger = createLogger('ScheduleAPI')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { workflow, workflowSchedule } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { getUserEntityPermissions } from '@/lib/permissions/utils'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { workflow, workflowSchedule } from '@/db/schema'
const logger = createLogger('ScheduleStatusAPI')

View File

@@ -33,7 +33,7 @@ describe('Scheduled Workflow Execution API Route', () => {
})),
}))
vi.doMock('@/db', () => {
vi.doMock('@sim/db', () => {
const mockDb = {
select: vi.fn().mockImplementation(() => ({
from: vi.fn().mockImplementation((table: string) => {
@@ -147,7 +147,7 @@ describe('Scheduled Workflow Execution API Route', () => {
})
it('should handle case with no due schedules', async () => {
vi.doMock('@/db', () => {
vi.doMock('@sim/db', () => {
const mockDb = {
select: vi.fn().mockImplementation(() => ({
from: vi.fn().mockImplementation(() => ({
@@ -183,7 +183,7 @@ describe('Scheduled Workflow Execution API Route', () => {
})
it('should handle scheduler-level errors gracefully', async () => {
vi.doMock('@/db', () => {
vi.doMock('@sim/db', () => {
const mockDb = {
select: vi.fn().mockImplementation(() => {
throw new Error('Database error')

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { userStats, workflow, workflowSchedule } from '@sim/db/schema'
import { Cron } from 'croner'
import { and, eq, lte, not, sql } from 'drizzle-orm'
import { NextResponse } from 'next/server'
@@ -18,8 +20,6 @@ import {
import { decryptSecret, generateRequestId } from '@/lib/utils'
import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers'
import { updateWorkflowRunCounts } from '@/lib/workflows/utils'
import { db } from '@/db'
import { userStats, workflow, workflowSchedule } from '@/db/schema'
import { Executor } from '@/executor'
import { Serializer } from '@/serializer'
import { RateLimiter } from '@/services/queue'

View File

@@ -52,7 +52,7 @@ describe('Schedule Configuration API Route', () => {
// Create mock database with test schedules
// Mock the database to return workflow data for authorization check
vi.doMock('@/db', () => {
vi.doMock('@sim/db', () => {
let callCount = 0
const mockDb = {
select: vi.fn().mockImplementation(() => ({
@@ -201,7 +201,7 @@ describe('Schedule Configuration API Route', () => {
where: vi.fn().mockResolvedValue([]),
}))
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: {
select: vi.fn().mockImplementation(() => ({
from: vi.fn().mockImplementation(() => ({
@@ -271,7 +271,7 @@ describe('Schedule Configuration API Route', () => {
*/
it('should handle errors gracefully', async () => {
// Mock the db to throw an error on insert
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: {
select: vi.fn().mockImplementation(() => ({
from: vi.fn().mockImplementation(() => ({

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { workflow, workflowSchedule } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
@@ -13,8 +15,6 @@ import {
validateCronExpression,
} from '@/lib/schedules/utils'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { workflow, workflowSchedule } from '@/db/schema'
const logger = createLogger('ScheduledAPI')

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { templates, workflow } from '@sim/db/schema'
import { eq, sql } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
@@ -5,8 +7,6 @@ import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { hasAdminPermission } from '@/lib/permissions/utils'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { templates, workflow } from '@/db/schema'
const logger = createLogger('TemplateByIdAPI')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { templateStars, templates } from '@sim/db/schema'
import { and, eq, sql } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { v4 as uuidv4 } from 'uuid'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { templateStars, templates } from '@/db/schema'
const logger = createLogger('TemplateStarAPI')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { templates, workflow, workflowBlocks, workflowEdges } from '@sim/db/schema'
import { eq, sql } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { v4 as uuidv4 } from 'uuid'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { templates, workflow, workflowBlocks, workflowEdges } from '@/db/schema'
const logger = createLogger('TemplateUseAPI')

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { templateStars, templates, workflow } from '@sim/db/schema'
import { and, desc, eq, ilike, or, sql } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { v4 as uuidv4 } from 'uuid'
@@ -5,8 +7,6 @@ import { z } from 'zod'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { templateStars, templates, workflow } from '@/db/schema'
const logger = createLogger('TemplatesAPI')

View File

@@ -91,7 +91,7 @@ describe('Custom Tools API Routes', () => {
mockDelete.mockReturnValue({ where: mockWhere })
// Mock database
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: {
select: mockSelect,
insert: mockInsert,
@@ -110,7 +110,7 @@ describe('Custom Tools API Routes', () => {
}))
// Mock schema
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
customTools: {
userId: 'userId', // Add these properties to enable WHERE clauses with eq()
id: 'id',

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { customTools } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
@@ -5,8 +7,6 @@ import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { getUserId } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { customTools } from '@/db/schema'
const logger = createLogger('CustomToolsAPI')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'
const logger = createLogger('GmailLabelsAPI')

View File

@@ -1,11 +1,11 @@
import { randomUUID } from 'crypto'
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
import type { PlannerTask } from '@/tools/microsoft_planner/types'
const logger = createLogger('MicrosoftPlannerTasksAPI')

View File

@@ -1,11 +1,11 @@
import { randomUUID } from 'crypto'
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,11 +1,11 @@
import { randomUUID } from 'crypto'
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,11 +1,11 @@
import { randomUUID } from 'crypto'
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,11 +1,11 @@
import { randomUUID } from 'crypto'
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
import type { SharepointSite } from '@/tools/sharepoint/types'
export const dynamic = 'force-dynamic'

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
export const dynamic = 'force-dynamic'

View File

@@ -1,10 +1,10 @@
import { db } from '@sim/db'
import { apiKey } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { apiKey } from '@/db/schema'
const logger = createLogger('ApiKeyAPI')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { apiKey } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { nanoid } from 'nanoid'
import { type NextRequest, NextResponse } from 'next/server'
import { createApiKey, getApiKeyDisplayFormat } from '@/lib/api-key/auth'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { apiKey } from '@/db/schema'
const logger = createLogger('ApiKeysAPI')

View File

@@ -1,11 +1,11 @@
import { db } from '@sim/db'
import { user } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { user } from '@/db/schema'
const logger = createLogger('UpdateUserProfileAPI')

View File

@@ -1,3 +1,5 @@
import { db } from '@sim/db'
import { settings } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { nanoid } from 'nanoid'
import { NextResponse } from 'next/server'
@@ -5,8 +7,6 @@ import { z } from 'zod'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { db } from '@/db'
import { settings } from '@/db/schema'
const logger = createLogger('UserSettingsAPI')

View File

@@ -29,7 +29,7 @@ describe('Subscription Transfer API Routes', () => {
createLogger: vi.fn().mockReturnValue(mockLogger),
}))
vi.doMock('@/db', () => ({
vi.doMock('@sim/db', () => ({
db: mockDb,
}))
@@ -60,7 +60,7 @@ describe('Subscription Transfer API Routes', () => {
}),
}))
vi.doMock('@/db/schema', () => ({
vi.doMock('@sim/db/schema', () => ({
subscription: { id: 'id', referenceId: 'referenceId' },
organization: { id: 'id' },
member: { userId: 'userId', organizationId: 'organizationId', role: 'role' },

View File

@@ -1,10 +1,10 @@
import { db } from '@sim/db'
import { member, organization, subscription } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { member, organization, subscription } from '@/db/schema'
const logger = createLogger('SubscriptionTransferAPI')

View File

@@ -1,10 +1,10 @@
import { db } from '@sim/db'
import { permissions, workflow, workflowExecutionLogs } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
import { createApiResponse, getUserLimits } from '@/app/api/v1/logs/meta'
import { checkRateLimit, createRateLimitResponse } from '@/app/api/v1/middleware'
import { db } from '@/db'
import { permissions, workflow, workflowExecutionLogs } from '@/db/schema'
const logger = createLogger('V1LogDetailsAPI')

View File

@@ -1,15 +1,15 @@
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
import { createApiResponse, getUserLimits } from '@/app/api/v1/logs/meta'
import { checkRateLimit, createRateLimitResponse } from '@/app/api/v1/middleware'
import { db } from '@/db'
import { db } from '@sim/db'
import {
permissions,
workflow,
workflowExecutionLogs,
workflowExecutionSnapshots,
} from '@/db/schema'
} from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
import { createApiResponse, getUserLimits } from '@/app/api/v1/logs/meta'
import { checkRateLimit, createRateLimitResponse } from '@/app/api/v1/middleware'
const logger = createLogger('V1ExecutionAPI')

View File

@@ -1,5 +1,5 @@
import { workflow, workflowExecutionLogs } from '@sim/db/schema'
import { and, desc, eq, gte, inArray, lte, type SQL, sql } from 'drizzle-orm'
import { workflow, workflowExecutionLogs } from '@/db/schema'
export interface LogFilters {
workspaceId: string

Some files were not shown because too many files have changed in this diff Show More