update-post.ts 3.5 KB

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