import { singleton } from 'decorators/singleton' import logger from 'logger/logger' import { GoogleInApp } from 'modules/GoogleInApp' import * as schedule from 'node-schedule' import { RedisClient } from 'redis/RedisClient' import { GooglePaySvr } from 'service/googlepay.svr' /** * 定时查询 google voided purchase * * * * * * * ┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ │ │ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun) │ │ │ │ └───── month (1 - 12) │ │ │ └────────── day of month (1 - 31) │ │ └─────────────── hour (0 - 23) │ └──────────────────── minute (0 - 59) └───────────────────────── second (0 - 59, OPTIONAL) */ @singleton export default class GooglePurchaseSchedule { async parseAllRecord() { const timeKey = 'google_inapp_voided_check_time' let timeStr = await new RedisClient().get(timeKey) let startTime = timeStr ? parseInt(timeStr) : Date.now() - 24 * 60 * 60 * 1000 let endTime = Date.now() try { let res = await new GooglePaySvr().queryVoidedPurchases(startTime, endTime) if (res.status !== 200) { logger.info('error check google voided purchase', res.status, res.statusText) return } const { data } = res await GoogleInApp.parseVoidedRecords(data.voidedPurchases) await new RedisClient().set(timeKey, endTime + '') logger.info(`success check google voided purchase:: voidedPurchases: ${data.voidedPurchases?.length || 0}`) } catch (err) { logger.info('error check google voided purchase', err.message || err) } } scheduleAll() { const job = schedule.scheduleJob('1 * * * *', async () => { await this.parseAllRecord() }) this.parseAllRecord() } }