@positivegrid/pg-mongoose-schema 28.0.0-beta.1 → 28.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/index.cjs +5220 -0
  2. package/dist/index.d.cts +6 -0
  3. package/dist/index.d.mts +1294 -0
  4. package/dist/index.mjs +5190 -0
  5. package/package.json +58 -36
  6. package/dist/index.d.ts +0 -5
  7. package/dist/index.js +0 -34
  8. package/dist/index.js.map +0 -1
  9. package/dist/models/banks.d.ts +0 -3
  10. package/dist/models/banks.js +0 -33
  11. package/dist/models/banks.js.map +0 -1
  12. package/dist/models/device.d.ts +0 -3
  13. package/dist/models/device.js +0 -48
  14. package/dist/models/device.js.map +0 -1
  15. package/dist/models/featuredList.d.ts +0 -3
  16. package/dist/models/featuredList.js +0 -70
  17. package/dist/models/featuredList.js.map +0 -1
  18. package/dist/models/hardware.d.ts +0 -3
  19. package/dist/models/hardware.js +0 -213
  20. package/dist/models/hardware.js.map +0 -1
  21. package/dist/models/homeConfig.d.ts +0 -3
  22. package/dist/models/homeConfig.js +0 -38
  23. package/dist/models/homeConfig.js.map +0 -1
  24. package/dist/models/oauth.d.ts +0 -3
  25. package/dist/models/oauth.js +0 -48
  26. package/dist/models/oauth.js.map +0 -1
  27. package/dist/models/partner.d.ts +0 -3
  28. package/dist/models/partner.js +0 -165
  29. package/dist/models/partner.js.map +0 -1
  30. package/dist/models/payment.d.ts +0 -3
  31. package/dist/models/payment.js +0 -859
  32. package/dist/models/payment.js.map +0 -1
  33. package/dist/models/pgConfig.d.ts +0 -3
  34. package/dist/models/pgConfig.js +0 -64
  35. package/dist/models/pgConfig.js.map +0 -1
  36. package/dist/models/preset.d.ts +0 -3
  37. package/dist/models/preset.js +0 -802
  38. package/dist/models/preset.js.map +0 -1
  39. package/dist/models/promotion.d.ts +0 -3
  40. package/dist/models/promotion.js +0 -585
  41. package/dist/models/promotion.js.map +0 -1
  42. package/dist/models/redeem.d.ts +0 -3
  43. package/dist/models/redeem.js +0 -26
  44. package/dist/models/redeem.js.map +0 -1
  45. package/dist/models/toneTheme.d.ts +0 -3
  46. package/dist/models/toneTheme.js +0 -29
  47. package/dist/models/toneTheme.js.map +0 -1
  48. package/dist/models/toneThemeFeaturedList.d.ts +0 -3
  49. package/dist/models/toneThemeFeaturedList.js +0 -18
  50. package/dist/models/toneThemeFeaturedList.js.map +0 -1
  51. package/dist/models/user.d.ts +0 -3
  52. package/dist/models/user.js +0 -565
  53. package/dist/models/user.js.map +0 -1
  54. package/dist/models/userTrack.d.ts +0 -3
  55. package/dist/models/userTrack.js +0 -82
  56. package/dist/models/userTrack.js.map +0 -1
  57. package/dist/types/banks.types.d.ts +0 -25
  58. package/dist/types/banks.types.js +0 -3
  59. package/dist/types/banks.types.js.map +0 -1
  60. package/dist/types/device.types.d.ts +0 -41
  61. package/dist/types/device.types.js +0 -3
  62. package/dist/types/device.types.js.map +0 -1
  63. package/dist/types/featuredList.types.d.ts +0 -32
  64. package/dist/types/featuredList.types.js +0 -3
  65. package/dist/types/featuredList.types.js.map +0 -1
  66. package/dist/types/hardware.types.d.ts +0 -123
  67. package/dist/types/hardware.types.js +0 -3
  68. package/dist/types/hardware.types.js.map +0 -1
  69. package/dist/types/homeConfig.types.d.ts +0 -24
  70. package/dist/types/homeConfig.types.js +0 -3
  71. package/dist/types/homeConfig.types.js.map +0 -1
  72. package/dist/types/index.d.ts +0 -17
  73. package/dist/types/index.js +0 -34
  74. package/dist/types/index.js.map +0 -1
  75. package/dist/types/oauth.types.d.ts +0 -38
  76. package/dist/types/oauth.types.js +0 -3
  77. package/dist/types/oauth.types.js.map +0 -1
  78. package/dist/types/partner.types.d.ts +0 -91
  79. package/dist/types/partner.types.js +0 -3
  80. package/dist/types/partner.types.js.map +0 -1
  81. package/dist/types/payment.types.d.ts +0 -304
  82. package/dist/types/payment.types.js +0 -3
  83. package/dist/types/payment.types.js.map +0 -1
  84. package/dist/types/pgConfig.types.d.ts +0 -35
  85. package/dist/types/pgConfig.types.js +0 -3
  86. package/dist/types/pgConfig.types.js.map +0 -1
  87. package/dist/types/preset.types.d.ts +0 -110
  88. package/dist/types/preset.types.js +0 -3
  89. package/dist/types/preset.types.js.map +0 -1
  90. package/dist/types/promotion.types.d.ts +0 -282
  91. package/dist/types/promotion.types.js +0 -3
  92. package/dist/types/promotion.types.js.map +0 -1
  93. package/dist/types/redeem.types.d.ts +0 -16
  94. package/dist/types/redeem.types.js +0 -3
  95. package/dist/types/redeem.types.js.map +0 -1
  96. package/dist/types/toneTheme.types.d.ts +0 -16
  97. package/dist/types/toneTheme.types.js +0 -3
  98. package/dist/types/toneTheme.types.js.map +0 -1
  99. package/dist/types/toneThemeFeaturedList.types.d.ts +0 -9
  100. package/dist/types/toneThemeFeaturedList.types.js +0 -3
  101. package/dist/types/toneThemeFeaturedList.types.js.map +0 -1
  102. package/dist/types/user.types.d.ts +0 -166
  103. package/dist/types/user.types.js +0 -6
  104. package/dist/types/user.types.js.map +0 -1
  105. package/dist/types/userTrack.types.d.ts +0 -39
  106. package/dist/types/userTrack.types.js +0 -12
  107. package/dist/types/userTrack.types.js.map +0 -1
