fix: quest available filtering + 6 side quests level 2-4
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 36s

Fix: getAvailable filtre maintenant les quêtes active/completed (pas juste
claimed). Plus de doublons dailies, plus d'internal server error.

6 quêtes secondaires pour combler le gap level 2-5:
  Chasseur de champignons (lv2, 150 XP), La menace rampante (lv3, 180 XP),
  Guerrier éprouvé (lv2, 250 XP), Collecteur de trophées (lv3, 500 XP),
  Exterminateur (lv4, 400 XP), Première forge (lv2, 120 XP).
This commit is contained in:
2026-03-24 18:08:49 +01:00
parent 60d10a5423
commit 95fcf325dc
2 changed files with 29 additions and 7 deletions

View File

@@ -32,22 +32,27 @@ export class QuestService {
const character = await this.characterRepo.findOne({ where: { id: characterId } });
if (!character) throw new BadRequestException('Aucun personnage');
// All quests the player hasn't completed (or repeatable)
const completed = await this.playerQuestRepo.find({
where: { characterId, status: 'claimed' },
select: ['questId'],
// All player quests (any status)
const playerQuests = await this.playerQuestRepo.find({
where: { characterId },
select: ['questId', 'status'],
});
const completedIds = new Set(completed.map((pq) => pq.questId));
const questStatusMap = new Map(playerQuests.map((pq) => [pq.questId, pq.status]));
const quests = await this.questRepo.find({
where: { minLevel: undefined }, // load all, filter in code
relations: ['arc'],
order: { arcOrder: 'ASC' },
});
return quests.filter((q) => {
if (q.minLevel > character.level) return false;
if (completedIds.has(q.id) && !q.repeatable) return false;
const status = questStatusMap.get(q.id);
// Already active or completed (waiting claim) → not available
if (status === 'active' || status === 'completed') return false;
// Already claimed and not repeatable → not available
if (status === 'claimed' && !q.repeatable) return false;
return true;
});
}