import BaseService from './BaseService.js'; import models from '../models/index.js'; import { Op } from 'sequelize'; const { MinigameCampaign, MinigameCampaignLevel, MinigameUserProgress, User } = models; class MinigamesService extends BaseService { async listCampaigns() { const campaigns = await MinigameCampaign.findAll({ order: [['id', 'ASC']] }); return campaigns; } async getCampaign(code) { const campaign = await MinigameCampaign.findOne({ where: { code }, include: [{ model: MinigameCampaignLevel, as: 'levels', order: [['index', 'ASC']] }] }); if (!campaign) throw new Error('campaign_not_found'); return campaign; } async getProgress(hashedUserId, code) { const user = await this.getUserByHashedId(hashedUserId); if (!user) throw new Error('user_not_found'); const campaign = await MinigameCampaign.findOne({ where: { code } }); if (!campaign) throw new Error('campaign_not_found'); const progress = await MinigameUserProgress.findOne({ where: { userId: user.id, campaignId: campaign.id } }); if (!progress) { return { levelIndex: 1, stars: 0, bestScore: 0 }; } return progress; } async saveProgress(hashedUserId, code, payload) { const user = await this.getUserByHashedId(hashedUserId); if (!user) throw new Error('user_not_found'); const campaign = await MinigameCampaign.findOne({ where: { code } }); if (!campaign) throw new Error('campaign_not_found'); const { levelIndex, stars, bestScore } = payload; const [progress, created] = await MinigameUserProgress.findOrCreate({ where: { userId: user.id, campaignId: campaign.id }, defaults: { levelIndex, stars, bestScore } }); if (!created) { await progress.update({ levelIndex: Math.max(progress.levelIndex, levelIndex), stars: Math.max(progress.stars, stars), bestScore: Math.max(progress.bestScore, bestScore), }); } return { success: true }; } } export default new MinigamesService();