refactor: remove unused anchorRoleId parameter from DiscordRoleRepository and decentralize type definitions

This commit is contained in:
MythEclipse
2026-06-06 03:06:00 +07:00
parent 03e2a28e97
commit 66d3b5e997
7 changed files with 43 additions and 36 deletions
+2 -2
View File
@@ -16,7 +16,7 @@ export function attachBotHandlers(client: Client, config: AppConfig): void {
const service = new BoosterRoleService(
store,
new DiscordRoleRepository(interaction.guild, config.boosterRoleAnchorRoleId),
new DiscordRoleRepository(interaction.guild),
{ anchorPosition: resolveAnchorPosition(interaction.guild, config.boosterRoleAnchorRoleId) }
);
@@ -28,7 +28,7 @@ export function attachBotHandlers(client: Client, config: AppConfig): void {
client.on("guildMemberUpdate", async (oldMember, newMember) => {
const service = new BoosterRoleService(
store,
new DiscordRoleRepository(newMember.guild, config.boosterRoleAnchorRoleId),
new DiscordRoleRepository(newMember.guild),
{ anchorPosition: resolveAnchorPosition(newMember.guild, config.boosterRoleAnchorRoleId) }
);
+1 -1
View File
@@ -27,7 +27,7 @@ client.once("clientReady", () => {
startBoostCleanup(
client,
store,
(guild) => new DiscordRoleRepository(guild, config.boosterRoleAnchorRoleId),
(guild) => new DiscordRoleRepository(guild),
{
intervalMs: config.boostCleanupIntervalMs,
boosterEligibilityRoleId: config.boosterEligibilityRoleId,
+5 -27
View File
@@ -7,38 +7,16 @@ import {
normalizeHexColor,
normalizeOptionalHexColor,
validateRoleName,
type ExistingRole,
type ManagedRoleIdentity
} from "../domain/roleGuards";
import { ValidationError, NotFoundError } from "../domain/errors";
export type BoosterRoleRecord = {
guildId: string;
userId: string;
roleId: string;
name: string;
color: string | null;
color2: string | null;
icon: string | null;
createdAt: number;
updatedAt: number;
};
import type { BoosterRoleRecord, BoosterRoleStore } from "./drizzleBoosterRoleStore";
import type { RoleRepository } from "./discordRoleRepository";
export type BoosterRoleStore = {
findByUser(guildId: string, userId: string): Promise<BoosterRoleRecord | null>;
findByGuild(guildId: string): Promise<BoosterRoleRecord[]>;
create(record: BoosterRoleRecord): Promise<void>;
delete(guildId: string, userId: string): Promise<void>;
};
export type RoleRepository = {
listRoles(): Promise<ExistingRole[]>;
createRole(input: { name: string; color: string | null; colors?: { primaryColor: string; secondaryColor?: string; tertiaryColor?: string } | null; permissions: string[]; position: number }): Promise<{ id: string }>;
updateRole(roleId: string, input: { name?: string; color?: string | null; colors?: { primaryColor: string; secondaryColor?: string; tertiaryColor?: string } | null; icon?: string | null }): Promise<void>;
assignRole(userId: string, roleId: string): Promise<void>;
removeRole(userId: string, roleId: string): Promise<void>;
deleteRole(roleId: string): Promise<void>;
};
// Re-export for consumers that import from this module
export type { BoosterRoleRecord, BoosterRoleStore };
export type { RoleRepository } from "./discordRoleRepository";
export type RoleIcon = {
contentType: string;
+11 -4
View File
@@ -1,10 +1,17 @@
import type { ColorResolvable, Guild, Role, RoleColorsResolvable } from "discord.js";
import type { RoleRepository } from "./boosterRoleService";
import type { ExistingRole } from "../domain/roleGuards";
export type RoleRepository = {
listRoles(): Promise<ExistingRole[]>;
createRole(input: { name: string; color: string | null; colors?: { primaryColor: string; secondaryColor?: string; tertiaryColor?: string } | null; permissions: string[]; position: number }): Promise<{ id: string }>;
updateRole(roleId: string, input: { name?: string; color?: string | null; colors?: { primaryColor: string; secondaryColor?: string; tertiaryColor?: string } | null; icon?: string | null }): Promise<void>;
assignRole(userId: string, roleId: string): Promise<void>;
removeRole(userId: string, roleId: string): Promise<void>;
deleteRole(roleId: string): Promise<void>;
};
export class DiscordRoleRepository implements RoleRepository {
constructor(private readonly guild: Guild, anchorRoleId: string | null) {
void anchorRoleId;
}
constructor(private readonly guild: Guild) {}
async listRoles() {
await this.guild.roles.fetch();
+19 -1
View File
@@ -1,6 +1,24 @@
import { and, eq } from "drizzle-orm";
import { boosterRoles } from "../db/schema";
import type { BoosterRoleRecord, BoosterRoleStore } from "./boosterRoleService";
export type BoosterRoleRecord = {
guildId: string;
userId: string;
roleId: string;
name: string;
color: string | null;
color2: string | null;
icon: string | null;
createdAt: number;
updatedAt: number;
};
export type BoosterRoleStore = {
findByUser(guildId: string, userId: string): Promise<BoosterRoleRecord | null>;
findByGuild(guildId: string): Promise<BoosterRoleRecord[]>;
create(record: BoosterRoleRecord): Promise<void>;
delete(guildId: string, userId: string): Promise<void>;
};
type SelectQuery = {
where(condition: unknown): QueryWithLimit & Promise<BoosterRoleRecord[]>;