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

View File

@@ -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")
);

View File

@@ -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")
);

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "GuildSettings" ADD COLUMN "ticketsEnabled" BOOLEAN;

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "GuildSettings" ADD COLUMN "supportRoleId" TEXT;

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Ticket" ADD COLUMN "ticketNumber" SERIAL NOT NULL;

View File

@@ -0,0 +1,3 @@
-- AlterTable
ALTER TABLE "GuildSettings" ADD COLUMN "musicEnabled" BOOLEAN;
ALTER TABLE "GuildSettings" ADD COLUMN "automodConfig" JSONB;

View File

@@ -0,0 +1,2 @@
-- CreateIndex
CREATE UNIQUE INDEX "Level_userId_guildId_key" ON "Level"("userId", "guildId");

View File

@@ -0,0 +1,2 @@
-- Placeholder migration to keep history consistent.
-- Welcome module fields are already present in the current schema.

View File

@@ -0,0 +1,3 @@
-- AlterTable
ALTER TABLE "GuildSettings" ADD COLUMN "dynamicVoiceEnabled" BOOLEAN;
ALTER TABLE "GuildSettings" ADD COLUMN "dynamicVoiceConfig" JSONB;

View File

@@ -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");

View File

@@ -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;

View File

@@ -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"

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])
}