|
|
@@ -1,15 +1,80 @@
|
|
|
-import { Service } from '@tsed/di';
|
|
|
+import { Inject, Service } from '@tsed/di';
|
|
|
+import axios from 'axios';
|
|
|
+import { addHours } from 'date-fns';
|
|
|
+
|
|
|
import { Relation } from '~/entities/relation';
|
|
|
+import { RelationRepository } from '~/repositories/relation';
|
|
|
+
|
|
|
+import loggerFactory from '~/utils/logger';
|
|
|
+
|
|
|
+const logger = loggerFactory('slackbot-proxy:services:RelationsService');
|
|
|
|
|
|
@Service()
|
|
|
export class RelationsService {
|
|
|
|
|
|
- isSupportedGrowiCommandForSingleUse(relation:Relation, growiCommandType:string):boolean {
|
|
|
- return !relation.isExpiredCommands() && relation.supportedCommandsForSingleUse.includes(growiCommandType);
|
|
|
+ @Inject()
|
|
|
+ relationRepository: RelationRepository;
|
|
|
+
|
|
|
+ async getSupportedGrowiCommands(relation:Relation):Promise<any> {
|
|
|
+ // generate API URL
|
|
|
+ const url = new URL('/_api/v3/slack-integration/supported-commands', relation.growiUri);
|
|
|
+ return axios.get(url.toString(), {
|
|
|
+ headers: {
|
|
|
+ 'x-growi-ptog-tokens': relation.tokenPtoG,
|
|
|
+ },
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ async syncSupportedGrowiCommands(relation:Relation): Promise<Relation> {
|
|
|
+ const res = await this.getSupportedGrowiCommands(relation);
|
|
|
+ const { supportedCommandsForBroadcastUse, supportedCommandsForSingleUse } = res.data;
|
|
|
+ relation.supportedCommandsForBroadcastUse = supportedCommandsForBroadcastUse;
|
|
|
+ relation.supportedCommandsForSingleUse = supportedCommandsForSingleUse;
|
|
|
+ relation.expiredAtCommands = addHours(new Date(), 48);
|
|
|
+
|
|
|
+ return this.relationRepository.save(relation);
|
|
|
+ }
|
|
|
+
|
|
|
+ async syncRelation(relation:Relation, baseDate:Date):Promise<Relation|null> {
|
|
|
+ const distanceMillisecondsToExpiredAt = relation.getDistanceInMillisecondsToExpiredAt(baseDate);
|
|
|
+
|
|
|
+ if (distanceMillisecondsToExpiredAt < 0) {
|
|
|
+ try {
|
|
|
+ return await this.syncSupportedGrowiCommands(relation);
|
|
|
+ }
|
|
|
+ catch (err) {
|
|
|
+ logger.error(err);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 24 hours
|
|
|
+ if (distanceMillisecondsToExpiredAt < 1000 * 60 * 60 * 24) {
|
|
|
+ try {
|
|
|
+ this.syncSupportedGrowiCommands(relation);
|
|
|
+ }
|
|
|
+ catch (err) {
|
|
|
+ logger.error(err);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return relation;
|
|
|
+ }
|
|
|
+
|
|
|
+ async isSupportedGrowiCommandForSingleUse(relation:Relation, growiCommandType:string, baseDate:Date):Promise<boolean> {
|
|
|
+ const syncedRelation = await this.syncRelation(relation, baseDate);
|
|
|
+ if (syncedRelation == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return relation.supportedCommandsForSingleUse.includes(growiCommandType);
|
|
|
}
|
|
|
|
|
|
- isSupportedGrowiCommandForBroadcastUse(relation:Relation, growiCommandType:string):boolean {
|
|
|
- return !relation.isExpiredCommands() && relation.supportedCommandsForBroadcastUse.includes(growiCommandType);
|
|
|
+ async isSupportedGrowiCommandForBroadcastUse(relation:Relation, growiCommandType:string, baseDate:Date):Promise<boolean> {
|
|
|
+ const syncedRelation = await this.syncRelation(relation, baseDate);
|
|
|
+ if (syncedRelation == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return relation.supportedCommandsForBroadcastUse.includes(growiCommandType);
|
|
|
}
|
|
|
|
|
|
}
|