feat: Update quest event triggers to include item IDs for granular tracking.

This commit is contained in:
syntaxbullet
2026-01-15 15:09:37 +01:00
parent 52f8ab11f0
commit 7d541825d8
2 changed files with 9 additions and 9 deletions

View File

@@ -40,7 +40,7 @@ export const inventoryService = {
// Trigger Quest Event // Trigger Quest Event
const { questService } = await import("@shared/modules/quest/quest.service"); const { questService } = await import("@shared/modules/quest/quest.service");
await questService.handleEvent(userId, 'ITEM_COLLECT', Number(quantity), txFn); await questService.handleEvent(userId, `ITEM_COLLECT:${itemId}`, Number(quantity), txFn);
return entry; return entry;
} else { } else {
@@ -68,7 +68,7 @@ export const inventoryService = {
// Trigger Quest Event // Trigger Quest Event
const { questService } = await import("@shared/modules/quest/quest.service"); const { questService } = await import("@shared/modules/quest/quest.service");
await questService.handleEvent(userId, 'ITEM_COLLECT', Number(quantity), txFn); await questService.handleEvent(userId, `ITEM_COLLECT:${itemId}`, Number(quantity), txFn);
return entry; return entry;
} }
@@ -191,7 +191,7 @@ export const inventoryService = {
// Trigger Quest Event // Trigger Quest Event
const { questService } = await import("@shared/modules/quest/quest.service"); const { questService } = await import("@shared/modules/quest/quest.service");
await questService.handleEvent(userId, 'ITEM_USE', 1, txFn); await questService.handleEvent(userId, `ITEM_USE:${itemId}`, 1, txFn);
return { success: true, results, usageData, item }; return { success: true, results, usageData, item };
}, tx); }, tx);

View File

@@ -150,31 +150,31 @@ describe("questService", () => {
}); });
describe("handleEvent", () => { describe("handleEvent", () => {
it("should progress a quest", async () => { it("should progress a quest with sub-events", async () => {
const mockUserQuest = { const mockUserQuest = {
userId: 1n, userId: 1n,
questId: 101, questId: 101,
progress: 0, progress: 0,
completedAt: null, completedAt: null,
quest: { triggerEvent: "TEST_EVENT", requirements: { target: 5 } } quest: { triggerEvent: "ITEM_USE:101", requirements: { target: 5 } }
}; };
mockFindMany.mockResolvedValue([mockUserQuest]); mockFindMany.mockResolvedValue([mockUserQuest]);
mockReturning.mockResolvedValue([{ userId: 1n, questId: 101, progress: 1 }]); mockReturning.mockResolvedValue([{ userId: 1n, questId: 101, progress: 1 }]);
await questService.handleEvent("1", "TEST_EVENT", 1); await questService.handleEvent("1", "ITEM_USE:101", 1);
expect(mockUpdate).toHaveBeenCalled(); expect(mockUpdate).toHaveBeenCalled();
expect(mockSet).toHaveBeenCalledWith({ progress: 1 }); expect(mockSet).toHaveBeenCalledWith({ progress: 1 });
}); });
it("should complete a quest when target reached", async () => { it("should complete a quest when target reached using sub-events", async () => {
const mockUserQuest = { const mockUserQuest = {
userId: 1n, userId: 1n,
questId: 101, questId: 101,
progress: 4, progress: 4,
completedAt: null, completedAt: null,
quest: { quest: {
triggerEvent: "TEST_EVENT", triggerEvent: "ITEM_COLLECT:505",
requirements: { target: 5 }, requirements: { target: 5 },
rewards: { balance: 100 } rewards: { balance: 100 }
} }
@@ -182,7 +182,7 @@ describe("questService", () => {
mockFindMany.mockResolvedValue([mockUserQuest]); mockFindMany.mockResolvedValue([mockUserQuest]);
mockFindFirst.mockResolvedValue(mockUserQuest); // For completeQuest mockFindFirst.mockResolvedValue(mockUserQuest); // For completeQuest
await questService.handleEvent("1", "TEST_EVENT", 1); await questService.handleEvent("1", "ITEM_COLLECT:505", 1);
// Verify completeQuest was called (it will update completedAt) // Verify completeQuest was called (it will update completedAt)
expect(mockUpdate).toHaveBeenCalled(); expect(mockUpdate).toHaveBeenCalled();