🗃️ 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 { authenticatedProcedure } from '@/utils/server/trpc'
|
||||||
import { TRPCError } from '@trpc/server'
|
import { TRPCError } from '@trpc/server'
|
||||||
import { ResultWithAnswers, resultWithAnswersSchema } from 'models'
|
import { ResultWithAnswers, resultWithAnswersSchema } from 'models'
|
||||||
import { isDefined } from 'utils'
|
|
||||||
import { z } from 'zod'
|
import { z } from 'zod'
|
||||||
|
|
||||||
const maxLimit = 200
|
const maxLimit = 200
|
||||||
@ -44,7 +43,7 @@ export const getResultsProcedure = authenticatedProcedure
|
|||||||
cursor: cursor ? { id: cursor } : undefined,
|
cursor: cursor ? { id: cursor } : undefined,
|
||||||
where: {
|
where: {
|
||||||
typebot: canReadTypebot(input.typebotId, user),
|
typebot: canReadTypebot(input.typebotId, user),
|
||||||
answers: { some: {} },
|
hasStarted: true,
|
||||||
},
|
},
|
||||||
orderBy: {
|
orderBy: {
|
||||||
createdAt: 'desc',
|
createdAt: 'desc',
|
||||||
|
@ -12,26 +12,27 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|||||||
if (req.method === 'GET') {
|
if (req.method === 'GET') {
|
||||||
const typebotId = req.query.typebotId as string
|
const typebotId = req.query.typebotId as string
|
||||||
|
|
||||||
const totalViews = await prisma.result.count({
|
const [totalViews, totalStarts, totalCompleted] = await prisma.$transaction(
|
||||||
where: {
|
[
|
||||||
typebotId,
|
prisma.result.count({
|
||||||
typebot: canReadTypebot(typebotId, user),
|
where: {
|
||||||
},
|
typebot: canReadTypebot(typebotId, user),
|
||||||
})
|
},
|
||||||
const totalStarts = await prisma.result.count({
|
}),
|
||||||
where: {
|
prisma.result.count({
|
||||||
typebotId,
|
where: {
|
||||||
typebot: canReadTypebot(typebotId, user),
|
typebot: canReadTypebot(typebotId, user),
|
||||||
answers: { some: {} },
|
hasStarted: true,
|
||||||
},
|
},
|
||||||
})
|
}),
|
||||||
const totalCompleted = await prisma.result.count({
|
prisma.result.count({
|
||||||
where: {
|
where: {
|
||||||
typebotId,
|
typebot: canReadTypebot(typebotId, user),
|
||||||
typebot: canReadTypebot(typebotId, user),
|
isCompleted: true,
|
||||||
isCompleted: true,
|
},
|
||||||
},
|
}),
|
||||||
})
|
]
|
||||||
|
)
|
||||||
const stats: Stats = {
|
const stats: Stats = {
|
||||||
totalViews,
|
totalViews,
|
||||||
totalStarts,
|
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[]
|
webhooks Webhook[]
|
||||||
isArchived Boolean @default(false)
|
isArchived Boolean @default(false)
|
||||||
isClosed Boolean @default(false)
|
isClosed Boolean @default(false)
|
||||||
|
|
||||||
|
@@index([workspaceId])
|
||||||
}
|
}
|
||||||
|
|
||||||
model Invitation {
|
model Invitation {
|
||||||
@ -222,7 +224,8 @@ model Result {
|
|||||||
answers Answer[]
|
answers Answer[]
|
||||||
logs Log[]
|
logs Log[]
|
||||||
|
|
||||||
@@index([typebotId])
|
@@index([typebotId, createdAt])
|
||||||
|
@@index([createdAt, typebotId])
|
||||||
}
|
}
|
||||||
|
|
||||||
model Log {
|
model Log {
|
||||||
@ -249,6 +252,7 @@ model Answer {
|
|||||||
|
|
||||||
@@unique([resultId, blockId, groupId])
|
@@unique([resultId, blockId, groupId])
|
||||||
@@index([groupId])
|
@@index([groupId])
|
||||||
|
@@index([storageUsed])
|
||||||
}
|
}
|
||||||
|
|
||||||
model Coupon {
|
model Coupon {
|
||||||
|
Reference in New Issue
Block a user