Add events module with dashboard UI, scheduling, signups, and settings updates; extend env/readme.

This commit is contained in:
Pascal Prießnitz
2025-12-02 23:52:10 +01:00
parent 874b01c999
commit 829d160164
578 changed files with 37647 additions and 11590 deletions
@@ -0,0 +1,29 @@
-- CreateTable
CREATE TABLE "Ticket" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"channelId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"topic" TEXT,
"priority" TEXT NOT NULL DEFAULT 'normal',
"status" TEXT NOT NULL,
"claimedBy" TEXT,
"transcript" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Ticket_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Level" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"xp" INTEGER NOT NULL DEFAULT 0,
"level" INTEGER NOT NULL DEFAULT 0,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Level_pkey" PRIMARY KEY ("id")
);
@@ -0,0 +1,12 @@
-- CreateTable
CREATE TABLE "GuildSettings" (
"guildId" TEXT NOT NULL,
"welcomeChannelId" TEXT,
"logChannelId" TEXT,
"automodEnabled" BOOLEAN,
"levelingEnabled" BOOLEAN,
"updatedAt" TIMESTAMP(3) NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "GuildSettings_pkey" PRIMARY KEY ("guildId")
);
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "GuildSettings" ADD COLUMN "ticketsEnabled" BOOLEAN;
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "GuildSettings" ADD COLUMN "supportRoleId" TEXT;
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Ticket" ADD COLUMN "ticketNumber" SERIAL NOT NULL;
@@ -0,0 +1,3 @@
-- AlterTable
ALTER TABLE "GuildSettings" ADD COLUMN "musicEnabled" BOOLEAN;
ALTER TABLE "GuildSettings" ADD COLUMN "automodConfig" JSONB;
@@ -0,0 +1,2 @@
-- CreateIndex
CREATE UNIQUE INDEX "Level_userId_guildId_key" ON "Level"("userId", "guildId");
@@ -0,0 +1,2 @@
-- Placeholder migration to keep history consistent.
-- Welcome module fields are already present in the current schema.
@@ -0,0 +1,3 @@
-- AlterTable
ALTER TABLE "GuildSettings" ADD COLUMN "dynamicVoiceEnabled" BOOLEAN;
ALTER TABLE "GuildSettings" ADD COLUMN "dynamicVoiceConfig" JSONB;
@@ -0,0 +1,46 @@
-- AlterTable
ALTER TABLE "GuildSettings" ADD COLUMN "birthdayConfig" JSONB,
ADD COLUMN "birthdayEnabled" BOOLEAN,
ADD COLUMN "reactionRolesConfig" JSONB,
ADD COLUMN "reactionRolesEnabled" BOOLEAN,
ADD COLUMN "statuspageConfig" JSONB,
ADD COLUMN "statuspageEnabled" BOOLEAN;
-- CreateTable
CREATE TABLE "Birthday" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"birthDate" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Birthday_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "ReactionRoleSet" (
"id" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"channelId" TEXT NOT NULL,
"messageId" TEXT,
"title" TEXT,
"description" TEXT,
"entries" JSONB NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "ReactionRoleSet_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "Birthday_guildId_idx" ON "Birthday"("guildId");
-- CreateIndex
CREATE UNIQUE INDEX "Birthday_userId_guildId_key" ON "Birthday"("userId", "guildId");
-- CreateIndex
CREATE INDEX "ReactionRoleSet_guildId_idx" ON "ReactionRoleSet"("guildId");
-- CreateIndex
CREATE INDEX "ReactionRoleSet_guildId_messageId_idx" ON "ReactionRoleSet"("guildId", "messageId");
@@ -0,0 +1,66 @@
-- AlterTable
ALTER TABLE "GuildSettings" ADD COLUMN "eventsEnabled" BOOLEAN,
ADD COLUMN "supportLoginConfig" JSONB;
-- CreateTable
CREATE TABLE "TicketSupportSession" (
"id" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"roleId" TEXT NOT NULL,
"startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"endedAt" TIMESTAMP(3),
"durationSeconds" INTEGER,
CONSTRAINT "TicketSupportSession_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Event" (
"id" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"title" TEXT NOT NULL,
"description" TEXT,
"channelId" TEXT NOT NULL,
"startTime" TIMESTAMP(3) NOT NULL,
"repeatType" TEXT NOT NULL DEFAULT 'none',
"repeatConfig" JSONB,
"reminderOffsetMinutes" INTEGER NOT NULL DEFAULT 60,
"roleId" TEXT,
"isActive" BOOLEAN NOT NULL DEFAULT true,
"lastReminderAt" TIMESTAMP(3),
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Event_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "EventSignup" (
"id" TEXT NOT NULL,
"eventId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"canceledAt" TIMESTAMP(3),
CONSTRAINT "EventSignup_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "TicketSupportSession_guildId_userId_endedAt_idx" ON "TicketSupportSession"("guildId", "userId", "endedAt");
-- CreateIndex
CREATE INDEX "Event_guildId_idx" ON "Event"("guildId");
-- CreateIndex
CREATE INDEX "Event_guildId_startTime_idx" ON "Event"("guildId", "startTime");
-- CreateIndex
CREATE INDEX "EventSignup_guildId_eventId_idx" ON "EventSignup"("guildId", "eventId");
-- CreateIndex
CREATE UNIQUE INDEX "EventSignup_eventId_userId_key" ON "EventSignup"("eventId", "userId");
-- AddForeignKey
ALTER TABLE "EventSignup" ADD CONSTRAINT "EventSignup_eventId_fkey" FOREIGN KEY ("eventId") REFERENCES "Event"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "postgresql"
+102
View File
@@ -7,8 +7,33 @@ datasource db {
url = env("DATABASE_URL")
}
model GuildSettings {
guildId String @id
welcomeChannelId String?
logChannelId String?
automodEnabled Boolean?
automodConfig Json?
levelingEnabled Boolean?
ticketsEnabled Boolean?
musicEnabled Boolean?
statuspageEnabled Boolean?
statuspageConfig Json?
dynamicVoiceEnabled Boolean?
dynamicVoiceConfig Json?
supportLoginConfig Json?
birthdayEnabled Boolean?
birthdayConfig Json?
reactionRolesEnabled Boolean?
reactionRolesConfig Json?
eventsEnabled Boolean?
supportRoleId String?
updatedAt DateTime @updatedAt
createdAt DateTime @default(now())
}
model Ticket {
id String @id @default(cuid())
ticketNumber Int @default(autoincrement())
userId String
channelId String
guildId String
@@ -29,4 +54,81 @@ model Level {
level Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([userId, guildId], name: "userId_guildId")
}
model TicketSupportSession {
id String @id @default(cuid())
guildId String
userId String
roleId String
startedAt DateTime @default(now())
endedAt DateTime?
durationSeconds Int?
@@index([guildId, userId, endedAt])
}
model Birthday {
id String @id @default(cuid())
userId String
guildId String
birthDate String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([userId, guildId], name: "birthday_user_guild")
@@index([guildId])
}
model ReactionRoleSet {
id String @id @default(cuid())
guildId String
channelId String
messageId String?
title String?
description String?
entries Json
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([guildId])
@@index([guildId, messageId])
}
model Event {
id String @id @default(cuid())
guildId String
title String
description String?
channelId String
startTime DateTime
repeatType String @default("none")
repeatConfig Json?
reminderOffsetMinutes Int @default(60)
roleId String?
isActive Boolean @default(true)
lastReminderAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
signups EventSignup[]
@@index([guildId])
@@index([guildId, startTime])
}
model EventSignup {
id String @id @default(cuid())
eventId String
guildId String
userId String
createdAt DateTime @default(now())
canceledAt DateTime?
event Event @relation(fields: [eventId], references: [id])
@@unique([eventId, userId])
@@index([guildId, eventId])
}