Skip to content

Commit 9a55791

Browse files
committed
fix: organizations
1 parent 79ad35a commit 9a55791

File tree

3 files changed

+77
-72
lines changed

3 files changed

+77
-72
lines changed

apps/api/src/query/builders/summary.ts

Lines changed: 60 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -71,66 +71,66 @@ export const SummaryBuilders: Record<string, SimpleQueryConfig> = {
7171

7272
return {
7373
sql: `
74-
WITH base_events AS (
75-
SELECT
76-
session_id,
77-
anonymous_id,
78-
event_name,
79-
toTimeZone(time, {timezone:String}) as normalized_time
80-
FROM analytics.events
81-
WHERE
82-
client_id = {websiteId:String}
83-
AND time >= parseDateTimeBestEffort({startDate:String})
84-
AND time <= parseDateTimeBestEffort(concat({endDate:String}, ' 23:59:59'))
85-
AND session_id != ''
86-
${combinedWhereClause}
87-
),
88-
session_metrics AS (
89-
SELECT
90-
session_id,
91-
countIf(event_name = 'screen_view') as page_count
92-
FROM base_events
93-
GROUP BY session_id
94-
),
95-
session_durations AS (
96-
SELECT
97-
session_id,
98-
dateDiff('second', MIN(normalized_time), MAX(normalized_time)) as duration
99-
FROM base_events
100-
GROUP BY session_id
101-
HAVING duration >= 0
102-
),
103-
unique_visitors AS (
104-
SELECT
105-
countDistinct(anonymous_id) as unique_visitors
106-
FROM base_events
107-
WHERE event_name = 'screen_view'
108-
),
109-
all_events AS (
110-
SELECT
111-
count() as total_events,
112-
countIf(event_name = 'screen_view') as total_screen_views
113-
FROM base_events
114-
),
115-
bounce_sessions AS (
116-
SELECT
117-
countIf(page_count = 1) as bounced_sessions,
118-
count() as total_sessions
119-
FROM session_metrics
120-
)
121-
SELECT
122-
sum(page_count) as pageviews,
123-
(SELECT unique_visitors FROM unique_visitors) as unique_visitors,
124-
(SELECT total_sessions FROM bounce_sessions) as sessions,
125-
ROUND(CASE
126-
WHEN (SELECT total_sessions FROM bounce_sessions) > 0
127-
THEN ((SELECT bounced_sessions FROM bounce_sessions) / (SELECT total_sessions FROM bounce_sessions)) * 100
128-
ELSE 0
129-
END, 2) as bounce_rate,
130-
ROUND(median(sd.duration), 2) as avg_session_duration,
131-
(SELECT total_events FROM all_events) as total_events
132-
FROM session_metrics
133-
LEFT JOIN session_durations as sd ON session_metrics.session_id = sd.session_id
74+
[ WITH base_events AS (
75+
SELECT
76+
session_id,
77+
anonymous_id,
78+
event_name,
79+
toTimeZone(time, {timezone:String}) as normalized_time
80+
FROM analytics.events
81+
WHERE
82+
client_id = {websiteId:String}
83+
AND time >= parseDateTimeBestEffort({startDate:String})
84+
AND time <= parseDateTimeBestEffort(concat({endDate:String}, ' 23:59:59'))
85+
AND session_id != ''
86+
${combinedWhereClause}
87+
),
88+
session_metrics AS (
89+
SELECT
90+
session_id,
91+
countIf(event_name = 'screen_view') as page_count
92+
FROM base_events
93+
GROUP BY session_id
94+
),
95+
session_durations AS (
96+
SELECT
97+
session_id,
98+
dateDiff('second', MIN(normalized_time), MAX(normalized_time)) as duration
99+
FROM base_events
100+
GROUP BY session_id
101+
HAVING duration >= 0
102+
),
103+
unique_visitors AS (
104+
SELECT
105+
countDistinct(anonymous_id) as unique_visitors
106+
FROM base_events
107+
WHERE event_name = 'screen_view'
108+
),
109+
all_events AS (
110+
SELECT
111+
count() as total_events,
112+
countIf(event_name = 'screen_view') as total_screen_views
113+
FROM base_events
114+
),
115+
bounce_sessions AS (
116+
SELECT
117+
countIf(page_count = 1) as bounced_sessions,
118+
count() as total_sessions
119+
FROM session_metrics
120+
)
121+
SELECT
122+
sum(page_count) as pageviews,
123+
(SELECT unique_visitors FROM unique_visitors) as unique_visitors,
124+
(SELECT total_sessions FROM bounce_sessions) as sessions,
125+
ROUND(CASE
126+
WHEN (SELECT total_sessions FROM bounce_sessions) > 0
127+
THEN ((SELECT bounced_sessions FROM bounce_sessions) / (SELECT total_sessions FROM bounce_sessions)) * 100
128+
ELSE 0
129+
END, 2) as bounce_rate,
130+
ROUND(median(sd.duration), 2) as avg_session_duration,
131+
(SELECT total_events FROM all_events) as total_events
132+
FROM session_metrics
133+
LEFT JOIN session_durations as sd ON session_metrics.session_id = sd.session_id]
134134
`,
135135
params: {
136136
websiteId,

packages/rpc/src/routers/organizations.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,28 @@ import {
77
session,
88
user,
99
} from '@databuddy/db';
10-
import {
11-
getPendingInvitationsSchema,
12-
uploadOrganizationLogoSchema,
13-
} from '@databuddy/validation';
10+
import { getPendingInvitationsSchema } from '@databuddy/validation';
1411
import { TRPCError } from '@trpc/server';
1512
import { Autumn as autumn } from 'autumn-js';
1613
import { and, desc, eq } from 'drizzle-orm';
1714
import { z } from 'zod';
1815
import { createTRPCRouter, protectedProcedure } from '../trpc';
1916
import { s3 } from '../utils/s3';
2017

18+
const deleteOrganizationLogoSchema = z.object({
19+
organizationId: z.string().min(1, 'Organization ID is required'),
20+
});
21+
22+
const uploadOrganizationLogoSchema = z.object({
23+
organizationId: z.string().min(1, 'Organization ID is required'),
24+
fileData: z.string().min(1, 'File data is required'),
25+
fileName: z.string().min(1, 'File name is required'),
26+
fileType: z.string().min(1, 'File type is required'),
27+
});
28+
2129
export const organizationsRouter = createTRPCRouter({
2230
uploadLogo: protectedProcedure
23-
.input(
24-
uploadOrganizationLogoSchema.extend({
25-
fileData: z.string().min(1, 'File data is required'),
26-
fileName: z.string().min(1, 'File name is required'),
27-
fileType: z.string().min(1, 'File type is required'),
28-
})
29-
)
31+
.input(uploadOrganizationLogoSchema)
3032
.mutation(async ({ input, ctx }) => {
3133
const { success } = await websitesApi.hasPermission({
3234
headers: ctx.headers,
@@ -113,7 +115,7 @@ export const organizationsRouter = createTRPCRouter({
113115
}),
114116

115117
deleteLogo: protectedProcedure
116-
.input(uploadOrganizationLogoSchema)
118+
.input(deleteOrganizationLogoSchema)
117119
.mutation(async ({ input, ctx }) => {
118120
const { success } = await websitesApi.hasPermission({
119121
headers: ctx.headers,

packages/validation/src/schemas/organizations.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ export const updateOrganizationSchema = z.object({
3838

3939
export const uploadOrganizationLogoSchema = z.object({
4040
organizationId: z.string().min(1, 'Organization ID is required'),
41+
fileData: z.string().min(1, 'File data is required'),
42+
fileName: z.string().min(1, 'File name is required'),
43+
fileType: z.string().min(1, 'File type is required'),
4144
});
4245

4346
export const deleteOrganizationSchema = z.object({

0 commit comments

Comments
 (0)