From 31299b14021669d7f0ea5d76e0ef95eb66a7c0c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E5=BF=83=E7=A6=BE?= Date: Mon, 17 Jul 2023 01:39:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E5=B8=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/viewer/src/app/Footer.tsx | 7 +++ packages/viewer/src/app/[id]/layout.tsx | 20 ++++++- packages/viewer/src/app/removal/page.tsx | 24 ++++++++ .../app/user/[uid]/discussions/data/route.ts | 1 + .../app/user/[uid]/participated/data/route.ts | 1 + .../src/app/user/[uid]/replies/data/route.ts | 1 + packages/viewer/src/components/UserInfo.tsx | 6 +- .../migration.sql | 14 +++++ prisma/schema.prisma | 58 +++++++++++-------- 9 files changed, 102 insertions(+), 30 deletions(-) create mode 100644 packages/viewer/src/app/removal/page.tsx create mode 100644 prisma/migrations/20230716173707_discussion_takedown/migration.sql diff --git a/packages/viewer/src/app/Footer.tsx b/packages/viewer/src/app/Footer.tsx index 22c0641..5c322b6 100644 --- a/packages/viewer/src/app/Footer.tsx +++ b/packages/viewer/src/app/Footer.tsx @@ -61,6 +61,13 @@ export default function Footer() { 联系我们 {" "} ·{" "} + + 删帖政策 + {" "} + ·{" "} +

{takedown.reason}

+

+ 由 申请删除。 +

+ + ); + return (
diff --git a/packages/viewer/src/app/removal/page.tsx b/packages/viewer/src/app/removal/page.tsx new file mode 100644 index 0000000..331ce52 --- /dev/null +++ b/packages/viewer/src/app/removal/page.tsx @@ -0,0 +1,24 @@ +export default function Page() { + return ( + <> +

删除政策

+

+ 如果您认为我们保存的帖子侵犯了您的权益或违反公序良俗,请发邮件至{" "} + lda@piterator.com{" "} + 申请删除。您的邮件应该包含: +

+
    +
  1. 要删除的帖子编号(一个或多个);
  2. +
  3. + 我们应该删除这个/这些帖子的理由(不会被公开,但这是我们判断是否删帖的依据); +
  4. +
  5. *申请者的洛谷用户编号;
  6. +
  7. + *需要展示给访问者的文本内容(例如,可以包含公开的删除原因、用户应该查阅的辟谣帖等),每个帖子须对应一段文字。 +
  8. +
+

上述标注星号(*)的内容会在被删除的帖子页面上展示。

+

我们一般将会在一天内回复您。

+ + ); +} diff --git a/packages/viewer/src/app/user/[uid]/discussions/data/route.ts b/packages/viewer/src/app/user/[uid]/discussions/data/route.ts index d43492b..11506b4 100644 --- a/packages/viewer/src/app/user/[uid]/discussions/data/route.ts +++ b/packages/viewer/src/app/user/[uid]/discussions/data/route.ts @@ -14,6 +14,7 @@ export async function GET( select: selectDiscussionWithContent, where: { snapshots: { some: { authorId: uid } }, + takedown: { is: null }, id: { lt: cursor ? parseInt(cursor, 10) : undefined }, }, orderBy: { id: "desc" }, diff --git a/packages/viewer/src/app/user/[uid]/participated/data/route.ts b/packages/viewer/src/app/user/[uid]/participated/data/route.ts index 1a0bdb8..9c3d48f 100644 --- a/packages/viewer/src/app/user/[uid]/participated/data/route.ts +++ b/packages/viewer/src/app/user/[uid]/participated/data/route.ts @@ -21,6 +21,7 @@ export async function GET( { replies: { some: { authorId: uid } } }, { snapshots: { some: { authorId: uid } } }, ], + takedown: { is: null }, id: { lt: cursor ? parseInt(cursor, 10) : undefined }, }, orderBy: { id: "desc" }, diff --git a/packages/viewer/src/app/user/[uid]/replies/data/route.ts b/packages/viewer/src/app/user/[uid]/replies/data/route.ts index 62dad73..1f3c351 100644 --- a/packages/viewer/src/app/user/[uid]/replies/data/route.ts +++ b/packages/viewer/src/app/user/[uid]/replies/data/route.ts @@ -29,6 +29,7 @@ export async function GET( }, where: { authorId: uid, + discussion: { takedown: { is: null } }, id: { lt: cursor ? parseInt(cursor, 10) : undefined }, }, orderBy: { id: "desc" }, diff --git a/packages/viewer/src/components/UserInfo.tsx b/packages/viewer/src/components/UserInfo.tsx index 4570e00..d47e706 100644 --- a/packages/viewer/src/components/UserInfo.tsx +++ b/packages/viewer/src/components/UserInfo.tsx @@ -16,16 +16,14 @@ export default function UserInfo({ {href === undefined ? ( {user.username} ) : ( diff --git a/prisma/migrations/20230716173707_discussion_takedown/migration.sql b/prisma/migrations/20230716173707_discussion_takedown/migration.sql new file mode 100644 index 0000000..8cce636 --- /dev/null +++ b/prisma/migrations/20230716173707_discussion_takedown/migration.sql @@ -0,0 +1,14 @@ +-- CreateTable +CREATE TABLE "DiscussionTakedown" ( + "discussionId" INTEGER NOT NULL, + "reason" TEXT NOT NULL, + "submitterId" INTEGER NOT NULL, + + CONSTRAINT "DiscussionTakedown_pkey" PRIMARY KEY ("discussionId") +); + +-- AddForeignKey +ALTER TABLE "DiscussionTakedown" ADD CONSTRAINT "DiscussionTakedown_discussionId_fkey" FOREIGN KEY ("discussionId") REFERENCES "Discussion"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "DiscussionTakedown" ADD CONSTRAINT "DiscussionTakedown_submitterId_fkey" FOREIGN KEY ("submitterId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index d85aa51..d19bed3 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -2,7 +2,7 @@ // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { - provider = "prisma-client-js" + provider = "prisma-client-js" binaryTargets = ["native", "debian-openssl-3.0.x"] } @@ -12,23 +12,25 @@ datasource db { } model User { - id Int @id - username String @db.VarChar - color String @db.VarChar - checkmark String? @db.Char(7) - badge String? @db.VarChar - snapshots Snapshot[] - replies Reply[] - pastes Paste[] - judgements Judgement[] + id Int @id + username String @db.VarChar + color String @db.VarChar + checkmark String? @db.Char(7) + badge String? @db.VarChar + snapshots Snapshot[] + replies Reply[] + pastes Paste[] + judgements Judgement[] + discussionTakedowns DiscussionTakedown[] } model Discussion { - id Int @id - time DateTime @db.Timestamp(0) + id Int @id + time DateTime @db.Timestamp(0) snapshots Snapshot[] replyCount Int replies Reply[] + takedown DiscussionTakedown? } model Snapshot { @@ -46,6 +48,26 @@ model Snapshot { @@index([discussionId]) } +model Reply { + id Int @id + discussion Discussion @relation(fields: [discussionId], references: [id]) + discussionId Int + time DateTime @db.Timestamp(0) + author User @relation(fields: [authorId], references: [id]) + authorId Int + content String @db.Text + + @@index([discussionId]) +} + +model DiscussionTakedown { + discussion Discussion @relation(fields: [discussionId], references: [id]) + discussionId Int @id + reason String + submitter User @relation(fields: [submitterId], references: [id]) + submitterId Int +} + model Paste { id String @id @db.Char(8) time DateTime @db.Timestamp(0) @@ -65,18 +87,6 @@ model PasteSnapshot { @@id([pasteId, time]) } -model Reply { - id Int @id - discussion Discussion @relation(fields: [discussionId], references: [id]) - discussionId Int - time DateTime @db.Timestamp(0) - author User @relation(fields: [authorId], references: [id]) - authorId Int - content String @db.Text - - @@index([discussionId]) -} - model Judgement { time DateTime @db.Timestamp(0) user User @relation(fields: [userId], references: [id])