54 lines
2.0 KiB
JavaScript
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();
|