@@ -7,6 +7,12 @@ import {
77 getDailyActivity ,
88 getActiveUsers ,
99 getSummaryStats ,
10+ getHelpCommandStats ,
11+ getAccountLinkingMetrics ,
12+ getMediaMarkingBreakdown ,
13+ getContextMetrics ,
14+ getErrorAnalysis ,
15+ getSelectionMenuStats ,
1016 type GetCommandLogsParams ,
1117} from "@/lib/discord/audit"
1218import { prisma } from "@/lib/prisma"
@@ -244,3 +250,158 @@ export async function getDiscordDashboardData(params: GetStatsParams) {
244250 }
245251 }
246252}
253+
254+ export async function getDiscordHelpStats ( params : GetStatsParams ) {
255+ await requireAdmin ( )
256+
257+ try {
258+ const stats = await getHelpCommandStats (
259+ new Date ( params . startDate ) ,
260+ toEndOfDayExclusive ( params . endDate ) !
261+ )
262+
263+ return { success : true , stats }
264+ } catch ( error ) {
265+ logger . error ( "Failed to get Discord help stats" , error instanceof Error ? error : undefined )
266+ return {
267+ success : false ,
268+ error : error instanceof Error ? error . message : "Failed to get help stats" ,
269+ stats : null ,
270+ }
271+ }
272+ }
273+
274+ export async function getDiscordLinkingMetrics ( params : GetStatsParams ) {
275+ await requireAdmin ( )
276+
277+ try {
278+ const metrics = await getAccountLinkingMetrics (
279+ new Date ( params . startDate ) ,
280+ toEndOfDayExclusive ( params . endDate ) !
281+ )
282+
283+ return { success : true , metrics }
284+ } catch ( error ) {
285+ logger . error ( "Failed to get Discord linking metrics" , error instanceof Error ? error : undefined )
286+ return {
287+ success : false ,
288+ error : error instanceof Error ? error . message : "Failed to get linking metrics" ,
289+ metrics : null ,
290+ }
291+ }
292+ }
293+
294+ export async function getDiscordMediaMarkingBreakdown ( params : GetStatsParams ) {
295+ await requireAdmin ( )
296+
297+ try {
298+ const breakdown = await getMediaMarkingBreakdown (
299+ new Date ( params . startDate ) ,
300+ toEndOfDayExclusive ( params . endDate ) !
301+ )
302+
303+ return { success : true , breakdown }
304+ } catch ( error ) {
305+ logger . error ( "Failed to get Discord media marking breakdown" , error instanceof Error ? error : undefined )
306+ return {
307+ success : false ,
308+ error : error instanceof Error ? error . message : "Failed to get media marking breakdown" ,
309+ breakdown : null ,
310+ }
311+ }
312+ }
313+
314+ export async function getDiscordContextMetrics ( params : GetStatsParams ) {
315+ await requireAdmin ( )
316+
317+ try {
318+ const metrics = await getContextMetrics (
319+ new Date ( params . startDate ) ,
320+ toEndOfDayExclusive ( params . endDate ) !
321+ )
322+
323+ return { success : true , metrics }
324+ } catch ( error ) {
325+ logger . error ( "Failed to get Discord context metrics" , error instanceof Error ? error : undefined )
326+ return {
327+ success : false ,
328+ error : error instanceof Error ? error . message : "Failed to get context metrics" ,
329+ metrics : null ,
330+ }
331+ }
332+ }
333+
334+ export async function getDiscordErrorAnalysis ( params : GetStatsParams ) {
335+ await requireAdmin ( )
336+
337+ try {
338+ const analysis = await getErrorAnalysis (
339+ new Date ( params . startDate ) ,
340+ toEndOfDayExclusive ( params . endDate ) !
341+ )
342+
343+ return { success : true , analysis }
344+ } catch ( error ) {
345+ logger . error ( "Failed to get Discord error analysis" , error instanceof Error ? error : undefined )
346+ return {
347+ success : false ,
348+ error : error instanceof Error ? error . message : "Failed to get error analysis" ,
349+ analysis : null ,
350+ }
351+ }
352+ }
353+
354+ export async function getDiscordSelectionStats ( params : GetStatsParams ) {
355+ await requireAdmin ( )
356+
357+ try {
358+ const stats = await getSelectionMenuStats (
359+ new Date ( params . startDate ) ,
360+ toEndOfDayExclusive ( params . endDate ) !
361+ )
362+
363+ return { success : true , stats }
364+ } catch ( error ) {
365+ logger . error ( "Failed to get Discord selection stats" , error instanceof Error ? error : undefined )
366+ return {
367+ success : false ,
368+ error : error instanceof Error ? error . message : "Failed to get selection stats" ,
369+ stats : null ,
370+ }
371+ }
372+ }
373+
374+ export async function getDiscordDetailedStats ( params : GetStatsParams ) {
375+ await requireAdmin ( )
376+
377+ try {
378+ const [ helpResult , linkingResult , mediaResult , contextResult , errorResult , selectionResult ] =
379+ await Promise . all ( [
380+ getDiscordHelpStats ( params ) ,
381+ getDiscordLinkingMetrics ( params ) ,
382+ getDiscordMediaMarkingBreakdown ( params ) ,
383+ getDiscordContextMetrics ( params ) ,
384+ getDiscordErrorAnalysis ( params ) ,
385+ getDiscordSelectionStats ( params ) ,
386+ ] )
387+
388+ return {
389+ success : true ,
390+ data : {
391+ helpStats : helpResult . success ? helpResult . stats : null ,
392+ linkingMetrics : linkingResult . success ? linkingResult . metrics : null ,
393+ mediaMarkingBreakdown : mediaResult . success ? mediaResult . breakdown : null ,
394+ contextMetrics : contextResult . success ? contextResult . metrics : null ,
395+ errorAnalysis : errorResult . success ? errorResult . analysis : null ,
396+ selectionStats : selectionResult . success ? selectionResult . stats : null ,
397+ } ,
398+ }
399+ } catch ( error ) {
400+ logger . error ( "Failed to get Discord detailed stats" , error instanceof Error ? error : undefined )
401+ return {
402+ success : false ,
403+ error : error instanceof Error ? error . message : "Failed to get detailed stats" ,
404+ data : null ,
405+ }
406+ }
407+ }
0 commit comments