slack-app-integration-mock.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. const crypto = require('crypto');
  2. const mongoose = require('mongoose');
  3. const permittedChannelsForEachCommandSchema = new mongoose.Schema({
  4. channelsObject: {},
  5. });
  6. const schema = new mongoose.Schema({
  7. tokenGtoP: { type: String, required: true, unique: true },
  8. tokenPtoG: { type: String, required: true, unique: true },
  9. supportedCommandsForBroadcastUse: { type: [String], default: [] },
  10. supportedCommandsForSingleUse: { type: [String], default: [] },
  11. permittedChannelsForEachCommand: permittedChannelsForEachCommandSchema,
  12. });
  13. class SlackAppIntegrationMock {
  14. static generateAccessTokens() {
  15. const now = new Date().getTime();
  16. const hasher1 = crypto.createHash('sha512');
  17. const hasher2 = crypto.createHash('sha512');
  18. const tokenGtoP = hasher1.update(`gtop${now.toString()}${process.env.SALT_FOR_GTOP_TOKEN}`).digest('base64');
  19. const tokenPtoG = hasher2.update(`ptog${now.toString()}${process.env.SALT_FOR_PTOG_TOKEN}`).digest('base64');
  20. return [tokenGtoP, tokenPtoG];
  21. }
  22. static async generateUniqueAccessTokens() {
  23. let duplicateTokens;
  24. let tokenGtoP;
  25. let tokenPtoG;
  26. let generateTokens;
  27. do {
  28. generateTokens = this.generateAccessTokens();
  29. tokenGtoP = generateTokens[0];
  30. tokenPtoG = generateTokens[1];
  31. // eslint-disable-next-line no-await-in-loop
  32. duplicateTokens = await this.findOne({ $or: [{ tokenGtoP }, { tokenPtoG }] });
  33. } while (duplicateTokens != null);
  34. return { tokenGtoP, tokenPtoG };
  35. }
  36. }
  37. module.exports = function(crowi) {
  38. SlackAppIntegrationMock.crowi = crowi;
  39. schema.loadClass(SlackAppIntegrationMock);
  40. return mongoose.model('SlackAppIntegrationMock', schema);
  41. };