129 lines
3.4 KiB
TypeScript
129 lines
3.4 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
import { db } from '@openpanel/db';
|
|
import { zReportInput } from '@openpanel/validation';
|
|
|
|
import { getProjectAccess } from '../access';
|
|
import { TRPCAccessError } from '../errors';
|
|
import { createTRPCRouter, protectedProcedure } from '../trpc';
|
|
|
|
export const reportRouter = createTRPCRouter({
|
|
create: protectedProcedure
|
|
.input(
|
|
z.object({
|
|
report: zReportInput.omit({ projectId: true }),
|
|
dashboardId: z.string(),
|
|
}),
|
|
)
|
|
.mutation(async ({ input: { report, dashboardId }, ctx }) => {
|
|
const dashboard = await db.dashboard.findUniqueOrThrow({
|
|
where: {
|
|
id: dashboardId,
|
|
},
|
|
});
|
|
|
|
const access = await getProjectAccess({
|
|
userId: ctx.session.userId,
|
|
projectId: dashboard.projectId,
|
|
});
|
|
|
|
if (!access) {
|
|
throw TRPCAccessError('You do not have access to this project');
|
|
}
|
|
|
|
return db.report.create({
|
|
data: {
|
|
projectId: dashboard.projectId,
|
|
dashboardId,
|
|
name: report.name,
|
|
events: report.events,
|
|
interval: report.interval,
|
|
breakdowns: report.breakdowns,
|
|
chartType: report.chartType,
|
|
lineType: report.lineType,
|
|
range: report.range === 'custom' ? '30d' : report.range,
|
|
formula: report.formula,
|
|
previous: report.previous ?? false,
|
|
unit: report.unit,
|
|
criteria: report.criteria,
|
|
metric: report.metric,
|
|
funnelGroup: report.funnelGroup,
|
|
funnelWindow: report.funnelWindow,
|
|
},
|
|
});
|
|
}),
|
|
update: protectedProcedure
|
|
.input(
|
|
z.object({
|
|
reportId: z.string(),
|
|
report: zReportInput.omit({ projectId: true }),
|
|
}),
|
|
)
|
|
.mutation(async ({ input: { report, reportId }, ctx }) => {
|
|
const dbReport = await db.report.findUniqueOrThrow({
|
|
where: {
|
|
id: reportId,
|
|
},
|
|
});
|
|
|
|
const access = await getProjectAccess({
|
|
userId: ctx.session.userId,
|
|
projectId: dbReport.projectId,
|
|
});
|
|
|
|
if (!access) {
|
|
throw TRPCAccessError('You do not have access to this project');
|
|
}
|
|
|
|
return db.report.update({
|
|
where: {
|
|
id: reportId,
|
|
},
|
|
data: {
|
|
name: report.name,
|
|
events: report.events,
|
|
interval: report.interval,
|
|
breakdowns: report.breakdowns,
|
|
chartType: report.chartType,
|
|
lineType: report.lineType,
|
|
range: report.range === 'custom' ? '30d' : report.range,
|
|
formula: report.formula,
|
|
previous: report.previous ?? false,
|
|
unit: report.unit,
|
|
criteria: report.criteria,
|
|
metric: report.metric,
|
|
funnelGroup: report.funnelGroup,
|
|
funnelWindow: report.funnelWindow,
|
|
},
|
|
});
|
|
}),
|
|
delete: protectedProcedure
|
|
.input(
|
|
z.object({
|
|
reportId: z.string(),
|
|
}),
|
|
)
|
|
.mutation(async ({ input: { reportId }, ctx }) => {
|
|
const report = await db.report.findUniqueOrThrow({
|
|
where: {
|
|
id: reportId,
|
|
},
|
|
});
|
|
|
|
const access = await getProjectAccess({
|
|
userId: ctx.session.userId,
|
|
projectId: report.projectId,
|
|
});
|
|
|
|
if (!access) {
|
|
throw TRPCAccessError('You do not have access to this project');
|
|
}
|
|
|
|
return db.report.delete({
|
|
where: {
|
|
id: reportId,
|
|
},
|
|
});
|
|
}),
|
|
});
|