refactor: consolidate config types and remove file-based config

Tickets: #2, #3

- Remove duplicate type definitions from shared/lib/config.ts
- Import types from schema files (game-settings.ts, guild-settings.ts)
- Add GuildConfig interface to guild-settings.ts schema
- Rename ModerationConfig to ModerationCaseConfig in moderation.service.ts
- Delete shared/config/config.json and shared/scripts/migrate-config-to-db.ts
- Update settings API to use gameSettingsService exclusively
- Return DB format (strings) from API instead of runtime BigInts
- Fix moderation service tests to pass config as parameter

Breaking Changes:
- Removes legacy file-based configuration system
- API now returns database format with string values for BigInt fields
This commit is contained in:
syntaxbullet
2026-02-13 13:24:02 +01:00
parent 2d35a5eabb
commit 6eb4a32a12
6 changed files with 95 additions and 384 deletions

View File

@@ -14,19 +14,7 @@ const mockReturning = mock();
const mockSet = mock();
const mockWhere = mock();
// Mock Config
const mockConfig = {
moderation: {
cases: {
dmOnWarn: true,
autoTimeoutThreshold: 3
}
}
};
mock.module("@shared/lib/config", () => ({
config: mockConfig
}));
// Mock View
const mockGetUserWarningEmbed = mock(() => ({}));
@@ -66,9 +54,6 @@ describe("ModerationService", () => {
mockSet.mockClear();
mockWhere.mockClear();
mockGetUserWarningEmbed.mockClear();
// Reset config to defaults
mockConfig.moderation.cases.dmOnWarn = true;
mockConfig.moderation.cases.autoTimeoutThreshold = 3;
});
describe("issueWarning", () => {
@@ -100,7 +85,6 @@ describe("ModerationService", () => {
});
it("should not DM if dmOnWarn is false", async () => {
mockConfig.moderation.cases.dmOnWarn = false;
mockFindFirst.mockResolvedValue({ caseId: "CASE-0001" });
mockReturning.mockResolvedValue([{ caseId: "CASE-0002" }]);
mockFindMany.mockResolvedValue([]);
@@ -109,7 +93,8 @@ describe("ModerationService", () => {
await ModerationService.issueWarning({
...defaultOptions,
dmTarget: mockDmTarget
dmTarget: mockDmTarget,
config: { dmOnWarn: false }
});
expect(mockDmTarget.send).not.toHaveBeenCalled();
@@ -125,7 +110,8 @@ describe("ModerationService", () => {
const result = await ModerationService.issueWarning({
...defaultOptions,
timeoutTarget: mockTimeoutTarget
timeoutTarget: mockTimeoutTarget,
config: { autoTimeoutThreshold: 3 }
});
expect(result.autoTimeoutIssued).toBe(true);

View File

@@ -5,7 +5,7 @@ import type { CreateCaseOptions, ClearCaseOptions, SearchCasesFilter } from "@/m
import { getUserWarningEmbed } from "@/modules/moderation/moderation.view";
import { CaseType } from "@shared/lib/constants";
export interface ModerationConfig {
export interface ModerationCaseConfig {
dmOnWarn?: boolean;
autoTimeoutThreshold?: number;
}
@@ -66,7 +66,7 @@ export class ModerationService {
guildName?: string;
dmTarget?: { send: (options: any) => Promise<any> };
timeoutTarget?: { timeout: (duration: number, reason: string) => Promise<any> };
config?: ModerationConfig;
config?: ModerationCaseConfig;
}) {
const moderationCase = await this.createCase({
type: CaseType.WARN,