Files
yourpart3/backend/services/minigamesService.js

54 lines
2.0 KiB
JavaScript

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();