import mongoose from 'mongoose' import * as dotenv from 'dotenv' const envFile = process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? `.env.production` : '.env.development' dotenv.config({ path: envFile }) console.log(process.env.DB_MAIN) import { InGameScoreRecord } from 'models/InGameScoreRecord' import { InGameTaskRecord } from 'models/InGameTaskRecord' import { InGameStats } from 'models/InGameStats' import { NftClaimRecord } from 'models/NftClaimRecord' import { DeleteRecord } from 'models/DeleteRecord' ;(async () => { try { let taskRecords = await InGameTaskRecord.find({ ticket: { $gt: 0 } }) let scoreRecords = await InGameScoreRecord.find({ type: 'draw_ingame' }) let claimRecords = await NftClaimRecord.find({}) let taskMap = new Map() let scoreMap = new Map() for (let record of taskRecords) { if (!taskMap.has(record.user)) { taskMap.set(record.user, 0) } taskMap.set(record.user, taskMap.get(record.user) + record.ticket) } for (let record of claimRecords) { if (!taskMap.has(record.user)) { taskMap.set(record.user, 0) } taskMap.set(record.user, taskMap.get(record.user) + 1) } for (let record of scoreRecords) { if (!scoreMap.has(record.user)) { scoreMap.set(record.user, []) } scoreMap.get(record.user).push(record.score) } for (let [user, records] of scoreMap) { if (!taskMap.has(user)) { console.log('User', user, 'has no task record') for (let record of records) { let dRecord = new DeleteRecord({ type: 'ingame_draw', data: record, }) await dRecord.save() await InGameScoreRecord.deleteOne({ _id: record.id }) } await InGameStats.findOneAndUpdate( { user: user }, { score: 0 }, { new: false, upsert: false, includeResultMetadata: true, }, ) console.log(`fix user data: ${user}`) } else if (taskMap.get(user) < records.length) { console.log('User', user, 'has less task record than score record') } } console.log('Finished repair ingame data in the database') } catch (e) { console.log(e) } process.exit(0) })()