Skip to content

Commit 0ee1aab

Browse files
committed
mod: add mute ticket route
1 parent 21565ae commit 0ee1aab

5 files changed

Lines changed: 88 additions & 0 deletions

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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;

prisma/schema.prisma

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
882902
model Inbox {
883903
@@map("inboxes")
884904
id String @id

src/routes/moderation/Router.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import { getServersActive } from './getServersActive';
3636
import { deleteSuggestModActions } from './suggestDeleteModActions';
3737
import { listSuggestModActions } from './suggestListModActions';
3838
import { suggestModAction } from './suggestModAction';
39+
import { ticketMute } from './muteTicket';
3940

4041
const ModerationRouter = Router();
4142

@@ -78,6 +79,7 @@ getServers(ModerationRouter);
7879
getTicket(ModerationRouter);
7980
getTickets(ModerationRouter);
8081
ticketUpdate(ModerationRouter);
82+
ticketMute(ModerationRouter);
8183

8284
announcementPostCreate(ModerationRouter);
8385
announcementPostRemove(ModerationRouter);

src/routes/moderation/getTickets.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff 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
},
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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+
}

0 commit comments

Comments
 (0)