Add events module with dashboard UI, scheduling, signups, and settings updates; extend env/readme.
This commit is contained in:
29
src/database/migrations/20251201111117_init/migration.sql
Normal file
29
src/database/migrations/20251201111117_init/migration.sql
Normal 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")
|
||||
);
|
||||
@@ -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;
|
||||
3
src/database/migrations/migration_lock.toml
Normal file
3
src/database/migrations/migration_lock.toml
Normal 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"
|
||||
@@ -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])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user