feat(dm-dashboard): Wave 1 — auth fixes, DB schema, Open5e interfaces, AI clients

- Fix auth anti-patterns (JWT, OAuth, logout, middleware, url.origin)
- Extend DB schema with tier, npcs, counters, translations, notes, initiative
- Expand Open5e TypeScript interfaces (Monster, Spell) to full V2
- Build OpenRouter API client for FREE tier
- Build Kimi API client for PRO tier
- Add comprehensive tests for all modules
This commit is contained in:
emil
2026-05-15 21:28:42 +03:00
parent 1f09270329
commit 25f43ec4e2
29 changed files with 3649 additions and 50 deletions
+8 -8
View File
@@ -197,7 +197,7 @@ describe("Open5e Client", () => {
},
];
mockStorage.setItem(
"open5e:monsters:dragon",
"open5e:v2:monsters:dragon",
JSON.stringify({ data: cached, timestamp: Date.now() })
);
@@ -230,7 +230,7 @@ describe("Open5e Client", () => {
) as unknown as typeof fetch;
await searchMonsters("new");
const stored = mockStorage.getItem("open5e:monsters:new");
const stored = mockStorage.getItem("open5e:v2:monsters:new");
expect(stored).not.toBeNull();
const parsed = JSON.parse(stored!);
expect(parsed.data).toEqual(mockData.results);
@@ -249,7 +249,7 @@ describe("Open5e Client", () => {
},
];
mockStorage.setItem(
"open5e:monsters:dragon",
"open5e:v2:monsters:dragon",
JSON.stringify({ data: cached, timestamp: Date.now() })
);
@@ -277,7 +277,7 @@ describe("Open5e Client", () => {
},
];
mockStorage.setItem(
"open5e:monsters:dragon",
"open5e:v2:monsters:dragon",
JSON.stringify({ data: staleData, timestamp: Date.now() - 25 * 60 * 60 * 1000 })
);
@@ -318,10 +318,10 @@ describe("Open5e Client", () => {
await searchSpells("fire");
await getSpell("fireball");
expect(mockStorage.getItem("open5e:monsters:dragon")).not.toBeNull();
expect(mockStorage.getItem("open5e:monster:goblin")).not.toBeNull();
expect(mockStorage.getItem("open5e:spells:fire")).not.toBeNull();
expect(mockStorage.getItem("open5e:spell:fireball")).not.toBeNull();
expect(mockStorage.getItem("open5e:v2:monsters:dragon")).not.toBeNull();
expect(mockStorage.getItem("open5e:v2:monster:goblin")).not.toBeNull();
expect(mockStorage.getItem("open5e:v2:spells:fire")).not.toBeNull();
expect(mockStorage.getItem("open5e:v2:spell:fireball")).not.toBeNull();
});
});
});