@@ -1,802 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.default = default_1;
7
- const debug_1 = __importDefault(require("debug"));
8
- const debug = (0, debug_1.default)("model:preset");
9
- /**
10
- * Internal method - _parsePresetForm
11
- * All query should gothrough this handler before search for compatible issue
12
- */
13
- function _queryCompatibilityHandler(query) {
14
- let formatQuery = {};
15
- if ("preset_for" in query && query["preset_for"] === "amp2") {
16
- formatQuery = { ...query, preset_for: { $in: ["amp2", "bias"] } };
17
- }
18
- else if (!("preset_for" in query) || query["preset_for"] === "") {
19
- formatQuery = { ...query, preset_for: "jamup" };
20
- }
21
- if (Object.keys(formatQuery).length === 0) {
22
- formatQuery = { ...query };
23
- }
24
- debug("_queryCompatibilityHandler %o", formatQuery);
25
- return formatQuery;
26
- }
27
- // version_comparison follow the same format as mongodb query comparsion:
28
- // https://docs.mongodb.com/manual/reference/operator/query-comparison/
29
- // only support BIAS FX preset for now
30
- //
31
- // HardCode: useragent == iPad then only show preset_version <= 1.7
32
- function _handlePresetVersion(queryObj, req) {
33
- const supportVersionComparison = ["eq", "gt", "gte", "lt", "lte", "ne"];
34
- if (!("preset_for" in req.query) ||
35
- ("preset_for" in req.query && req.query["preset_for"] !== "live")) {
36
- return { ...queryObj };
37
- }
38
- else if ("preset_version" in req.query && "version_comparison" in req.query) {
39
- if (supportVersionComparison.includes(req.query["version_comparison"])) {
40
- const tmpVersionQuery = { ...queryObj };
41
- const versionQuery = _buildPresetVersionQuery(req.query["preset_version"], req.query["version_comparison"]);
42
- if (versionQuery) {
43
- return { ...tmpVersionQuery, ...versionQuery };
44
- }
45
- }
46
- }
47
- return { ...queryObj };
48
- }
49
- function _buildPresetVersionQuery(version, comparison) {
50
- const tmpAttrs = String(version).split(".");
51
- let major = 0;
52
- let minor = 0;
53
- if (tmpAttrs.length !== 2) {
54
- debug("ERROR:_buildPresetVersionQuery:Incorrect version %s", version);
55
- return false;
56
- }
57
- else {
58
- major = parseInt(tmpAttrs[0], 10);
59
- minor = parseInt(tmpAttrs[1], 10);
60
- }
61
- switch (comparison) {
62
- case "eq":
63
- return {
64
- $and: [{ "version.major": major }, { "version.minor": minor }],
65
- };
66
- case "gt":
67
- case "gte":
68
- case "lt":
69
- case "lte": {
70
- const compareOper = "$" + comparison;
71
- const minorQuery = {};
72
- minorQuery[compareOper] = minor;
73
- return {
74
- $and: [{ "version.major": major }, { "version.minor": minorQuery }],
75
- };
76
- }
77
- default:
78
- debug("ERROR:_buildPresetVersionQuery:Not support format %s %s", version, comparison);
79
- return false;
80
- }
81
- }
82
- function _buildSortQuery(orderParam) {
83
- let sortQuery = {};
84
- switch (orderParam) {
85
- case "popular":
86
- sortQuery = { num_likes: -1 };
87
- break;
88
- case "alphabet":
89
- sortQuery = { name: 1 };
90
- break;
91
- case "hot":
92
- sortQuery = { num_downloads: -1 };
93
- break;
94
- case "latest":
95
- default:
96
- sortQuery = { created_on: -1 };
97
- }
98
- return sortQuery;
99
- }
100
- /**
101
- * Filter presets with license_tier parameter, but need to consider backward compatibility.
102
- * e.g., license_tier == 'elite' then need to get elite/pro/std and all others presets
103
- * However, expansion need to be considered out of normal license tier,
104
- * so we use expansionData/allExpansion to controll it.
105
- */
106
- function _buildLicenseTierQuery(licenseTierParam) {
107
- const tmpLicenseTier = String(licenseTierParam).split(",");
108
- const tmpData = new Set();
109
- const expansionData = new Set();
110
- const allExpansion = new Set(["celestion", "classic"]);
111
- tmpLicenseTier.forEach((lic) => {
112
- switch (lic) {
113
- case "celestion":
114
- case "classic":
115
- expansionData.add(lic);
116
- allExpansion.delete(lic);
117
- break;
118
- case "elite":
119
- tmpData.add("elite");
120
- tmpData.add("pro");
121
- tmpData.add("std");
122
- tmpData.add(null);
123
- break;
124
- case "pro":
125
- tmpData.add("pro");
126
- tmpData.add("std");
127
- tmpData.add(null);
128
- break;
129
- case "std":
130
- tmpData.add("std");
131
- tmpData.add(null);
132
- break;
133
- case "lite":
134
- case "demo":
135
- tmpData.add(null);
136
- break;
137
- default:
138
- debug("ERROR:_buildLicenseTierQuery %s", licenseTierParam);
139
- }
140
- });
141
- const output = expansionData.size > 0
142
- ? {
143
- $and: [
144
- {
145
- license_tier: { $in: Array.from(tmpData) },
146
- },
147
- {
148
- license_tier: { $in: [...Array.from(tmpData), ...Array.from(expansionData)] },
149
- },
150
- {
151
- license_tier: { $nin: Array.from(allExpansion) },
152
- },
153
- ],
154
- }
155
- : {
156
- $and: [
157
- {
158
- license_tier: { $in: Array.from(tmpData) },
159
- },
160
- {
161
- license_tier: { $nin: Array.from(allExpansion) },
162
- },
163
- ],
164
- };
165
- debug("_buildLicenseTierQuery:%j", output);
166
- return output;
167
- }
168
- function default_1(mongoose) {
169
- const { Schema } = mongoose;
170
- const { ObjectId } = Schema.Types;
171
- const filterKeyword = (keyword) => {
172
- return String(keyword).replace(/[/\\@%&]+/g, "");
173
- };
174
- const parsePageParams = (data) => {
175
- debug("parsePageParams", data);
176
- let pageParams = {
177
- page_size: 12,
178
- page: 1,
179
- };
180
- if (data && "page_size" in data) {
181
- const pageSize = Array.isArray(data["page_size"])
182
- ? parseInt(data["page_size"].pop(), 10)
183
- : parseInt(data["page_size"], 10);
184
- if (pageSize >= 1) {
185
- pageParams = { ...pageParams, page_size: pageSize };
186
- }
187
- }
188
- if (data && "page" in data) {
189
- const page = Array.isArray(data["page"])
190
- ? parseInt(data["page"].pop(), 10)
191
- : parseInt(data["page"], 10);
192
- if (page > 1) {
193
- pageParams = { ...pageParams, page: page };
194
- }
195
- }
196
- debug("parsePageParams:output", pageParams);
197
- return pageParams;
198
- };
199
- const PresetSchema = new Schema({
200
- name: { type: String, index: true, required: true },
201
- creator_id: { type: ObjectId, ref: "User", required: true },
202
- preset_for: { type: String, required: true },
203
- status: { type: Number, default: 0, required: true }, // 0:alive, 1:delete, 2: offline, 3: special(limited), 4: processing (Spark: PVN)
204
- description: { type: String },
205
- tags: { type: [{ type: String }], default: () => null },
206
- is_featured: { type: Boolean, default: false },
207
- category: { type: String, index: true },
208
- active_effects: { type: String },
209
- preset_data: { type: String },
210
- preset_features: { type: Schema.Types.Mixed, default: null }, // match (1:enable, 2:disable)
211
- version: {
212
- major: { type: Number },
213
- minor: { type: Number },
214
- },
215
- preset_meta: { type: Schema.Types.Mixed },
216
- preset_scene: { type: Array }, // fx2
217
- license_tier: { type: [{ type: String }], index: true, default: () => null }, // amp2: std/pro/elite pack:celestion
218
- // only () => null can set empty array as null: https://github.com/Automattic/mongoose/issues/1335#issuecomment-321817528
219
- num_comments: { type: Number, default: 0 },
220
- num_downloads: { type: Number, default: 0 },
221
- num_likes: { type: Number, default: 0 },
222
- rating_sum: { type: Number, default: 0 },
223
- rating_avg: { type: Number, default: 0 },
224
- rating_count: { type: Number, default: 0 },
225
- image_url: { type: String },
226
- thumb_url: { type: String },
227
- signal_chain_type: {
228
- type: String,
229
- enum: ["in1", "in2"],
230
- },
231
- created_on: { type: Date, default: Date.now },
232
- updated_on: { type: Date, default: Date.now },
233
- }, { collection: "jamup_preset", toJSON: { virtuals: true }, toObject: { virtuals: true } });
234
- PresetSchema.index({
235
- name: 1,
236
- description: 1,
237
- category: 1,
238
- });
239
- PresetSchema.index({
240
- preset_for: 1,
241
- status: 1,
242
- });
243
- PresetSchema.index({
244
- preset_for: 1,
245
- signal_chain_type: 1,
246
- status: 1,
247
- });
248
- const PresetSongMappingSchema = new Schema({
249
- preset_id: { type: ObjectId, ref: "Preset", required: true },
250
- song_id: { type: String, required: true },
251
- created_on: { type: Date, default: Date.now },
252
- }, { collection: "preset_song_mapping" });
253
- PresetSongMappingSchema.index({
254
- song_id: 1,
255
- });
256
- PresetSongMappingSchema.index({
257
- preset_id: 1,
258
- song_id: 1,
259
- }, { unique: true });
260
- const PresetTagsMetaSchema = new Schema({
261
- name: { type: String, required: true },
262
- count: { type: Number, default: 0, required: true },
263
- preset_for: { type: String, required: true },
264
- created_on: { type: Date, default: Date.now },
265
- }, { collection: "preset_tags_meta" });
266
- PresetTagsMetaSchema.index({
267
- name: 1,
268
- preset_for: 1,
269
- }, { unique: true });
270
- PresetTagsMetaSchema.index({
271
- count: -1,
272
- });
273
- const PresetUserCommentSchema = new Schema({
274
- user_id: { type: ObjectId, ref: "User", required: true },
275
- preset_id: { type: ObjectId, ref: "Preset", required: true },
276
- comment_text: { type: String, required: true },
277
- preset_for: { type: String },
278
- status: { type: Number, default: 1, required: true }, // 1:Active 2:Delete
279
- date_comment: { type: Date, default: Date.now },
280
- }, { collection: "jamup_userpresetcomment" });
281
- const PresetUserLikeSchema = new Schema({
282
- user_id: { type: ObjectId, ref: "User", required: true },
283
- preset_id: { type: ObjectId, ref: "Preset", required: true },
284
- preset_for: { type: String },
285
- date_like: { type: Date, default: Date.now },
286
- }, { collection: "jamup_userpresetlike" });
287
- const FakePresetLikeSchema = new Schema({
288
- preset_id: { type: ObjectId, ref: "Preset", required: true },
289
- likes: { type: Number, default: 0 },
290
- }, { collection: "fake_userpresetlike" });
291
- const PresetUserDownloadSchema = new Schema({
292
- user_id: { type: ObjectId, ref: "User", required: true },
293
- preset_id: { type: ObjectId, ref: "Preset", required: true },
294
- preset_for: { type: String, required: true },
295
- date_download: { type: Date, default: Date.now },
296
- updated_on: { type: Date, default: Date.now },
297
- }, { collection: "jamup_userpresetdownload" });
298
- const PopularPresetListSchema = new Schema({
299
- preset_for: { type: String, required: true },
300
- popular_range: { type: String, required: true },
301
- popular_preset_list: [{ type: ObjectId, ref: "Preset", required: true }],
302
- created_on: { type: Date, default: Date.now, required: true },
303
- }, { collection: "jamup_popularpresetlist" });
304
- PresetSchema.static({
305
- async getPresetByUserId(userId) {
306
- return this.find({ creator_id: userId }).sort({ created_on: -1 }).exec();
307
- },
308
- async getPresetByQuery(req, opts = {}) {
309
- let pageParams;
310
- const shouldCondition = [];
311
- debug("getPresetByQuery:input:%j", req.query);
312
- if (!("keyword" in req.query) || typeof req.query.keyword !== "string") {
313
- throw new Error("missing the searching term");
314
- }
315
- pageParams = parsePageParams(req.query);
316
- let searchCondition = {
317
- preset_for: req.query.preset_for ? req.query.preset_for : "jamup",
318
- status: 0,
319
- };
320
- // Build license_tier query rule, default would be license_tier: null
321
- // The detail of the rule can jump to _buildLicenseTierQuery
322
- if ("license_tier" in req.query) {
323
- const tmpQuery = { ...searchCondition };
324
- searchCondition = { ...tmpQuery, ..._buildLicenseTierQuery(req.query["license_tier"]) };
325
- }
326
- if ("order" in req.query && req.query.order === "hot") {
327
- searchCondition = {
328
- ...searchCondition,
329
- created_on: { $gte: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) },
330
- };
331
- }
332
- searchCondition = _handlePresetVersion(searchCondition, req);
333
- shouldCondition.push({
334
- text: {
335
- path: "name",
336
- query: req.query.keyword,
337
- fuzzy: {
338
- maxEdits: 1,
339
- prefixLength: 1,
340
- maxExpansions: 30,
341
- },
342
- score: {
343
- boost: {
344
- value: 3,
345
- },
346
- },
347
- },
348
- }, {
349
- text: {
350
- path: ["description", "category"],
351
- query: req.query.keyword,
352
- fuzzy: {
353
- maxEdits: 2,
354
- prefixLength: 0,
355
- maxExpansions: 50,
356
- },
357
- },
358
- });
359
- debug("INFO:getPresetByQuery:%j:%j", searchCondition, shouldCondition);
360
- const aggregatePipeline = [
361
- {
362
- $search: {
363
- index: "default",
364
- compound: {
365
- should: shouldCondition,
366
- },
367
- },
368
- },
369
- {
370
- $match: searchCondition,
371
- },
372
- {
373
- $skip: (pageParams.page - 1) * pageParams.page_size,
374
- },
375
- {
376
- $limit: pageParams.page_size,
377
- },
378
- ];
379
- if (!("full" in opts)) {
380
- aggregatePipeline.push({
381
- $project: {
382
- preset_data: 0,
383
- },
384
- });
385
- }
386
- const result = await this.aggregate(aggregatePipeline);
387
- return result;
388
- },
389
- async getPresetsBySearch(req) {
390
- let pageParams;
391
- let searchCondition;
392
- let sortCondition = _buildSortQuery(req.query.order);
393
- let selectOps = {};
394
- debug("getPresetsBySearch:input", req.query);
395
- pageParams = parsePageParams(req.query);
396
- searchCondition = {
397
- preset_for: req.query["preset_for"] ? req.query["preset_for"] : "jamup",
398
- status: 0,
399
- };
400
- if (!("detail" in req.query) || req.query.detail !== "yes") {
401
- selectOps = { preset_data: 0 };
402
- }
403
- if ("pids" in req.query) {
404
- const pids = req.query.pids.split(",");
405
- searchCondition["_id"] = {
406
- $in: pids,
407
- };
408
- }
409
- if ("category" in req.query) {
410
- const categories = String(req.query["category"]).split(",");
411
- searchCondition["category"] = {
412
- $in: categories,
413
- };
414
- }
415
- else if ("except_cateogry" in req.query) {
416
- const exceptCategories = String(req.query["except_cateogry"]).split(",");
417
- searchCondition["category"] = {
418
- $nin: exceptCategories,
419
- };
420
- }
421
- if ("pedal_type" in req.query) {
422
- searchCondition["preset_meta.pedal_type"] = req.query["pedal_type"];
423
- }
424
- // featureKey1:Val1,featureKey2:Val2
425
- if ("preset_features" in req.query) {
426
- const params = req.query["preset_features"].split(",");
427
- const featureQuery = {};
428
- params.forEach((param) => {
429
- const tmpParams = param.split(":");
430
- if (tmpParams.length === 2) {
431
- featureQuery[tmpParams[0]] = parseInt(tmpParams[1], 10);
432
- }
433
- });
434
- searchCondition["preset_features"] = featureQuery;
435
- }
436
- // created_after/created_before - assign preset created_on date
437
- const createQuery = {};
438
- if ("create_after" in req.query) {
439
- const verifyDate = new Date(req.query["create_after"]);
440
- if (!isNaN(verifyDate.getTime())) {
441
- createQuery["$gte"] = verifyDate;
442
- }
443
- }
444
- if ("create_before" in req.query) {
445
- const verifyDate = new Date(req.query["create_before"]);
446
- if (!isNaN(verifyDate.getTime())) {
447
- createQuery["$lte"] = verifyDate;
448
- }
449
- }
450
- if (Object.keys(createQuery).length > 0) {
451
- searchCondition["created_on"] = createQuery;
452
- }
453
- // updated_after/updated_before - assign preset updated_on date
454
- const updateQuery = {};
455
- if ("update_after" in req.query) {
456
- const verifyDate = new Date(req.query["update_after"]);
457
- if (!isNaN(verifyDate.getTime())) {
458
- updateQuery["$gte"] = verifyDate;
459
- }
460
- }
461
- if ("update_before" in req.query) {
462
- const verifyDate = new Date(req.query["update_before"]);
463
- if (!isNaN(verifyDate.getTime())) {
464
- updateQuery["$lte"] = verifyDate;
465
- }
466
- }
467
- if (Object.keys(updateQuery).length > 0) {
468
- searchCondition["updated_on"] = updateQuery;
469
- }
470
- // Build license_tier query rule, default would be license_tier: null
471
- // The detail of the rule can jump to _buildLicenseTierQuery
472
- if ("license_tier" in req.query) {
473
- const tmpQuery = { ...searchCondition };
474
- searchCondition = { ...tmpQuery, ..._buildLicenseTierQuery(req.query["license_tier"]) };
475
- }
476
- if ("order" in req.query && req.query.order === "hot") {
477
- searchCondition = {
478
- ...searchCondition,
479
- created_on: { $gte: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) },
480
- };
481
- }
482
- // signal_chain_type query only works in Spark for now
483
- if (searchCondition.preset_for === "spark") {
484
- if ("signal_chain_type" in req.query) {
485
- searchCondition.signal_chain_type = req.query.signal_chain_type;
486
- }
487
- if ("no_dspid" in req.query) {
488
- searchCondition["preset_meta.dspId"] = { $nin: String(req.query.no_dspid).split(",") };
489
- }
490
- }
491
- searchCondition = _handlePresetVersion(searchCondition, req);
492
- debug("getPresetsBySearch:full_text %j %j", searchCondition, sortCondition);
493
- if ("keyword" in req.query && req.query.keyword) {
494
- let result;
495
- // China cannot use Atlas Search, so we need to keep it used the old solution before find an alternative on Aliyun
496
- if (globalThis.process?.env?.IS_CHINA !== undefined) {
497
- searchCondition["$or"] = [
498
- { name: new RegExp(`^${filterKeyword(req.query["keyword"])}`, "i") },
499
- { description: new RegExp(`${filterKeyword(req.query["keyword"])}`, "i") },
500
- ];
501
- result = await this.aggregate([
502
- {
503
- $match: _queryCompatibilityHandler(searchCondition),
504
- },
505
- {
506
- $sort: sortCondition,
507
- },
508
- {
509
- $project: selectOps,
510
- },
511
- {
512
- $skip: (pageParams.page - 1) * pageParams.page_size,
513
- },
514
- {
515
- $limit: pageParams.page_size,
516
- },
517
- {
518
- $addFields: {
519
- id: "$_id",
520
- },
521
- },
522
- ]);
523
- }
524
- else {
525
- result = await this.aggregate([
526
- {
527
- $search: {
528
- text: {
529
- path: ["name", "description"],
530
- query: req.query.keyword,
531
- },
532
- },
533
- },
534
- {
535
- $match: _queryCompatibilityHandler(searchCondition),
536
- },
537
- {
538
- $sort: sortCondition,
539
- },
540
- {
541
- $project: selectOps,
542
- },
543
- {
544
- $skip: (pageParams.page - 1) * pageParams.page_size,
545
- },
546
- {
547
- $limit: pageParams.page_size,
548
- },
549
- {
550
- $addFields: {
551
- id: "$_id",
552
- },
553
- },
554
- ]);
555
- }
556
- return result;
557
- }
558
- else {
559
- const result = await this.aggregate([
560
- {
561
- $match: _queryCompatibilityHandler(searchCondition),
562
- },
563
- {
564
- $sort: sortCondition,
565
- },
566
- {
567
- $project: selectOps,
568
- },
569
- {
570
- $skip: (pageParams.page - 1) * pageParams.page_size,
571
- },
572
- {
573
- $limit: pageParams.page_size,
574
- },
575
- {
576
- $addFields: {
577
- id: "$_id",
578
- },
579
- },
580
- ]);
581
- return result;
582
- }
583
- },
584
- async getPresetsList(query, sort, req) {
585
- const pageParams = parsePageParams(req.query);
586
- // only select preset status == 0
587
- if (typeof query === "object" && query !== null) {
588
- query["status"] = 0;
589
- }
590
- if ("preset_for" in query && query["preset_for"] !== "jamup") {
591
- query["image_url"] = { $ne: null };
592
- query["thumb_url"] = { $ne: null };
593
- }
594
- if ("license_tier" in req.query) {
595
- const tmpQuery = { ...query };
596
- query = { ...tmpQuery, ..._buildLicenseTierQuery(req.query["license_tier"]) };
597
- }
598
- if ("order" in req.query) {
599
- sort = _buildSortQuery(req.query.order);
600
- }
601
- query = _handlePresetVersion(query, req);
602
- debug("getPresetsList:%j", query);
603
- return this.find(_queryCompatibilityHandler(query))
604
- .sort(sort)
605
- .select("-preset_data")
606
- .skip((pageParams["page"] - 1) * pageParams["page_size"])
607
- .limit(pageParams["page_size"])
608
- .exec();
609
- },
610
- async getPresetsListPromise(query, sort, req) {
611
- return this.getPresetsList(query, sort, req);
612
- },
613
- async getMyPresets(query, sort, req) {
614
- const pageParams = parsePageParams(req.query);
615
- if (typeof query === "object" && query !== null) {
616
- query["status"] = { $in: [0, 2] };
617
- }
618
- if ("preset_for" in query && query["preset_for"] !== "jamup") {
619
- query["image_url"] = { $ne: null };
620
- query["thumb_url"] = { $ne: null };
621
- }
622
- query = _handlePresetVersion(query, req);
623
- debug("getMyPresets:%o", query);
624
- return this.find(_queryCompatibilityHandler(query))
625
- .sort(sort)
626
- .select("-preset_data")
627
- .skip((pageParams["page"] - 1) * pageParams["page_size"])
628
- .limit(pageParams["page_size"])
629
- .exec();
630
- },
631
- async getOnePresetByCondition(query, opts) {
632
- const defaultSort = "sort" in opts && typeof opts.sort === "object" ? opts.sort : { created_on: -1 };
633
- const defaultSelect = "select" in opts && typeof opts.select === "string" ? opts.select : "";
634
- return this.findOne(_queryCompatibilityHandler(query))
635
- .sort(defaultSort)
636
- .select(defaultSelect)
637
- .exec();
638
- },
639
- async getSinglePreset(id) {
640
- return this.findOne({ _id: id, status: 0 }).exec();
641
- },
642
- async getValidSinglePreset(id) {
643
- return this.findOne({ _id: id, status: { $in: [0, 2, 3] } }).exec();
644
- },
645
- });
646
- PresetUserCommentSchema.static({
647
- async getPresetComments(presetId, req) {
648
- try {
649
- const pageParams = parsePageParams(req.query);
650
- const ret = await this.aggregate([
651
- { $match: { preset_id: new mongoose.Types.ObjectId(presetId), status: 1 } },
652
- { $sort: { date_comment: -1 } },
653
- { $skip: (pageParams["page"] - 1) * pageParams["page_size"] },
654
- { $limit: pageParams["page_size"] },
655
- {
656
- $lookup: {
657
- from: "auth_user",
658
- localField: "user_id",
659
- foreignField: "_id",
660
- as: "tmpUser",
661
- },
662
- },
663
- {
664
- $lookup: {
665
- from: "jamup_userprofile",
666
- localField: "user_id",
667
- foreignField: "_id",
668
- as: "tmpProfile",
669
- },
670
- },
671
- { $unwind: "$tmpUser" },
672
- { $unwind: "$tmpProfile" },
673
- {
674
- $project: {
675
- preset_id: 1,
676
- comment_text: 1,
677
- date_comment: 1,
678
- user: {
679
- _id: "$tmpUser._id",
680
- email: "$tmpUser.email",
681
- date_joined: "$tmpUser.date_joined",
682
- full_name: "$tmpProfile.full_name",
683
- first_name: "$tmpProfile.first_name",
684
- last_name: "$tmpProfile.last_name",
685
- profile_image_url: "$tmpProfile.profile_image_url",
686
- profile_thumb_url: "$tmpProfile.profile_thumb_url",
687
- },
688
- },
689
- },
690
- ]).exec();
691
- return ret;
692
- }
693
- catch (err) {
694
- debug("ERR:getPresetComment:%o", err);
695
- throw err;
696
- }
697
- },
698
- });
699
- PresetUserLikeSchema.static({
700
- async getCountByPresetCondition(query, condition) {
701
- const result = await this.find(query).populate("preset_id").exec();
702
- debug("getCountByPresetCondition", query, condition, result, result.length);
703
- const filterVal = result.filter((item) => {
704
- const tmpObj = item.toObject();
705
- return condition in tmpObj["preset_id"];
706
- });
707
- return filterVal.length;
708
- },
709
- async getPresetLikeList(query, sort, req) {
710
- const pageParams = parsePageParams(req.query);
711
- const defaultPresetCondition = {
712
- "preset.status": { $eq: 0 },
713
- };
714
- let filterQuery;
715
- if ("no_dspid" in query) {
716
- defaultPresetCondition["preset.preset_meta.dspId"] = {
717
- $nin: String(query.no_dspid).split(","),
718
- };
719
- const { no_dspid: _no_dspid, ...rest } = query;
720
- filterQuery = rest;
721
- }
722
- else {
723
- filterQuery = { ...query };
724
- }
725
- const aggregateQuery = [
726
- {
727
- $match: {
728
- ..._queryCompatibilityHandler(filterQuery),
729
- user_id: new mongoose.Types.ObjectId(filterQuery["user_id"]),
730
- },
731
- },
732
- {
733
- $lookup: {
734
- from: "jamup_preset",
735
- localField: "preset_id",
736
- foreignField: "_id",
737
- as: "preset",
738
- },
739
- },
740
- {
741
- $unwind: "$preset",
742
- },
743
- {
744
- $match: defaultPresetCondition,
745
- },
746
- ];
747
- const presetQuery = _handlePresetVersion({}, req);
748
- if (Object.keys(presetQuery).length === 0) {
749
- debug("getPresetLikeList:%j:%o", aggregateQuery, sort);
750
- return this.aggregate(aggregateQuery)
751
- .sort({ date_like: -1 })
752
- .skip((pageParams["page"] - 1) * pageParams["page_size"])
753
- .limit(pageParams["page_size"])
754
- .exec();
755
- }
756
- else {
757
- if ("$and" in presetQuery && Array.isArray(presetQuery["$and"])) {
758
- presetQuery["$and"].forEach((item) => {
759
- const newQuery = { $match: {} };
760
- const objKey = Object.keys(item);
761
- const objVal = Object.values(item);
762
- if (objKey.length === 1 && objVal.length === 1) {
763
- newQuery["$match"][`preset.${objKey[0]}`] = objVal[0];
764
- aggregateQuery.push(newQuery);
765
- }
766
- });
767
- }
768
- debug("getPresetLikeListAggregate:%j:%o:%j", query, sort, aggregateQuery);
769
- return this.aggregate(aggregateQuery)
770
- .sort({ date_like: -1 })
771
- .skip((pageParams["page"] - 1) * pageParams["page_size"])
772
- .limit(pageParams["page_size"])
773
- .exec();
774
- }
775
- },
776
- async getPresetLikeListPromise(query, sort, req) {
777
- return this.getPresetLikeList(query, sort, req);
778
- },
779
- });
780
- PresetSchema.virtual("preset_version")
781
- .get(function () {
782
- return Number.isInteger(this.version.major) && Number.isInteger(this.version.minor)
783
- ? `${this.version.major}.${this.version.minor}`
784
- : "1.0";
785
- })
786
- .set(function (presetVersion) {
787
- const versionDetail = presetVersion.split(".");
788
- const major = versionDetail[0];
789
- const minor = versionDetail[1];
790
- this.set("version.major", parseInt(major, 10));
791
- this.set("version.minor", parseInt(minor, 10));
792
- });
793
- mongoose.model("Preset", PresetSchema);
794
- mongoose.model("PresetComment", PresetUserCommentSchema);
795
- mongoose.model("PresetLike", PresetUserLikeSchema);
796
- mongoose.model("PresetDownload", PresetUserDownloadSchema);
797
- mongoose.model("PopularPresetList", PopularPresetListSchema);
798
- mongoose.model("FakePresetLike", FakePresetLikeSchema);
799
- mongoose.model("PresetTagsMeta", PresetTagsMetaSchema);
800
- mongoose.model("PresetSongMapping", PresetSongMappingSchema);
801
- }
802
- //# sourceMappingURL=preset.js.map