11import { zValidator } from '@hono/zod-validator' ;
2- import { desc , ilike , isNotNull , or } from 'drizzle-orm' ;
2+ import { and , desc , eq , ilike , isNotNull , or , type SQL } from 'drizzle-orm' ;
33import { Hono } from 'hono' ;
44import { z } from 'zod' ;
55import cache from '@/lib/cache/default' ;
@@ -34,6 +34,26 @@ const api = new Hono<ApiContext>()
3434 } ) ;
3535 }
3636
37+ // Build the where condition with approved filter
38+ const conditions : SQL [ ] = [ eq ( streamer . approved , true ) ] ;
39+
40+ if ( search && platform ) {
41+ const searchCondition =
42+ platform === 'twitch'
43+ ? ilike ( streamer . twitchUsername , `${ search } ` )
44+ : ilike ( streamer . kickUsername , `${ search } ` ) ;
45+ conditions . push ( searchCondition ) ;
46+ } else if ( search ) {
47+ conditions . push (
48+ // biome-ignore lint/style/noNonNullAssertion: DO NOT CARE
49+ or (
50+ ilike ( streamer . name , `${ search } ` ) ,
51+ ilike ( streamer . twitchUsername , `${ search } ` ) ,
52+ ilike ( streamer . kickUsername , `${ search } ` )
53+ ) !
54+ ) ;
55+ }
56+
3757 const streamers = await db . query . streamer . findMany ( {
3858 columns : {
3959 id : true ,
@@ -47,18 +67,7 @@ const api = new Hono<ApiContext>()
4767 category : true ,
4868 title : true ,
4969 } ,
50- where :
51- search && platform
52- ? platform === 'twitch'
53- ? ilike ( streamer . twitchUsername , `${ search } ` )
54- : ilike ( streamer . kickUsername , `${ search } ` )
55- : search
56- ? or (
57- ilike ( streamer . name , `${ search } ` ) ,
58- ilike ( streamer . twitchUsername , `${ search } ` ) ,
59- ilike ( streamer . kickUsername , `${ search } ` )
60- )
61- : undefined ,
70+ where : and ( ...conditions ) ,
6271 orderBy : [ desc ( streamer . isLive ) , desc ( streamer . viewerCount ) ] ,
6372 } ) ;
6473
@@ -79,20 +88,58 @@ const api = new Hono<ApiContext>()
7988 } ) ;
8089 }
8190
82- // Return streamers that have both a twitch and kick username
91+ // Return streamers that have both a twitch and kick username AND are approved
8392 const streamers = await db . query . streamer . findMany ( {
84- where : ( streamer , { and } ) =>
85- and (
86- isNotNull ( streamer . twitchUsername ) ,
87- isNotNull ( streamer . kickUsername )
88- ) ,
93+ where : and (
94+ eq ( streamer . approved , true ) ,
95+ isNotNull ( streamer . twitchUsername ) ,
96+ isNotNull ( streamer . kickUsername )
97+ ) ,
8998 } ) ;
9099
91100 await cache . set ( 'streamers-multi' , JSON . stringify ( streamers ) ) ;
92101
93102 return c . json ( {
94103 streamers,
95104 } ) ;
96- } ) ;
105+ } )
106+ . post (
107+ '/streamers/suggest' ,
108+ zValidator (
109+ 'json' ,
110+ z . object ( {
111+ name : z . string ( ) ,
112+ twitchUsername : z . string ( ) ,
113+ kickUsername : z . string ( ) ,
114+ } )
115+ ) ,
116+ async ( c ) => {
117+ const { name, twitchUsername, kickUsername } = await c . req . json ( ) ;
118+
119+ try {
120+ await db
121+ . insert ( streamer )
122+ . values ( {
123+ name : name . trim ( ) . toLowerCase ( ) ,
124+ twitchUsername : twitchUsername . trim ( ) . toLowerCase ( ) ,
125+ kickUsername : kickUsername . trim ( ) . toLowerCase ( ) ,
126+ approved : false ,
127+ } )
128+ . onConflictDoNothing ( ) ;
129+
130+ return c . json ( {
131+ message : 'Streamer suggested' ,
132+ } ) ;
133+ } catch ( error ) {
134+ logger . withError ( error ) . error ( 'Failed to suggest streamer' ) ;
135+ return c . json (
136+ {
137+ message : 'Failed to suggest streamer' ,
138+ } ,
139+ 500
140+ ) ;
141+ }
142+ }
143+ ) ;
97144
98145export default api ;
0 commit comments