update-post.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /* eslint-disable @typescript-eslint/no-explicit-any */
  2. import { getOrCreateModel } from '@growi/core';
  3. import {
  4. Types, Schema, Model, Document,
  5. } from 'mongoose';
  6. export interface IUpdatePost {
  7. pathPattern: string
  8. patternPrefix: string
  9. patternPrefix2: string
  10. channel: string
  11. provider: string
  12. creator: Schema.Types.ObjectId
  13. createdAt: Date
  14. }
  15. export interface UpdatePostDocument extends IUpdatePost, Document {}
  16. export interface UpdatePostModel extends Model<UpdatePostDocument> {
  17. normalizeChannelName(channel): any
  18. createPrefixesByPathPattern(pathPattern): any
  19. getRegExpByPattern(pattern): any
  20. findSettingsByPath(path): Promise<UpdatePostDocument[]>
  21. findAll(offset?: number): Promise<UpdatePostDocument[]>
  22. createUpdatePost(pathPattern: string, channel: string, creator: Types.ObjectId): Promise<UpdatePostDocument>
  23. }
  24. /**
  25. * This is the setting for notify to 3rd party tool (like Slack).
  26. */
  27. const updatePostSchema = new Schema<UpdatePostDocument, UpdatePostModel>({
  28. pathPattern: { type: String, required: true },
  29. patternPrefix: { type: String, required: true },
  30. patternPrefix2: { type: String, required: true },
  31. channel: { type: String, required: true },
  32. provider: { type: String, required: true },
  33. creator: { type: Schema.Types.ObjectId, ref: 'User', index: true },
  34. }, {
  35. timestamps: true,
  36. });
  37. updatePostSchema.statics.normalizeChannelName = function(channel) {
  38. return channel.replace(/(#|,)/g, '');
  39. };
  40. updatePostSchema.statics.createPrefixesByPathPattern = function(pathPattern) {
  41. const patternPrefix = ['*', '*'];
  42. // not begin with slash
  43. if (!pathPattern.match(/^\/.+/)) {
  44. return patternPrefix;
  45. }
  46. const pattern = pathPattern.split('/');
  47. pattern.shift();
  48. if (pattern[0] && pattern[0] !== '*') {
  49. patternPrefix[0] = pattern[0];
  50. }
  51. if (pattern[1] && pattern[1] !== '*') {
  52. patternPrefix[1] = pattern[1];
  53. }
  54. return patternPrefix;
  55. };
  56. updatePostSchema.statics.getRegExpByPattern = function(pattern) {
  57. let reg = pattern;
  58. if (!reg.match(/^\/.*/)) {
  59. reg = `/*${reg}*`;
  60. }
  61. reg = `^${reg}`;
  62. reg = reg.replace(/\//g, '\\/');
  63. reg = reg.replace(/(\*)/g, '.*');
  64. return new RegExp(reg);
  65. };
  66. updatePostSchema.statics.findSettingsByPath = async function(path) {
  67. const prefixes = this.createPrefixesByPathPattern(path);
  68. const settings = await this.find({
  69. $or: [
  70. { patternPrefix: prefixes[0], patternPrefix2: prefixes[1] },
  71. { patternPrefix: '*', patternPrefix2: '*' },
  72. { patternPrefix: prefixes[0], patternPrefix2: '*' },
  73. { patternPrefix: '*', patternPrefix2: prefixes[1] },
  74. ],
  75. });
  76. if (settings.length <= 0) {
  77. return settings;
  78. }
  79. const validSettings = settings.filter((setting) => {
  80. const patternRegex = this.getRegExpByPattern(setting.pathPattern);
  81. return patternRegex.test(path);
  82. });
  83. return validSettings;
  84. };
  85. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  86. updatePostSchema.statics.findAll = function(offset = 0) {
  87. return this.find().sort({ createdAt: 1 }).populate('creator').exec();
  88. };
  89. updatePostSchema.statics.createUpdatePost = async function(pathPattern, channel, creator) {
  90. const provider = 'slack'; // now slack only
  91. const prefixes = this.createPrefixesByPathPattern(pathPattern);
  92. return this.create({
  93. pathPattern,
  94. patternPrefix: prefixes[0],
  95. patternPrefix2: prefixes[1],
  96. channel: this.normalizeChannelName(channel),
  97. provider,
  98. creator,
  99. });
  100. };
  101. export default getOrCreateModel<UpdatePostDocument, UpdatePostModel>('UpdatePost', updatePostSchema);