File tree Expand file tree Collapse file tree
migrations/20260331160119_add_ticket_ignore_table Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ -- CreateTable
2+ CREATE TABLE "ignored_tickets " (
3+ " id" TEXT NOT NULL ,
4+ " userId" TEXT NOT NULL ,
5+ " ticketId" INTEGER NOT NULL ,
6+
7+ CONSTRAINT " ignored_tickets_pkey" PRIMARY KEY (" id" )
8+ );
9+
10+ -- CreateIndex
11+ CREATE INDEX "ignored_tickets_userId_idx " ON " ignored_tickets" (" userId" );
12+
13+ -- CreateIndex
14+ CREATE UNIQUE INDEX "ignored_tickets_userId_ticketId_key " ON " ignored_tickets" (" userId" , " ticketId" );
15+
16+ -- AddForeignKey
17+ ALTER TABLE " ignored_tickets" ADD CONSTRAINT " ignored_tickets_userId_fkey" FOREIGN KEY (" userId" ) REFERENCES " users" (" id" ) ON DELETE CASCADE ON UPDATE CASCADE;
18+
19+ -- AddForeignKey
20+ ALTER TABLE " ignored_tickets" ADD CONSTRAINT " ignored_tickets_ticketId_fkey" FOREIGN KEY (" ticketId" ) REFERENCES " tickets" (" id" ) ON DELETE CASCADE ON UPDATE CASCADE;
Original file line number Diff line number Diff line change @@ -238,6 +238,8 @@ model User {
238238 moderationActions ModeratorSuggestAction ?
239239 inventory InventoryItem []
240240
241+ ignoredTickets IgnoredTicket []
242+
241243
242244 @@unique ([username , tag ] )
243245 @@index ([joinedAt ] )
@@ -877,8 +879,26 @@ model Ticket {
877879 openedBy User @relation (fields : [openedById ] , references : [id ] )
878880 openedAt DateTime @default (now () )
879881 seen Boolean ? @default (true )
882+
883+ ignoredByUsers IgnoredTicket []
880884}
881885
886+ // currently only used for moderators
887+ model IgnoredTicket {
888+ @@map (" ignored_tickets " )
889+ id String @id
890+ userId String
891+ user User @relation (fields : [userId ] , references : [id ] , onDelete : Cascade )
892+
893+ ticketId Int
894+ ticket Ticket @relation (fields : [ticketId ] , references : [id ] , onDelete : Cascade )
895+
896+ @@index ([userId ] )
897+
898+ @@unique ([userId , ticketId ] )
899+ }
900+
901+
882902model Inbox {
883903 @@map (" inboxes " )
884904 id String @id
Original file line number Diff line number Diff line change @@ -36,6 +36,7 @@ import { getServersActive } from './getServersActive';
3636import { deleteSuggestModActions } from './suggestDeleteModActions' ;
3737import { listSuggestModActions } from './suggestListModActions' ;
3838import { suggestModAction } from './suggestModAction' ;
39+ import { ticketMute } from './muteTicket' ;
3940
4041const ModerationRouter = Router ( ) ;
4142
@@ -78,6 +79,7 @@ getServers(ModerationRouter);
7879getTicket ( ModerationRouter ) ;
7980getTickets ( ModerationRouter ) ;
8081ticketUpdate ( ModerationRouter ) ;
82+ ticketMute ( ModerationRouter ) ;
8183
8284announcementPostCreate ( ModerationRouter ) ;
8385announcementPostRemove ( ModerationRouter ) ;
Original file line number Diff line number Diff line change @@ -14,6 +14,8 @@ async function route(req: Request, res: Response) {
1414 status = parseInt ( req . query . status ) as TicketStatus ;
1515 }
1616
17+ const includeIgnored = req . query . includeIgnored === 'true' ;
18+
1719 const after = req . query . after ? parseInt ( req . query . after as string ) : undefined ;
1820 let limit = parseInt ( ( req . query . limit || '30' ) as string ) ;
1921
@@ -22,6 +24,7 @@ async function route(req: Request, res: Response) {
2224 }
2325
2426 const tickets = await prisma . ticket . findMany ( {
27+ ...( includeIgnored ? { where : { ignoredByUsers : { none : { userId : req . userCache . id } } } } : { } ) ,
2528 orderBy : {
2629 lastUpdatedAt : 'desc' ,
2730 } ,
Original file line number Diff line number Diff line change 1+ import { Request , Response , Router } from 'express' ;
2+ import { rateLimit } from '../../middleware/rateLimit' ;
3+
4+ import { authenticate } from '../../middleware/authenticate' ;
5+ import { generateError } from '../../common/errorHandler' ;
6+ import { isModMiddleware } from './isModMiddleware' ;
7+ import { prisma } from '../../common/database' ;
8+ import { generateId } from '@src/common/flakeId' ;
9+
10+ export function ticketMute ( Router : Router ) {
11+ Router . post (
12+ '/moderation/tickets/:id/mute' ,
13+ authenticate ( ) ,
14+ isModMiddleware ( ) ,
15+
16+ rateLimit ( {
17+ name : 'ticket-mute-mod' ,
18+ restrictMS : 60000 ,
19+ requests : 60 ,
20+ } ) ,
21+ route ,
22+ ) ;
23+ }
24+
25+ async function route ( req : Request , res : Response ) {
26+ const id = parseInt ( req . params . id as string ) ;
27+
28+ const result = await prisma . ignoredTicket
29+ . create ( {
30+ data : {
31+ userId : req . userCache . id ,
32+ ticketId : id ,
33+ id : generateId ( ) ,
34+ } ,
35+ } )
36+ . catch ( ( ) => {
37+ return false ;
38+ } ) ;
39+ if ( ! result ) {
40+ return res . status ( 400 ) . json ( generateError ( 'You have already ignored this ticket!' ) ) ;
41+ }
42+ return res . json ( { success : true } ) ;
43+ }
You can’t perform that action at this time.
0 commit comments