🗃️ Optimize usage queries
This commit is contained in:
@ -3,7 +3,6 @@ import { canReadTypebot } from '@/utils/api/dbRules'
|
||||
import { authenticatedProcedure } from '@/utils/server/trpc'
|
||||
import { TRPCError } from '@trpc/server'
|
||||
import { ResultWithAnswers, resultWithAnswersSchema } from 'models'
|
||||
import { isDefined } from 'utils'
|
||||
import { z } from 'zod'
|
||||
|
||||
const maxLimit = 200
|
||||
@ -44,7 +43,7 @@ export const getResultsProcedure = authenticatedProcedure
|
||||
cursor: cursor ? { id: cursor } : undefined,
|
||||
where: {
|
||||
typebot: canReadTypebot(input.typebotId, user),
|
||||
answers: { some: {} },
|
||||
hasStarted: true,
|
||||
},
|
||||
orderBy: {
|
||||
createdAt: 'desc',
|
||||
|
@ -12,26 +12,27 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
if (req.method === 'GET') {
|
||||
const typebotId = req.query.typebotId as string
|
||||
|
||||
const totalViews = await prisma.result.count({
|
||||
where: {
|
||||
typebotId,
|
||||
typebot: canReadTypebot(typebotId, user),
|
||||
},
|
||||
})
|
||||
const totalStarts = await prisma.result.count({
|
||||
where: {
|
||||
typebotId,
|
||||
typebot: canReadTypebot(typebotId, user),
|
||||
answers: { some: {} },
|
||||
},
|
||||
})
|
||||
const totalCompleted = await prisma.result.count({
|
||||
where: {
|
||||
typebotId,
|
||||
typebot: canReadTypebot(typebotId, user),
|
||||
isCompleted: true,
|
||||
},
|
||||
})
|
||||
const [totalViews, totalStarts, totalCompleted] = await prisma.$transaction(
|
||||
[
|
||||
prisma.result.count({
|
||||
where: {
|
||||
typebot: canReadTypebot(typebotId, user),
|
||||
},
|
||||
}),
|
||||
prisma.result.count({
|
||||
where: {
|
||||
typebot: canReadTypebot(typebotId, user),
|
||||
hasStarted: true,
|
||||
},
|
||||
}),
|
||||
prisma.result.count({
|
||||
where: {
|
||||
typebot: canReadTypebot(typebotId, user),
|
||||
isCompleted: true,
|
||||
},
|
||||
}),
|
||||
]
|
||||
)
|
||||
const stats: Stats = {
|
||||
totalViews,
|
||||
totalStarts,
|
||||
|
@ -0,0 +1,2 @@
|
||||
-- CreateIndex
|
||||
CREATE INDEX CONCURRENTLY "Typebot_workspaceId_idx" ON "Typebot"("workspaceId");
|
@ -0,0 +1,2 @@
|
||||
-- CreateIndex
|
||||
CREATE INDEX CONCURRENTLY "Result_createdAt_idx" ON "Result"("createdAt");
|
@ -0,0 +1,2 @@
|
||||
-- CreateIndex
|
||||
CREATE INDEX CONCURRENTLY "Result_hasStarted_idx" ON "Result"("hasStarted");
|
@ -0,0 +1,23 @@
|
||||
-- DropIndex
|
||||
DROP INDEX IF EXISTS "Result_createdAt_idx";
|
||||
|
||||
-- DropIndex
|
||||
DROP INDEX IF EXISTS "Result_hasStarted_idx";
|
||||
|
||||
-- DropIndex
|
||||
DROP INDEX IF EXISTS "Result_typebotId_idx";
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX IF NOT EXISTS "Answer_storageUsed_idx" ON "Answer"("storageUsed")
|
||||
WHERE
|
||||
"storageUsed" IS NOT NULL;
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX IF NOT EXISTS "Result_typebotId_createdAt_idx" ON "Result"("typebotId", "createdAt" DESC NULLS LAST)
|
||||
WHERE
|
||||
"hasStarted" = true;
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX IF NOT EXISTS "Result_createdAt_typebotId_idx" ON "Result"("createdAt" DESC NULLS LAST, "typebotId")
|
||||
WHERE
|
||||
"hasStarted" = true;
|
@ -174,6 +174,8 @@ model Typebot {
|
||||
webhooks Webhook[]
|
||||
isArchived Boolean @default(false)
|
||||
isClosed Boolean @default(false)
|
||||
|
||||
@@index([workspaceId])
|
||||
}
|
||||
|
||||
model Invitation {
|
||||
@ -222,7 +224,8 @@ model Result {
|
||||
answers Answer[]
|
||||
logs Log[]
|
||||
|
||||
@@index([typebotId])
|
||||
@@index([typebotId, createdAt])
|
||||
@@index([createdAt, typebotId])
|
||||
}
|
||||
|
||||
model Log {
|
||||
@ -249,6 +252,7 @@ model Answer {
|
||||
|
||||
@@unique([resultId, blockId, groupId])
|
||||
@@index([groupId])
|
||||
@@index([storageUsed])
|
||||
}
|
||||
|
||||
model Coupon {
|
||||
|
Reference in New Issue
Block a user