update-post.ts 3.5 KB

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