mirror of https://github.com/TZGyn/shortener
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.6 KiB
TypeScript
107 lines
2.6 KiB
TypeScript
import { db } from '$lib/db'
|
|
import { redirect } from '@sveltejs/kit'
|
|
import type { PageServerLoad } from './$types'
|
|
import { and, eq, sql } from 'drizzle-orm'
|
|
import { visitor as visitorSchema } from '$lib/db/schema'
|
|
|
|
export const load = (async (event) => {
|
|
const user = event.locals.userObject
|
|
const shortenerId = event.params.id
|
|
|
|
const shortener = await db.query.shortener.findFirst({
|
|
where: (shortener, { eq, and }) =>
|
|
and(
|
|
eq(shortener.code, shortenerId),
|
|
eq(shortener.userId, user.id),
|
|
),
|
|
with: {
|
|
visitor: true,
|
|
},
|
|
})
|
|
|
|
if (!shortener) {
|
|
redirect(303, '/')
|
|
return
|
|
}
|
|
|
|
const now = new Date()
|
|
|
|
const visitor = await db
|
|
.select({
|
|
count: sql<number>`cast(count(*) as int)`,
|
|
month: sql<number>`cast(to_char(${visitorSchema.createdAt}, 'MM') as int)`,
|
|
})
|
|
.from(visitorSchema)
|
|
.where(
|
|
and(
|
|
eq(visitorSchema.shortenerId, shortener.id),
|
|
sql`to_char(${
|
|
visitorSchema.createdAt
|
|
}, 'YYYY') = ${now.getFullYear()}`,
|
|
),
|
|
)
|
|
.groupBy(sql`to_char(${visitorSchema.createdAt}, 'MM')`)
|
|
|
|
const visitorByCountry = await db
|
|
.select({
|
|
count: sql<number>`cast(count(*) as int)`,
|
|
country: visitorSchema.country,
|
|
code: visitorSchema.countryCode,
|
|
})
|
|
.from(visitorSchema)
|
|
.where(eq(visitorSchema.shortenerId, shortener.id))
|
|
.groupBy(visitorSchema.country, visitorSchema.countryCode)
|
|
|
|
const visitorByCity = await db
|
|
.select({
|
|
count: sql<number>`cast(count(*) as int)`,
|
|
country: visitorSchema.country,
|
|
code: visitorSchema.countryCode,
|
|
city: visitorSchema.city,
|
|
})
|
|
.from(visitorSchema)
|
|
.where(eq(visitorSchema.shortenerId, shortener.id))
|
|
.groupBy(
|
|
visitorSchema.country,
|
|
visitorSchema.countryCode,
|
|
visitorSchema.city,
|
|
)
|
|
|
|
const visitorByOS = await db
|
|
.select({
|
|
count: sql<number>`cast(count(*) as int)`,
|
|
os: visitorSchema.os,
|
|
})
|
|
.from(visitorSchema)
|
|
.where(eq(visitorSchema.shortenerId, shortener.id))
|
|
.groupBy(visitorSchema.os)
|
|
|
|
const visitorByDeviceVendor = await db
|
|
.select({
|
|
count: sql<number>`cast(count(*) as int)`,
|
|
vendor: visitorSchema.deviceVendor,
|
|
})
|
|
.from(visitorSchema)
|
|
.where(eq(visitorSchema.shortenerId, shortener.id))
|
|
.groupBy(visitorSchema.deviceVendor)
|
|
|
|
const visitorByDeviceType = await db
|
|
.select({
|
|
count: sql<number>`cast(count(*) as int)`,
|
|
type: visitorSchema.deviceType,
|
|
})
|
|
.from(visitorSchema)
|
|
.where(eq(visitorSchema.shortenerId, shortener.id))
|
|
.groupBy(visitorSchema.deviceType)
|
|
|
|
return {
|
|
shortener,
|
|
visitor,
|
|
visitorByCountry,
|
|
visitorByCity,
|
|
visitorByOS,
|
|
visitorByDeviceVendor,
|
|
visitorByDeviceType,
|
|
}
|
|
}) satisfies PageServerLoad
|