diff --git a/src/quest/quest.module.ts b/src/quest/quest.module.ts index fab346f8..29161e0a 100644 --- a/src/quest/quest.module.ts +++ b/src/quest/quest.module.ts @@ -24,6 +24,6 @@ import { SubscribersModule } from '../subscribers/subscribers.module'; ], providers: [QuestService, QuestGraphql], controllers: [QuestController], - exports: [], + exports: [QuestGraphql], }) export class QuestModule {} diff --git a/src/quest/quest.service.ts b/src/quest/quest.service.ts index 175b412e..dceb9c9b 100644 --- a/src/quest/quest.service.ts +++ b/src/quest/quest.service.ts @@ -160,7 +160,7 @@ export class QuestService { unlock.push(after < now); } - if (condition.after) { + if (condition.before) { const before = new Date(condition.before); unlock.push(now < before); } diff --git a/src/repeat-quests/repeat-quests.graphql.ts b/src/repeat-quests/repeat-quests.graphql.ts index 152deaac..813b71ca 100644 --- a/src/repeat-quests/repeat-quests.graphql.ts +++ b/src/repeat-quests/repeat-quests.graphql.ts @@ -10,6 +10,25 @@ export class RepeatQuestsGraphql { private graphqlSvc: GraphqlService ) {} + async getRepeatableQuests() { + const result = await this.graphqlSvc.query( + this.configSvc.get('graphql.endpoint'), + '', + `query repeatable_quests { + quests(where: {type: {_in: ["Daily"]}, status: {_eq: "Published"}}) { + id + condition + status + } + } + `, + 'repeatable_quests', + {} + ); + + return result.data.quests; + } + async queryRepeatQuest(variables: any) { const result = await this.graphqlSvc.query( this.configSvc.get('graphql.endpoint'), @@ -27,4 +46,25 @@ export class RepeatQuestsGraphql { return result.data.repeat_quests[0]; } + + insertRepeatQuests(variables: any) { + const headers = { + 'x-hasura-admin-secret': this.configSvc.get( + 'graphql.adminSecret' + ), + }; + + return this.graphqlSvc.query( + this.configSvc.get('graphql.endpoint'), + '', + `mutation insert_repeat_quests($objects: [repeat_quests_insert_input!] = {quest_id: 10}) { + insert_repeat_quests(objects: $objects) { + affected_rows + } + }`, + 'insert_repeat_quests', + variables, + headers + ); + } } diff --git a/src/repeat-quests/repeat-quests.module.ts b/src/repeat-quests/repeat-quests.module.ts index 1d043a47..03e8d896 100644 --- a/src/repeat-quests/repeat-quests.module.ts +++ b/src/repeat-quests/repeat-quests.module.ts @@ -2,10 +2,11 @@ import { Module } from '@nestjs/common'; import { GraphqlModule } from '../graphql/graphql.module'; import { RepeatQuestsGraphql } from './repeat-quests.graphql'; +import { RepeatQuestTaskService } from './repeat-quests.task'; @Module({ imports: [GraphqlModule], - providers: [RepeatQuestsGraphql], + providers: [RepeatQuestsGraphql, RepeatQuestTaskService], exports: [RepeatQuestsGraphql], }) export class RepeatQuestModule {} diff --git a/src/repeat-quests/repeat-quests.task.ts b/src/repeat-quests/repeat-quests.task.ts new file mode 100644 index 00000000..0867d18a --- /dev/null +++ b/src/repeat-quests/repeat-quests.task.ts @@ -0,0 +1,54 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { Cron, CronExpression } from '@nestjs/schedule'; +import { RepeatQuestsGraphql } from './repeat-quests.graphql'; + +@Injectable() +export class RepeatQuestTaskService { + private readonly logger = new Logger(RepeatQuestTaskService.name); + constructor(private repeatQuestsGraphql: RepeatQuestsGraphql) {} + + @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT) + async createRepeatQuests() { + // get all repeatable quest + const quests = await this.repeatQuestsGraphql.getRepeatableQuests(); + const insertObjects = []; + quests.forEach((quest) => { + if (this.inDurationCondition(quest.condition)) { + // create repeat quest + insertObjects.push({ + quest_id: quest.id, + }); + } + + if (quest.condition.level) { + insertObjects.push({ + quest_id: quest.id, + }); + } + }); + + const result = await this.repeatQuestsGraphql.insertRepeatQuests({ + objects: insertObjects, + }); + + this.logger.debug('Insert repeat quests result:'); + this.logger.debug(JSON.stringify(result)); + } + + inDurationCondition(condition: any) { + const inDuration = []; + + const now = new Date(); + if (condition.after) { + const after = new Date(condition.after); + inDuration.push(after < now); + } + + if (condition.before) { + const before = new Date(condition.before); + inDuration.push(now < before); + } + + return inDuration.includes(false) || inDuration.length === 0 ? false : true; + } +}