diff --git a/prisma/schema.prisma b/prisma/schema.prisma index bcb6cc5..476937d 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -145,13 +145,12 @@ model Reminder { } model Starboard { - starboard_id BigInt @id @default(autoincrement()) + guild_id BigInt @id starboard_channel_id BigInt starboard_emoji String starboard_threshold Int - guild_id BigInt guild Guild @relation(fields: [guild_id], references: [guild_id]) - @@unique([starboard_id, guild_id]) - @@index([starboard_id, guild_id]) + @@unique([guild_id]) + @@index([guild_id]) } diff --git a/tux/database/controllers/__init__.py b/tux/database/controllers/__init__.py index f096d65..3ae8ff1 100644 --- a/tux/database/controllers/__init__.py +++ b/tux/database/controllers/__init__.py @@ -4,6 +4,7 @@ from .guild_config import GuildConfigController from .note import NoteController from .reminder import ReminderController from .snippet import SnippetController +from .starboard import StarboardController class DatabaseController: @@ -14,3 +15,4 @@ class DatabaseController: self.reminder = ReminderController() self.guild = GuildController() self.guild_config = GuildConfigController() + self.starboard = StarboardController() diff --git a/tux/database/controllers/starboard.py b/tux/database/controllers/starboard.py new file mode 100644 index 0000000..4a93a94 --- /dev/null +++ b/tux/database/controllers/starboard.py @@ -0,0 +1,49 @@ +from prisma.models import Guild, Starboard +from tux.database.client import db + + +class StarboardController: + def __init__(self): + self.table = db.starboard + self.guild_table = db.guild + + async def ensure_guild_exists(self, guild_id: int) -> Guild | None: + guild = await self.guild_table.find_unique(where={"guild_id": guild_id}) + if guild is None: + return await self.guild_table.create(data={"guild_id": guild_id}) + return guild + + async def get_all_starboards(self) -> list[Starboard]: + return await self.table.find_many() + + async def get_starboard_by_guild_id(self, guild_id: int) -> Starboard | None: + return await self.table.find_unique(where={"guild_id": guild_id}) + + async def create_or_update_starboard( + self, + guild_id: int, + starboard_channel_id: int, + starboard_emoji: str, + starboard_threshold: int, + ) -> Starboard: + await self.ensure_guild_exists(guild_id) + + return await self.table.upsert( + where={"guild_id": guild_id}, + data={ + "create": { + "guild_id": guild_id, + "starboard_channel_id": starboard_channel_id, + "starboard_emoji": starboard_emoji, + "starboard_threshold": starboard_threshold, + }, + "update": { + "starboard_channel_id": starboard_channel_id, + "starboard_emoji": starboard_emoji, + "starboard_threshold": starboard_threshold, + }, + }, + ) + + async def delete_starboard_by_guild_id(self, guild_id: int) -> Starboard | None: + return await self.table.delete(where={"guild_id": guild_id})