RelationsService.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import { Inject, Service } from '@tsed/di';
  2. import axios from 'axios';
  3. import { addHours } from 'date-fns';
  4. import { Relation } from '~/entities/relation';
  5. import { RelationRepository } from '~/repositories/relation';
  6. import { RelationMock } from '~/entities/relation-mock';
  7. import { RelationMockRepository } from '~/repositories/relation-mock';
  8. import loggerFactory from '~/utils/logger';
  9. const logger = loggerFactory('slackbot-proxy:services:RelationsService');
  10. @Service()
  11. export class RelationsService {
  12. @Inject()
  13. relationRepository: RelationRepository;
  14. @Inject()
  15. relationMockRepository: RelationMockRepository;
  16. // MOCK DATA DELETE THIS METHOD GW-6972
  17. async getMockFromRelation(relation: Relation): Promise<RelationMock|null> {
  18. const tokenGtoP = relation.tokenGtoP;
  19. const relationMock = await this.relationMockRepository.findOne({ where: [{ tokenGtoP }] });
  20. return relationMock || null;
  21. }
  22. async getSupportedGrowiCommands(relation:Relation):Promise<any> {
  23. // generate API URL
  24. const url = new URL('/_api/v3/slack-integration/supported-commands', relation.growiUri);
  25. return axios.get(url.toString(), {
  26. headers: {
  27. 'x-growi-ptog-tokens': relation.tokenPtoG,
  28. },
  29. });
  30. }
  31. async syncSupportedGrowiCommands(relation:Relation): Promise<RelationMock> {
  32. const res = await this.getSupportedGrowiCommands(relation);
  33. // const { supportedCommandsForBroadcastUse, supportedCommandsForSingleUse } = res.data;
  34. // relation.supportedCommandsForBroadcastUse = supportedCommandsForBroadcastUse;
  35. // relation.supportedCommandsForSingleUse = supportedCommandsForSingleUse;
  36. // relation.expiredAtCommands = addHours(new Date(), 48);
  37. // return this.relationRepository.save(relation);
  38. // MOCK DATA MODIFY THIS GW-6972 ---------------
  39. /**
  40. * this code represents the update of cache (Relation schema) using request from GROWI
  41. */
  42. const relationMock = await this.getMockFromRelation(relation);
  43. const { supportedCommandsForBroadcastUse, supportedCommandsForSingleUse, permittedChannelsForEachCommand } = res.data;
  44. if (relationMock !== null) {
  45. relationMock.supportedCommandsForBroadcastUse = supportedCommandsForBroadcastUse;
  46. relationMock.supportedCommandsForSingleUse = supportedCommandsForSingleUse;
  47. relationMock.permittedChannelsForEachCommand = permittedChannelsForEachCommand;
  48. relationMock.expiredAtCommands = addHours(new Date(), 48);
  49. // NOT MOCK DATA MODIFY THIS ORIGINAL OPERATION GW-6972
  50. relation.supportedCommandsForBroadcastUse = supportedCommandsForBroadcastUse;
  51. relation.supportedCommandsForSingleUse = supportedCommandsForSingleUse;
  52. relation.expiredAtCommands = addHours(new Date(), 48);
  53. this.relationRepository.save(relation);
  54. return this.relationMockRepository.save(relationMock);
  55. }
  56. throw Error('No relation mock exists.');
  57. // MOCK DATA MODIFY THIS GW-6972 ---------------
  58. }
  59. // MODIFY THIS METHOD USING ORIGINAL RELATION MODEL GW-6972
  60. async syncRelation(relation:Relation, baseDate:Date):Promise<RelationMock|null> {
  61. const relationMock = await this.getMockFromRelation(relation);
  62. if (relationMock == null) return null;
  63. const distanceMillisecondsToExpiredAt = relationMock.getDistanceInMillisecondsToExpiredAt(baseDate);
  64. if (distanceMillisecondsToExpiredAt < 0) {
  65. try {
  66. return await this.syncSupportedGrowiCommands(relationMock);
  67. }
  68. catch (err) {
  69. logger.error(err);
  70. return null;
  71. }
  72. }
  73. // 24 hours
  74. if (distanceMillisecondsToExpiredAt < 24 * 60 * 60 * 1000) {
  75. try {
  76. this.syncSupportedGrowiCommands(relationMock);
  77. }
  78. catch (err) {
  79. logger.error(err);
  80. }
  81. }
  82. return relationMock;
  83. }
  84. async isSupportedGrowiCommandForSingleUse(relation:Relation, growiCommandType:string, baseDate:Date):Promise<boolean> {
  85. const syncedRelation = await this.syncRelation(relation, baseDate);
  86. if (syncedRelation == null) {
  87. return false;
  88. }
  89. return relation.supportedCommandsForSingleUse.includes(growiCommandType);
  90. }
  91. async isSupportedGrowiCommandForBroadcastUse(relation:Relation, growiCommandType:string, baseDate:Date):Promise<boolean> {
  92. const syncedRelation = await this.syncRelation(relation, baseDate);
  93. if (syncedRelation == null) {
  94. return false;
  95. }
  96. return relation.supportedCommandsForBroadcastUse.includes(growiCommandType);
  97. }
  98. }