--- import { Icon } from 'astro-icon/components' import { actions, isInputError } from 'astro:actions' import { groupBy, round, uniq } from 'lodash-es' import InputSubmitButton from '../../components/InputSubmitButton.astro' import InputText from '../../components/InputText.astro' import InputTextArea from '../../components/InputTextArea.astro' import MiniLayout from '../../layouts/MiniLayout.astro' import { cn } from '../../lib/cn' import { prisma } from '../../lib/prisma' // Check if user is admin if (!Astro.locals.user?.admin) { return Astro.redirect('/access-denied') } const testResult = Astro.getActionResult(actions.admin.notification.webPush.test) const testInputErrors = isInputError(testResult?.error) ? testResult.error.fields : {} Astro.locals.banners.addIfSuccess(testResult, (data) => data.message) const subscriptions = await Astro.locals.banners.try( 'Error while fetching subscriptions by user', () => prisma.pushSubscription.findMany({ select: { id: true, user: { select: { id: true, name: true, }, }, }, }), [] as [] ) const totalSubscriptions = subscriptions.length const subscriptionsByUser = groupBy(subscriptions, 'user.id') const totalUsers = Object.keys(subscriptionsByUser).length const adminUsers = await prisma.user.findMany({ where: { admin: true, }, select: { name: true, }, }) const stats = [ { icon: 'ri:notification-4-line', iconClass: 'text-blue-400', title: 'Total Subscriptions', value: totalSubscriptions.toLocaleString(), }, { icon: 'ri:user-3-line', iconClass: 'text-green-400', title: 'Subscribed Users', value: totalUsers.toLocaleString(), }, { icon: 'ri:smartphone-line', iconClass: 'text-purple-400', title: 'Avg Devices/User', value: (totalUsers > 0 ? round(totalSubscriptions / totalUsers, 1) : 0).toLocaleString(), }, ] satisfies { icon: string iconClass: string title: string value: string }[] ---
{ stats.map((stat) => (
{stat.value}
{stat.title}
)) }

Send Test Notification

user.name)).join('\n')} description={[ '- Comma-separated list of user names.', '- Minimum 1 user name.', '- By default, all admin users are selected.', ].join('\n')} error={testInputErrors.userNames} />