Feature/move list to client (#50)

This commit is contained in:
Carl-Gerhard Lindesvärd
2024-09-01 15:02:12 +02:00
committed by GitHub
parent c2abdaadf2
commit 668434d246
181 changed files with 2922 additions and 1959 deletions

View File

@@ -27,6 +27,7 @@ import {
sum,
} from '@openpanel/common';
import type { ISerieDataItem } from '@openpanel/common';
import { alphabetIds } from '@openpanel/constants';
import {
chQuery,
createSqlBuilder,
@@ -523,7 +524,11 @@ export async function getChart(input: IChartInput) {
uniq(pluck('name', input.events)).length !==
pluck('name', input.events).length && series.length > 1;
const final: FinalChart = {
series: series.map((serie) => {
series: series.map((serie, index) => {
const eventIndex = input.events.findIndex(
(event) => event.id === serie.event.id
);
const alphaId = alphabetIds[eventIndex];
const previousSerie = previousSeries?.find(
(prevSerie) => getSerieId(prevSerie) === getSerieId(serie)
);
@@ -541,10 +546,7 @@ export async function getChart(input: IChartInput) {
return {
id: getSerieId(serie),
names: includeEventName
? [
`(${event.id || event.name}) ${serie.name[0]}`,
...serie.name.slice(1),
]
? [`(${alphaId}) ${serie.name[0]}`, ...serie.name.slice(1)]
: serie.name,
event,
metrics: {

View File

@@ -1,7 +1,16 @@
import { TRPCError } from '@trpc/server';
import { escape } from 'sqlstring';
import { z } from 'zod';
import { chQuery, convertClickhouseDateToJs, db } from '@openpanel/db';
import {
chQuery,
convertClickhouseDateToJs,
db,
getEventList,
getEvents,
TABLE_NAMES,
} from '@openpanel/db';
import { zChartEventFilter } from '@openpanel/validation';
import { getProjectAccessCached } from '../access';
import { TRPCAccessError } from '../errors';
@@ -31,6 +40,72 @@ export const eventRouter = createTRPCRouter({
});
}),
byId: protectedProcedure
.input(
z.object({
id: z.string(),
projectId: z.string(),
})
)
.query(async ({ input: { id, projectId } }) => {
const res = await getEvents(
`SELECT * FROM ${TABLE_NAMES.events} WHERE id = ${escape(id)} AND project_id = ${escape(projectId)};`
);
if (!res?.[0]) {
throw new TRPCError({
code: 'NOT_FOUND',
message: 'Event not found',
});
}
return res[0];
}),
events: protectedProcedure
.input(
z.object({
projectId: z.string(),
cursor: z.number().optional(),
limit: z.number().default(8),
profileId: z.string().optional(),
take: z.number().default(50),
events: z.array(z.string()).optional(),
filters: z.array(zChartEventFilter).default([]),
startDate: z.date().optional(),
endDate: z.date().optional(),
meta: z.boolean().optional(),
profile: z.boolean().optional(),
})
)
.query(async ({ input }) => getEventList(input)),
conversions: publicProcedure
.input(
z.object({
projectId: z.string(),
})
)
.query(async ({ input: { projectId } }) => {
const conversions = await db.eventMeta.findMany({
where: {
projectId,
conversion: true,
},
});
if (conversions.length === 0) {
return [];
}
return getEvents(
`SELECT * FROM ${TABLE_NAMES.events} WHERE project_id = ${escape(projectId)} AND name IN (${conversions.map((c) => escape(c.name)).join(', ')}) ORDER BY created_at DESC LIMIT 20;`,
{
profile: true,
meta: true,
}
);
}),
bots: publicProcedure
.input(
z.object({

View File

@@ -2,7 +2,13 @@ import { flatten, map, pipe, prop, sort, uniq } from 'ramda';
import { escape } from 'sqlstring';
import { z } from 'zod';
import { chQuery, createSqlBuilder } from '@openpanel/db';
import {
chQuery,
createSqlBuilder,
getProfileList,
getProfiles,
TABLE_NAMES,
} from '@openpanel/db';
import { createTRPCRouter, protectedProcedure } from '../trpc';
@@ -28,6 +34,46 @@ export const profileRouter = createTRPCRouter({
)(properties);
}),
list: protectedProcedure
.input(
z.object({
projectId: z.string(),
cursor: z.number().optional(),
take: z.number().default(50),
// filters: z.array(zChartEventFilter).default([]),
})
)
.query(async ({ input: { projectId, cursor, take } }) => {
return getProfileList({ projectId, cursor, take });
}),
powerUsers: protectedProcedure
.input(
z.object({
projectId: z.string(),
cursor: z.number().optional(),
take: z.number().default(50),
// filters: z.array(zChartEventFilter).default([]),
})
)
.query(async ({ input: { projectId, cursor, take } }) => {
const res = await chQuery<{ profile_id: string; count: number }>(
`SELECT profile_id, count(*) as count from ${TABLE_NAMES.events} where profile_id != '' and project_id = ${escape(projectId)} group by profile_id order by count() DESC LIMIT ${take} ${cursor ? `OFFSET ${cursor * take}` : ''}`
);
const profiles = await getProfiles(res.map((r) => r.profile_id));
return (
res
.map((item) => {
return {
count: item.count,
...(profiles.find((p) => p.id === item.profile_id)! ?? {}),
};
})
// Make sure we return actual profiles
.filter((item) => item.id)
);
}),
values: protectedProcedure
.input(
z.object({