@positivegrid/pg-mongoose-schema 28.0.0-beta.3 → 28.0.0-beta.5

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.
package/dist/index.cjs CHANGED
@@ -20,27 +20,23 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
20
20
  enumerable: true
21
21
  }) : target, mod));
22
22
  //#endregion
23
- let debug = require("debug");
24
- debug = __toESM(debug, 1);
25
- let lodash = require("lodash");
26
- lodash = __toESM(lodash, 1);
23
+ let node_util = require("node:util");
24
+ let es_toolkit_compat = require("es-toolkit/compat");
27
25
  let mongoose_lean_virtuals = require("mongoose-lean-virtuals");
28
26
  mongoose_lean_virtuals = __toESM(mongoose_lean_virtuals, 1);
27
+ let es_toolkit = require("es-toolkit");
29
28
  let mongoose_deep_populate = require("mongoose-deep-populate");
30
29
  mongoose_deep_populate = __toESM(mongoose_deep_populate, 1);
30
+ let date_fns = require("date-fns");
31
31
  let is_subset = require("is-subset");
32
32
  is_subset = __toESM(is_subset, 1);
33
- let moment = require("moment");
34
- moment = __toESM(moment, 1);
35
33
  let node_crypto = require("node:crypto");
36
34
  node_crypto = __toESM(node_crypto, 1);
37
- let _positivegrid_pg_error = require("@positivegrid/pg-error");
38
35
  let is_email = require("is-email");
39
36
  is_email = __toESM(is_email, 1);
40
37
  let random_string = require("random-string");
41
38
  random_string = __toESM(random_string, 1);
42
39
  //#region src/models/banks.ts
43
- (0, debug.default)("model:banks");
44
40
  function buildBanks(mongoose) {
45
41
  const { Schema } = mongoose;
46
42
  const ObjectId = Schema.Types.ObjectId;
@@ -322,7 +318,10 @@ function buildFeaturedList(mongoose) {
322
318
  is_shown: true,
323
319
  list_for: "jamup"
324
320
  };
325
- const queryObj = lodash.default.has(reqQuery, "list_for") ? lodash.default.assign({}, defaultQuery, { list_for: reqQuery.list_for }) : defaultQuery;
321
+ const queryObj = (0, es_toolkit_compat.has)(reqQuery, "list_for") ? {
322
+ ...defaultQuery,
323
+ list_for: reqQuery.list_for
324
+ } : defaultQuery;
326
325
  return this.find(queryObj).sort({ order: 1 }).select("-is_shown").lean({ virtuals: true }).exec();
327
326
  },
328
327
  getLimitedPresetLists(reqQuery) {
@@ -331,7 +330,10 @@ function buildFeaturedList(mongoose) {
331
330
  is_shown: true,
332
331
  list_for: "jamup"
333
332
  };
334
- const queryObj = lodash.default.has(reqQuery, "list_for") ? lodash.default.assign({}, defaultQuery, { list_for: reqQuery.list_for }) : defaultQuery;
333
+ const queryObj = (0, es_toolkit_compat.has)(reqQuery, "list_for") ? {
334
+ ...defaultQuery,
335
+ list_for: reqQuery.list_for
336
+ } : defaultQuery;
335
337
  return this.find(queryObj).sort({ order: 1 }).select("-is_shown").lean({ virtuals: true }).exec();
336
338
  }
337
339
  });
@@ -345,7 +347,7 @@ function buildFeaturedList(mongoose) {
345
347
  }
346
348
  //#endregion
347
349
  //#region src/models/hardware.ts
348
- const log$7 = (0, debug.default)("model:promo");
350
+ const log$7 = (0, node_util.debuglog)("model:promo");
349
351
  function _identifyHardwareByModel(model) {
350
352
  switch (model) {
351
353
  case "G1": return "head";
@@ -356,7 +358,7 @@ function _identifyHardwareByModel(model) {
356
358
  }
357
359
  }
358
360
  function _parseHardwareSerialNumber(hwSn) {
359
- if (!lodash.default.isString(hwSn)) throw new Error(`Invalid hardware series number format: ${hwSn}`);
361
+ if (typeof hwSn !== "string") throw new Error(`Invalid hardware series number format: ${hwSn}`);
360
362
  if (/^S/.test(hwSn)) {
361
363
  const hwModel = hwSn.slice(0, 1);
362
364
  const hwWattage = hwSn.slice(1, 4);
@@ -661,15 +663,15 @@ function buildHardware(mongoose) {
661
663
  let mostMatchingMeta = {};
662
664
  let mostMatchingNumber = 0;
663
665
  allMatch.forEach((metaItem) => {
664
- if (lodash.default.isArray(metaItem.pattern) && metaItem.pattern.length > 0) {
665
- const matchItem = lodash.default.intersection(metaItem.pattern, snPatternArr);
666
+ if (Array.isArray(metaItem.pattern) && metaItem.pattern.length > 0) {
667
+ const matchItem = (0, es_toolkit.intersection)(metaItem.pattern, snPatternArr);
666
668
  if (matchItem.length === metaItem.pattern.length && matchItem.length > mostMatchingNumber) {
667
669
  mostMatchingMeta = metaItem;
668
670
  mostMatchingNumber = matchItem.length;
669
671
  }
670
672
  }
671
673
  });
672
- if (lodash.default.isEmpty(mostMatchingMeta) || mostMatchingNumber === 0) {
674
+ if ((0, es_toolkit_compat.isEmpty)(mostMatchingMeta) || mostMatchingNumber === 0) {
673
675
  if (opts.allowEmpty === true) return null;
674
676
  throw new Error("Cannot find any activation meta match the SN pattern");
675
677
  }
@@ -910,7 +912,7 @@ function buildOauth(mongoose) {
910
912
  }
911
913
  //#endregion
912
914
  //#region src/models/partner.ts
913
- const log$6 = (0, debug.default)("model:partner");
915
+ const log$6 = (0, node_util.debuglog)("model:partner");
914
916
  const OEM_PROMOTION_TYPE = ["discount_coupon"];
915
917
  function _identifyItemTypeBySku(sku) {
916
918
  if (/^B(.*)/.test(sku)) return "bundle";
@@ -1247,8 +1249,8 @@ function buildPartner(mongoose) {
1247
1249
  });
1248
1250
  OemRedeemPromotionSchema.static({ async findRedeemFullfillPromotion(redeemData) {
1249
1251
  try {
1250
- if (!lodash.default.has(redeemData, "metadata.OEM_Name")) throw new Error("This is not a OEM redeem code.");
1251
- if (!lodash.default.has(redeemData, "metadata.product_name") || !lodash.default.has(redeemData, "metadata.type")) throw new Error("This is not a valid redeem code.");
1252
+ if (!(0, es_toolkit_compat.has)(redeemData, "metadata.OEM_Name")) throw new Error("This is not a OEM redeem code.");
1253
+ if (!(0, es_toolkit_compat.has)(redeemData, "metadata.product_name") || !(0, es_toolkit_compat.has)(redeemData, "metadata.type")) throw new Error("This is not a valid redeem code.");
1252
1254
  return this.find({
1253
1255
  redeem_product: redeemData.metadata.product_name,
1254
1256
  product_type: redeemData.metadata.type,
@@ -1272,7 +1274,7 @@ function buildPartner(mongoose) {
1272
1274
  }
1273
1275
  //#endregion
1274
1276
  //#region src/models/payment.ts
1275
- const log$5 = (0, debug.default)("model:payment");
1277
+ const log$5 = (0, node_util.debuglog)("model:payment");
1276
1278
  const OEM_FOCUSRITE_SUPPORT_LICENSE = [
1277
1279
  {
1278
1280
  support_type: {
@@ -1314,13 +1316,13 @@ function _oemMetaToLicenseName(redeemMeta) {
1314
1316
  let ret;
1315
1317
  switch (redeemMeta.OEM_Name) {
1316
1318
  case "focusrite":
1317
- ret = lodash.default.find(OEM_FOCUSRITE_SUPPORT_LICENSE, (o) => (0, is_subset.default)(redeemMeta, o.support_type));
1319
+ ret = OEM_FOCUSRITE_SUPPORT_LICENSE.find((o) => (0, is_subset.default)(redeemMeta, o.support_type));
1318
1320
  break;
1319
1321
  case "Apogee":
1320
- ret = lodash.default.find(OEM_APOGEE_SUPPORT_LICENSE, (o) => (0, is_subset.default)(redeemMeta, o.support_type));
1322
+ ret = OEM_APOGEE_SUPPORT_LICENSE.find((o) => (0, is_subset.default)(redeemMeta, o.support_type));
1321
1323
  break;
1322
1324
  case "ProSonus":
1323
- ret = lodash.default.find(OEM_PROSONUS_SUPPORT_LICENSE, (o) => (0, is_subset.default)(redeemMeta, o.support_type));
1325
+ ret = OEM_PROSONUS_SUPPORT_LICENSE.find((o) => (0, is_subset.default)(redeemMeta, o.support_type));
1324
1326
  break;
1325
1327
  default:
1326
1328
  log$5("ERROR:_oemMetaToLicenseName %o", redeemMeta);
@@ -1988,16 +1990,16 @@ function buildPayment(mongoose) {
1988
1990
  AdditionalPurchaseSchema.index({ exclude_country: 1 });
1989
1991
  AdditionalPurchaseSchema.static({
1990
1992
  async canPurchaseAdditional(ownedSku, additionalSku) {
1991
- if (!lodash.default.isArray(ownedSku) || !lodash.default.isArray(additionalSku)) throw new Error("Invalid parameter format!");
1993
+ if (!Array.isArray(ownedSku) || !Array.isArray(additionalSku)) throw new Error("Invalid parameter format!");
1992
1994
  const additionalPurchaseData = await this.find({
1993
1995
  "additional_purchase.sku": { $in: additionalSku },
1994
1996
  status: 1
1995
1997
  }).exec();
1996
1998
  if (additionalPurchaseData.length <= 0) return true;
1997
1999
  let canPurchase = false;
1998
- lodash.default.forEach(additionalPurchaseData, (addition) => {
2000
+ additionalPurchaseData.forEach((addition) => {
1999
2001
  if (addition.rule === "has") {
2000
- if (lodash.default.difference(ownedSku, addition.main_product_sku).length < ownedSku.length) canPurchase = true;
2002
+ if ((0, es_toolkit.difference)(ownedSku, addition.main_product_sku).length < ownedSku.length) canPurchase = true;
2001
2003
  }
2002
2004
  });
2003
2005
  return canPurchase;
@@ -2009,10 +2011,10 @@ function buildPayment(mongoose) {
2009
2011
  }).lean().exec();
2010
2012
  if (hasAdditionalPurchase.length <= 0) return true;
2011
2013
  let hasFulfill = true;
2012
- lodash.default.forEach(hasAdditionalPurchase, (addition) => {
2014
+ hasAdditionalPurchase.forEach((addition) => {
2013
2015
  if (addition.rule === "has") {
2014
2016
  const mainSkus = addition.main_product_sku;
2015
- if (lodash.default.difference(mainSkus, skus).length >= mainSkus.length) hasFulfill = false;
2017
+ if ((0, es_toolkit.difference)(mainSkus, skus).length >= mainSkus.length) hasFulfill = false;
2016
2018
  }
2017
2019
  });
2018
2020
  return hasFulfill;
@@ -2048,7 +2050,7 @@ function buildPayment(mongoose) {
2048
2050
  }, { collection: "cn_sales_meta" });
2049
2051
  CnSalesMetaSchema.static({ async getAllSaleItems(query = {}) {
2050
2052
  try {
2051
- const queryCondition = lodash.default.isObject(query) && lodash.default.isEmpty(query) ? { status: 1 } : query;
2053
+ const queryCondition = typeof query === "object" && query !== null && (0, es_toolkit_compat.isEmpty)(query) ? { status: 1 } : query;
2052
2054
  return await this.aggregate().match(queryCondition).lookup({
2053
2055
  from: "jamup_product",
2054
2056
  localField: "product_id",
@@ -2286,11 +2288,12 @@ function buildPayment(mongoose) {
2286
2288
  }).sort({ created_on: -1 }).populate("product_id").exec();
2287
2289
  },
2288
2290
  getUserLicense(query, cb) {
2289
- if (!lodash.default.isObject(query)) return cb(/* @__PURE__ */ new Error("Given query params should be a object"));
2290
- const queryObj = lodash.default.assign({}, query, {
2291
+ if (typeof query !== "object" || query === null) return cb(/* @__PURE__ */ new Error("Given query params should be a object"));
2292
+ const queryObj = {
2293
+ ...query,
2291
2294
  status: { $in: [1, 4] },
2292
2295
  $or: [{ due_date: null }, { due_date: { $gt: /* @__PURE__ */ new Date() } }]
2293
- });
2296
+ };
2294
2297
  this.find(queryObj).sort({ created_on: -1 }).populate("product_id", "id name price product_type status version addition extra_payment_fields").then((licenses) => {
2295
2298
  if (!Array.isArray(licenses)) return cb(/* @__PURE__ */ new Error("Invalid data format"));
2296
2299
  const result = [];
@@ -2301,13 +2304,14 @@ function buildPayment(mongoose) {
2301
2304
  }, (err) => cb(err));
2302
2305
  },
2303
2306
  async getUserLicensePromise(query) {
2304
- if (!lodash.default.isObject(query)) throw new Error("Given query params should be a object");
2305
- const queryObj = lodash.default.assign({}, query, {
2307
+ if (typeof query !== "object" || query === null) throw new Error("Given query params should be a object");
2308
+ const queryObj = {
2309
+ ...query,
2306
2310
  status: { $in: [1, 4] },
2307
2311
  $or: [{ due_date: null }, { due_date: { $gt: /* @__PURE__ */ new Date() } }]
2308
- });
2312
+ };
2309
2313
  const licenseData = await this.find(queryObj).sort({ created_on: -1 }).populate("product_id", "id name price product_type status version addition extra_payment_fields").exec();
2310
- if (!lodash.default.isArray(licenseData)) throw new Error("Invalid license data");
2314
+ if (!Array.isArray(licenseData)) throw new Error("Invalid license data");
2311
2315
  const result = [];
2312
2316
  licenseData.forEach((item) => {
2313
2317
  if (item.product_id) result.push(item);
@@ -2315,23 +2319,25 @@ function buildPayment(mongoose) {
2315
2319
  return result;
2316
2320
  },
2317
2321
  getUserPurchase(query, productType, cb) {
2318
- if (!lodash.default.isObject(query)) return cb(/* @__PURE__ */ new Error("Given query params should be a object"));
2322
+ if (typeof query !== "object" || query === null) return cb(/* @__PURE__ */ new Error("Given query params should be a object"));
2319
2323
  const populateProductList = productType === "pack" ? "id name product_type display_name extra_payment_fields created_on" : "id name price product_type display_name status version addition";
2320
- const queryObj = lodash.default.assign({}, query, {
2324
+ const queryObj = {
2325
+ ...query,
2321
2326
  status: { $in: [1, 4] },
2322
2327
  $or: [{ due_date: null }, { due_date: { $gt: /* @__PURE__ */ new Date() } }]
2323
- });
2328
+ };
2324
2329
  this.find(queryObj).sort({ created_on: -1 }).populate("product_id", populateProductList).then((docs) => cb(null, docs), (err) => cb(err));
2325
2330
  },
2326
2331
  async getUserPurchasePromise(query, productType, opts) {
2327
- if (!lodash.default.isObject(query)) throw new Error("Given query params should be a object");
2332
+ if (typeof query !== "object" || query === null) throw new Error("Given query params should be a object");
2328
2333
  const populateProductList = productType === "pack" ? "id name sku product_type display_name extra_payment_fields created_on" : "id name sku product_type display_name addition created_on";
2329
- const freeTrialQuery = productType === "free_trial" ? { $and: [{ from_free_trial: { $ne: null } }, { from_free_trial: { $exists: true } }] } : { $or: [{ from_free_trial: null }, { from_free_trial: { $exists: false } }] };
2330
- const queryObj = lodash.default.assign({}, {
2334
+ const queryObj = {
2331
2335
  status: { $in: [1, 4] },
2332
- $or: [{ due_date: null }, { due_date: { $gt: /* @__PURE__ */ new Date() } }]
2333
- }, freeTrialQuery, query);
2334
- if (lodash.default.has(opts, "isLean") && opts.isLean === true) return this.find(queryObj).sort({ created_on: -1 }).populate("product_id", populateProductList).lean({ virtuals: true }).exec();
2336
+ $or: [{ due_date: null }, { due_date: { $gt: /* @__PURE__ */ new Date() } }],
2337
+ ...productType === "free_trial" ? { $and: [{ from_free_trial: { $ne: null } }, { from_free_trial: { $exists: true } }] } : { $or: [{ from_free_trial: null }, { from_free_trial: { $exists: false } }] },
2338
+ ...query
2339
+ };
2340
+ if (opts?.isLean === true) return this.find(queryObj).sort({ created_on: -1 }).populate("product_id", populateProductList).lean({ virtuals: true }).exec();
2335
2341
  return this.find(queryObj).sort({ created_on: -1 }).populate("product_id", populateProductList).exec();
2336
2342
  },
2337
2343
  async getUserIapLicenses(userId, iapIds) {
@@ -2367,11 +2373,13 @@ function buildPayment(mongoose) {
2367
2373
  },
2368
2374
  async createTrialLicense(data) {
2369
2375
  try {
2370
- if (!lodash.default.has(data, "due_date") || !(0, moment.default)(data.due_date).isValid()) throw new Error("Invalid trail license format!");
2371
- return await this.create(lodash.default.assign({}, data, {
2376
+ const dueDate = new Date(data.due_date);
2377
+ if (!Object.hasOwn(data, "due_date") || !(0, date_fns.isValid)(dueDate)) throw new Error("Invalid trail license format!");
2378
+ return await this.create({
2379
+ ...data,
2372
2380
  status: 4,
2373
- due_date: (0, moment.default)(data.due_date).toDate()
2374
- }));
2381
+ due_date: dueDate
2382
+ });
2375
2383
  } catch (err) {
2376
2384
  log$5("ERR:createTrialLicense:%o", err);
2377
2385
  throw err;
@@ -2527,11 +2535,14 @@ function buildPgConfig(mongoose) {
2527
2535
  const that = this;
2528
2536
  let realCb = cb;
2529
2537
  let realMerge;
2530
- if (lodash.default.isFunction(doMerge)) realCb = doMerge;
2538
+ if (typeof doMerge === "function") realCb = doMerge;
2531
2539
  else realMerge = doMerge;
2532
2540
  that.findOne({ config_key: key }).then((config) => {
2533
2541
  if (config) {
2534
- config.config_value = lodash.default.isBoolean(realMerge) && realMerge === true ? lodash.default.assign({}, config.config_value, value) : value;
2542
+ config.config_value = realMerge === true ? {
2543
+ ...config.config_value,
2544
+ ...value
2545
+ } : value;
2535
2546
  config.created_on = /* @__PURE__ */ new Date();
2536
2547
  config.save().then((saved) => realCb(null, saved), (err) => realCb(err));
2537
2548
  } else that.create({
@@ -2556,12 +2567,18 @@ function buildPgConfig(mongoose) {
2556
2567
  }
2557
2568
  //#endregion
2558
2569
  //#region src/models/preset.ts
2559
- const log$4 = (0, debug.default)("model:preset");
2570
+ const log$4 = (0, node_util.debuglog)("model:preset");
2560
2571
  function _queryCompatibilityHandler(query) {
2561
2572
  let formatQuery = {};
2562
- if (lodash.default.has(query, "preset_for") && query.preset_for === "amp2") formatQuery = lodash.default.assign({}, query, { preset_for: { $in: ["amp2", "bias"] } });
2563
- else if (!lodash.default.has(query, "preset_for") || query.preset_for === "") formatQuery = lodash.default.assign({}, query, { preset_for: "jamup" });
2564
- if (lodash.default.isEmpty(formatQuery)) formatQuery = lodash.default.clone(query);
2573
+ if ((0, es_toolkit_compat.has)(query, "preset_for") && query.preset_for === "amp2") formatQuery = {
2574
+ ...query,
2575
+ preset_for: { $in: ["amp2", "bias"] }
2576
+ };
2577
+ else if (!(0, es_toolkit_compat.has)(query, "preset_for") || query.preset_for === "") formatQuery = {
2578
+ ...query,
2579
+ preset_for: "jamup"
2580
+ };
2581
+ if ((0, es_toolkit_compat.isEmpty)(formatQuery)) formatQuery = { ...query };
2565
2582
  return formatQuery;
2566
2583
  }
2567
2584
  function _handlePresetVersion(queryObj, req) {
@@ -2573,15 +2590,15 @@ function _handlePresetVersion(queryObj, req) {
2573
2590
  "lte",
2574
2591
  "ne"
2575
2592
  ];
2576
- if (!lodash.default.has(req.query, "preset_for") || lodash.default.has(req.query, "preset_for") && req.query.preset_for !== "live") return lodash.default.clone(queryObj);
2577
- else if (lodash.default.has(req.query, "preset_version") && lodash.default.has(req.query, "version_comparison")) {
2578
- if (lodash.default.indexOf(supportVersionComparison, req.query.version_comparison) !== -1) {
2579
- const tmpVersionQuery = lodash.default.clone(queryObj);
2593
+ if (!(0, es_toolkit_compat.has)(req.query, "preset_for") || (0, es_toolkit_compat.has)(req.query, "preset_for") && req.query.preset_for !== "live") return { ...queryObj };
2594
+ else if ((0, es_toolkit_compat.has)(req.query, "preset_version") && (0, es_toolkit_compat.has)(req.query, "version_comparison")) {
2595
+ if (supportVersionComparison.indexOf(req.query.version_comparison) !== -1) {
2596
+ const tmpVersionQuery = { ...queryObj };
2580
2597
  const versionQuery = _buildPresetVersionQuery(req.query.preset_version, req.query.version_comparison);
2581
- if (versionQuery) return lodash.default.merge(tmpVersionQuery, versionQuery);
2598
+ if (versionQuery) return (0, es_toolkit_compat.merge)(tmpVersionQuery, versionQuery);
2582
2599
  }
2583
2600
  }
2584
- return lodash.default.clone(queryObj);
2601
+ return { ...queryObj };
2585
2602
  }
2586
2603
  function _buildPresetVersionQuery(version, comparison) {
2587
2604
  const tmpAttrs = String(version).split(".");
@@ -2615,7 +2632,7 @@ function _buildLicenseTierQuery(licenseTierParam) {
2615
2632
  const tmpData = /* @__PURE__ */ new Set();
2616
2633
  const expansionData = /* @__PURE__ */ new Set();
2617
2634
  const allExpansion = new Set(["celestion", "classic"]);
2618
- lodash.default.forEach(tmpLicenseTier, (lic) => {
2635
+ tmpLicenseTier.forEach((lic) => {
2619
2636
  switch (lic) {
2620
2637
  case "celestion":
2621
2638
  case "classic":
@@ -2646,7 +2663,7 @@ function _buildLicenseTierQuery(licenseTierParam) {
2646
2663
  });
2647
2664
  return expansionData.size > 0 ? { $and: [
2648
2665
  { license_tier: { $in: Array.from(tmpData) } },
2649
- { license_tier: { $in: lodash.default.concat(Array.from(tmpData), Array.from(expansionData)) } },
2666
+ { license_tier: { $in: [...Array.from(tmpData), ...Array.from(expansionData)] } },
2650
2667
  { license_tier: { $nin: Array.from(allExpansion) } }
2651
2668
  ] } : { $and: [{ license_tier: { $in: Array.from(tmpData) } }, { license_tier: { $nin: Array.from(allExpansion) } }] };
2652
2669
  }
@@ -2655,13 +2672,13 @@ function _parsePageParams(data) {
2655
2672
  page_size: 12,
2656
2673
  page: 1
2657
2674
  };
2658
- if (data && lodash.default.has(data, "page_size")) {
2675
+ if (data && (0, es_toolkit_compat.has)(data, "page_size")) {
2659
2676
  const pageSize = Array.isArray(data.page_size) ? parseInt(data.page_size.pop(), 10) : parseInt(data.page_size, 10);
2660
- if (pageSize >= 1) pageParams = lodash.default.merge(pageParams, { page_size: pageSize });
2677
+ if (pageSize >= 1) pageParams = (0, es_toolkit_compat.merge)(pageParams, { page_size: pageSize });
2661
2678
  }
2662
- if (data && lodash.default.has(data, "page")) {
2679
+ if (data && (0, es_toolkit_compat.has)(data, "page")) {
2663
2680
  const page = Array.isArray(data.page) ? parseInt(data.page.pop(), 10) : parseInt(data.page, 10);
2664
- if (page > 1) pageParams = lodash.default.merge(pageParams, { page });
2681
+ if (page > 1) pageParams = (0, es_toolkit_compat.merge)(pageParams, { page });
2665
2682
  }
2666
2683
  return pageParams;
2667
2684
  }
@@ -2929,14 +2946,17 @@ function buildPreset(mongoose) {
2929
2946
  this.find({ creator_id: userId }).sort({ created_on: -1 }).then((docs) => cb(null, docs), (err) => cb(err));
2930
2947
  },
2931
2948
  async getPresetByQuery(req, opts = {}) {
2932
- if (!lodash.default.has(req.query, "keyword") || !lodash.default.isString(req.query.keyword)) throw new Error("missing the searching term");
2949
+ if (!(0, es_toolkit_compat.has)(req.query, "keyword") || !(0, es_toolkit_compat.isString)(req.query.keyword)) throw new Error("missing the searching term");
2933
2950
  const pageParams = _parsePageParams(req.query);
2934
2951
  let searchCondition = {
2935
2952
  preset_for: req.query.preset_for ? req.query.preset_for : "jamup",
2936
2953
  status: 0
2937
2954
  };
2938
- if (lodash.default.has(req.query, "license_tier")) searchCondition = lodash.default.merge(lodash.default.clone(searchCondition), _buildLicenseTierQuery(req.query.license_tier));
2939
- if (lodash.default.has(req.query, "order") && req.query.order === "hot") searchCondition = lodash.default.assign({}, searchCondition, { created_on: { $gte: (0, moment.default)().subtract(1, "month").toDate() } });
2955
+ if ((0, es_toolkit_compat.has)(req.query, "license_tier")) searchCondition = (0, es_toolkit_compat.merge)({ ...searchCondition }, _buildLicenseTierQuery(req.query.license_tier));
2956
+ if ((0, es_toolkit_compat.has)(req.query, "order") && req.query.order === "hot") searchCondition = {
2957
+ ...searchCondition,
2958
+ created_on: { $gte: (0, date_fns.subMonths)(/* @__PURE__ */ new Date(), 1) }
2959
+ };
2940
2960
  searchCondition = _handlePresetVersion(searchCondition, req);
2941
2961
  const aggregatePipeline = [
2942
2962
  { $search: {
@@ -2964,7 +2984,7 @@ function buildPreset(mongoose) {
2964
2984
  { $skip: (pageParams.page - 1) * pageParams.page_size },
2965
2985
  { $limit: pageParams.page_size }
2966
2986
  ];
2967
- if (!lodash.default.has(opts, "full")) aggregatePipeline.push({ $project: { preset_data: 0 } });
2987
+ if (!(0, es_toolkit_compat.has)(opts, "full")) aggregatePipeline.push({ $project: { preset_data: 0 } });
2968
2988
  return this.aggregate(aggregatePipeline);
2969
2989
  },
2970
2990
  async getPresetsBySearch(req) {
@@ -2975,52 +2995,55 @@ function buildPreset(mongoose) {
2975
2995
  status: 0
2976
2996
  };
2977
2997
  let selectOps = {};
2978
- if (!lodash.default.has(req.query, "detail") || req.query.detail !== "yes") selectOps = { preset_data: 0 };
2979
- if (lodash.default.has(req.query, "pids")) {
2998
+ if (!(0, es_toolkit_compat.has)(req.query, "detail") || req.query.detail !== "yes") selectOps = { preset_data: 0 };
2999
+ if ((0, es_toolkit_compat.has)(req.query, "pids")) {
2980
3000
  const pids = req.query.pids.split(",");
2981
3001
  searchCondition._id = { $in: pids };
2982
3002
  }
2983
- if (lodash.default.has(req.query, "category")) searchCondition.category = { $in: String(req.query.category).split(",") };
2984
- else if (lodash.default.has(req.query, "except_cateogry")) searchCondition.category = { $nin: String(req.query.except_cateogry).split(",") };
2985
- if (lodash.default.has(req.query, "pedal_type")) searchCondition["preset_meta.pedal_type"] = req.query.pedal_type;
2986
- if (lodash.default.has(req.query, "preset_features")) {
3003
+ if ((0, es_toolkit_compat.has)(req.query, "category")) searchCondition.category = { $in: String(req.query.category).split(",") };
3004
+ else if ((0, es_toolkit_compat.has)(req.query, "except_cateogry")) searchCondition.category = { $nin: String(req.query.except_cateogry).split(",") };
3005
+ if ((0, es_toolkit_compat.has)(req.query, "pedal_type")) searchCondition["preset_meta.pedal_type"] = req.query.pedal_type;
3006
+ if ((0, es_toolkit_compat.has)(req.query, "preset_features")) {
2987
3007
  const params = req.query.preset_features.split(",");
2988
3008
  const featureQuery = {};
2989
- lodash.default.forEach(params, (param) => {
3009
+ params.forEach((param) => {
2990
3010
  const t = param.split(":");
2991
3011
  if (t.length === 2) featureQuery[t[0]] = parseInt(t[1], 10);
2992
3012
  });
2993
3013
  searchCondition.preset_features = featureQuery;
2994
3014
  }
2995
3015
  const createQuery = {};
2996
- if (lodash.default.has(req.query, "create_after")) {
2997
- const d = (0, moment.default)(req.query.create_after);
2998
- if (d.isValid()) createQuery.$gte = d.toDate();
3016
+ if ((0, es_toolkit_compat.has)(req.query, "create_after")) {
3017
+ const d = new Date(req.query.create_after);
3018
+ if ((0, date_fns.isValid)(d)) createQuery.$gte = d;
2999
3019
  }
3000
- if (lodash.default.has(req.query, "create_before")) {
3001
- const d = (0, moment.default)(req.query.create_before);
3002
- if (d.isValid()) createQuery.$lte = d.toDate();
3020
+ if ((0, es_toolkit_compat.has)(req.query, "create_before")) {
3021
+ const d = new Date(req.query.create_before);
3022
+ if ((0, date_fns.isValid)(d)) createQuery.$lte = d;
3003
3023
  }
3004
- if (!lodash.default.isEmpty(createQuery)) searchCondition.created_on = createQuery;
3024
+ if (!(0, es_toolkit_compat.isEmpty)(createQuery)) searchCondition.created_on = createQuery;
3005
3025
  const updateQuery = {};
3006
- if (lodash.default.has(req.query, "update_after")) {
3007
- const d = (0, moment.default)(req.query.update_after);
3008
- if (d.isValid()) updateQuery.$gte = d.toDate();
3026
+ if ((0, es_toolkit_compat.has)(req.query, "update_after")) {
3027
+ const d = new Date(req.query.update_after);
3028
+ if ((0, date_fns.isValid)(d)) updateQuery.$gte = d;
3009
3029
  }
3010
- if (lodash.default.has(req.query, "update_before")) {
3011
- const d = (0, moment.default)(req.query.update_before);
3012
- if (d.isValid()) updateQuery.$lte = d.toDate();
3030
+ if ((0, es_toolkit_compat.has)(req.query, "update_before")) {
3031
+ const d = new Date(req.query.update_before);
3032
+ if ((0, date_fns.isValid)(d)) updateQuery.$lte = d;
3013
3033
  }
3014
- if (!lodash.default.isEmpty(updateQuery)) searchCondition.updated_on = updateQuery;
3015
- if (lodash.default.has(req.query, "license_tier")) searchCondition = lodash.default.merge(lodash.default.clone(searchCondition), _buildLicenseTierQuery(req.query.license_tier));
3016
- if (lodash.default.has(req.query, "order") && req.query.order === "hot") searchCondition = lodash.default.assign({}, searchCondition, { created_on: { $gte: (0, moment.default)().subtract(1, "month").toDate() } });
3034
+ if (!(0, es_toolkit_compat.isEmpty)(updateQuery)) searchCondition.updated_on = updateQuery;
3035
+ if ((0, es_toolkit_compat.has)(req.query, "license_tier")) searchCondition = (0, es_toolkit_compat.merge)({ ...searchCondition }, _buildLicenseTierQuery(req.query.license_tier));
3036
+ if ((0, es_toolkit_compat.has)(req.query, "order") && req.query.order === "hot") searchCondition = {
3037
+ ...searchCondition,
3038
+ created_on: { $gte: (0, date_fns.subMonths)(/* @__PURE__ */ new Date(), 1) }
3039
+ };
3017
3040
  if (searchCondition.preset_for === "spark") {
3018
- if (lodash.default.has(req.query, "signal_chain_type")) searchCondition.signal_chain_type = req.query.signal_chain_type;
3019
- if (lodash.default.has(req.query, "no_dspid")) searchCondition["preset_meta.dspId"] = { $nin: String(req.query.no_dspid).split(",") };
3041
+ if ((0, es_toolkit_compat.has)(req.query, "signal_chain_type")) searchCondition.signal_chain_type = req.query.signal_chain_type;
3042
+ if ((0, es_toolkit_compat.has)(req.query, "no_dspid")) searchCondition["preset_meta.dspId"] = { $nin: String(req.query.no_dspid).split(",") };
3020
3043
  }
3021
3044
  searchCondition = _handlePresetVersion(searchCondition, req);
3022
- if (lodash.default.has(req, "query.keyword") && !lodash.default.isEmpty(req.query.keyword)) {
3023
- if (lodash.default.has(process.env, "IS_CHINA")) {
3045
+ if ((0, es_toolkit_compat.has)(req, "query.keyword") && !(0, es_toolkit_compat.isEmpty)(req.query.keyword)) {
3046
+ if ((0, es_toolkit_compat.has)(process.env, "IS_CHINA")) {
3024
3047
  searchCondition.$or = [{ name: new RegExp(`^${_filterKeyword(req.query.keyword)}`, "i") }, { description: new RegExp(`${_filterKeyword(req.query.keyword)}`, "i") }];
3025
3048
  return this.aggregate([
3026
3049
  { $match: _queryCompatibilityHandler(searchCondition) },
@@ -3056,14 +3079,14 @@ function buildPreset(mongoose) {
3056
3079
  getPresetsList(query, sort, req, cb) {
3057
3080
  const pageParams = _parsePageParams(req.query);
3058
3081
  let q = query;
3059
- if (lodash.default.isObject(q)) q.status = 0;
3060
- if (lodash.default.has(q, "preset_for") && q.preset_for !== "jamup") {
3082
+ if ((0, es_toolkit_compat.isPlainObject)(q)) q.status = 0;
3083
+ if ((0, es_toolkit_compat.has)(q, "preset_for") && q.preset_for !== "jamup") {
3061
3084
  q.image_url = { $ne: null };
3062
3085
  q.thumb_url = { $ne: null };
3063
3086
  }
3064
- if (lodash.default.has(req.query, "license_tier")) q = lodash.default.merge(lodash.default.clone(q), _buildLicenseTierQuery(req.query.license_tier));
3087
+ if ((0, es_toolkit_compat.has)(req.query, "license_tier")) q = (0, es_toolkit_compat.merge)({ ...q }, _buildLicenseTierQuery(req.query.license_tier));
3065
3088
  let finalSort = sort;
3066
- if (lodash.default.has(req.query, "order")) finalSort = _buildSortQuery(req.query.order);
3089
+ if ((0, es_toolkit_compat.has)(req.query, "order")) finalSort = _buildSortQuery(req.query.order);
3067
3090
  q = _handlePresetVersion(q, req);
3068
3091
  this.find(_queryCompatibilityHandler(q)).sort(finalSort).select("-preset_data").skip((pageParams.page - 1) * pageParams.page_size).limit(pageParams.page_size).then((docs) => cb(null, docs), (err) => cb(err));
3069
3092
  },
@@ -3075,8 +3098,8 @@ function buildPreset(mongoose) {
3075
3098
  getMyPresets(query, sort, req, cb) {
3076
3099
  const pageParams = _parsePageParams(req.query);
3077
3100
  let q = query;
3078
- if (lodash.default.isObject(q)) q.status = { $in: [0, 2] };
3079
- if (lodash.default.has(q, "preset_for") && q.preset_for !== "jamup") {
3101
+ if ((0, es_toolkit_compat.isPlainObject)(q)) q.status = { $in: [0, 2] };
3102
+ if ((0, es_toolkit_compat.has)(q, "preset_for") && q.preset_for !== "jamup") {
3080
3103
  q.image_url = { $ne: null };
3081
3104
  q.thumb_url = { $ne: null };
3082
3105
  }
@@ -3084,8 +3107,8 @@ function buildPreset(mongoose) {
3084
3107
  this.find(_queryCompatibilityHandler(q)).sort(sort).select("-preset_data").skip((pageParams.page - 1) * pageParams.page_size).limit(pageParams.page_size).then((docs) => cb(null, docs), (err) => cb(err));
3085
3108
  },
3086
3109
  getOnePresetByCondition(query, opts, cb) {
3087
- const defaultSort = lodash.default.has(opts, "sort") && lodash.default.isObject(opts.sort) ? opts.sort : { created_on: -1 };
3088
- const defaultSelect = lodash.default.has(opts, "select") && lodash.default.isString(opts.select) ? opts.select : "";
3110
+ const defaultSort = (0, es_toolkit_compat.has)(opts, "sort") && (0, es_toolkit_compat.isPlainObject)(opts.sort) ? opts.sort : { created_on: -1 };
3111
+ const defaultSelect = (0, es_toolkit_compat.has)(opts, "select") && (0, es_toolkit_compat.isString)(opts.select) ? opts.select : "";
3089
3112
  this.findOne(_queryCompatibilityHandler(query)).sort(defaultSort).select(defaultSelect).then((doc) => cb(null, doc), (err) => cb(err));
3090
3113
  },
3091
3114
  getSinglePreset(id, cb) {
@@ -3154,9 +3177,8 @@ function buildPreset(mongoose) {
3154
3177
  PresetUserLike.static({
3155
3178
  getCountByPresetCondition(query, condition, cb) {
3156
3179
  this.find(query).populate("preset_id").then((result) => {
3157
- return cb(null, lodash.default.filter(result, (item) => {
3158
- const tmpObj = item.toObject ? item.toObject() : item;
3159
- return lodash.default.has(tmpObj.preset_id, condition);
3180
+ return cb(null, result.filter((item) => {
3181
+ return (0, es_toolkit_compat.has)((item.toObject ? item.toObject() : item).preset_id, condition);
3160
3182
  }).length);
3161
3183
  }, (err) => cb(err));
3162
3184
  },
@@ -3164,12 +3186,15 @@ function buildPreset(mongoose) {
3164
3186
  const pageParams = _parsePageParams(req.query);
3165
3187
  const defaultPresetCondition = { "preset.status": { $eq: 0 } };
3166
3188
  let filterQuery = {};
3167
- if (lodash.default.has(query, "no_dspid")) {
3189
+ if ((0, es_toolkit_compat.has)(query, "no_dspid")) {
3168
3190
  defaultPresetCondition["preset.preset_meta.dspId"] = { $nin: String(query.no_dspid).split(",") };
3169
- filterQuery = lodash.default.omit(query, ["no_dspid"]);
3170
- } else filterQuery = lodash.default.clone(query);
3191
+ filterQuery = (0, es_toolkit.omit)(query, ["no_dspid"]);
3192
+ } else filterQuery = { ...query };
3171
3193
  const aggregateQuery = [
3172
- { $match: lodash.default.assign({}, _queryCompatibilityHandler(filterQuery), { user_id: new mongoose.Types.ObjectId(filterQuery.user_id) }) },
3194
+ { $match: {
3195
+ ..._queryCompatibilityHandler(filterQuery),
3196
+ user_id: new mongoose.Types.ObjectId(filterQuery.user_id)
3197
+ } },
3173
3198
  { $lookup: {
3174
3199
  from: "jamup_preset",
3175
3200
  localField: "preset_id",
@@ -3180,10 +3205,10 @@ function buildPreset(mongoose) {
3180
3205
  { $match: defaultPresetCondition }
3181
3206
  ];
3182
3207
  const presetQuery = _handlePresetVersion({}, req);
3183
- if (!lodash.default.isEmpty(presetQuery) && lodash.default.has(presetQuery, "$and") && lodash.default.isArray(presetQuery.$and)) lodash.default.forEach(presetQuery.$and, (item) => {
3208
+ if (!(0, es_toolkit_compat.isEmpty)(presetQuery) && (0, es_toolkit_compat.has)(presetQuery, "$and") && Array.isArray(presetQuery.$and)) presetQuery.$and.forEach((item) => {
3184
3209
  const newQuery = { $match: {} };
3185
- const objKey = lodash.default.keys(item);
3186
- const objVal = lodash.default.values(item);
3210
+ const objKey = Object.keys(item);
3211
+ const objVal = Object.values(item);
3187
3212
  if (objKey.length === 1 && objVal.length === 1) {
3188
3213
  newQuery.$match[`preset.${objKey[0]}`] = objVal[0];
3189
3214
  aggregateQuery.push(newQuery);
@@ -3221,7 +3246,7 @@ function buildPreset(mongoose) {
3221
3246
  }
3222
3247
  //#endregion
3223
3248
  //#region src/models/promotion.ts
3224
- const log$3 = (0, debug.default)("model:promotion");
3249
+ const log$3 = (0, node_util.debuglog)("model:promotion");
3225
3250
  const CAMPAIGN_TYPE = ["free_upgrade"];
3226
3251
  function buildPromotion(mongoose) {
3227
3252
  const { Schema } = mongoose;
@@ -3380,15 +3405,15 @@ function buildPromotion(mongoose) {
3380
3405
  try {
3381
3406
  const nowTime = /* @__PURE__ */ new Date();
3382
3407
  const defaultQuery = { $and: [{ $or: [{ start_time: null }, { start_time: { $lt: nowTime } }] }, { $or: [{ end_time: null }, { end_time: { $gt: nowTime } }] }] };
3383
- if (!lodash.default.isUndefined(params)) {
3408
+ if (params !== void 0) {
3384
3409
  log$3("getAvailableAnnouncement:querystring %o", params);
3385
3410
  const { pname, locale, ta_device, country, device_list, device_os } = params;
3386
- if (!lodash.default.isUndefined(pname) && lodash.default.isString(pname)) defaultQuery.$and.push({ announce_for: { $in: lodash.default.concat([pname], "all") } });
3387
- if (!lodash.default.isUndefined(locale) && lodash.default.isString(locale)) defaultQuery.$and.push({ locale });
3388
- if (!lodash.default.isUndefined(ta_device) && lodash.default.isString(ta_device)) defaultQuery.$and.push({ target_audience_device: { $in: lodash.default.concat(ta_device.split(","), "all") } });
3389
- if (!lodash.default.isUndefined(country) && lodash.default.isString(country)) defaultQuery.$and.push({ $or: [{ country: { $all: country.split(",") } }, { country: { $in: ["all"] } }] });
3411
+ if (typeof pname === "string") defaultQuery.$and.push({ announce_for: { $in: [pname, "all"] } });
3412
+ if (typeof locale === "string") defaultQuery.$and.push({ locale });
3413
+ if (typeof ta_device === "string") defaultQuery.$and.push({ target_audience_device: { $in: [...ta_device.split(","), "all"] } });
3414
+ if (typeof country === "string") defaultQuery.$and.push({ $or: [{ country: { $all: country.split(",") } }, { country: { $in: ["all"] } }] });
3390
3415
  else defaultQuery.$and.push({ $or: [{ country: { $in: ["all"] } }, { country: { $exists: false } }] });
3391
- if (!lodash.default.isUndefined(device_list)) if (lodash.default.isString(device_list) && !lodash.default.isEmpty(device_list)) {
3416
+ if (device_list !== void 0) if (typeof device_list === "string" && device_list.length > 0) {
3392
3417
  const tmpDeviceList = device_list.split(",");
3393
3418
  const deviceList = [];
3394
3419
  const allTypeSet = /* @__PURE__ */ new Set();
@@ -3403,17 +3428,17 @@ function buildPromotion(mongoose) {
3403
3428
  if (uniqueProductLineSet.size > 0) uniqueProductLineSet.forEach((item) => deviceList.push(`${item}_all`));
3404
3429
  defaultQuery.$and.push({ device_list: { $in: deviceList } });
3405
3430
  } else defaultQuery.$and.push({ device_list: { $in: ["none"] } });
3406
- if (!lodash.default.isUndefined(device_os) && lodash.default.isString(device_os)) defaultQuery.$and.push({ $or: [{ device_os: "all" }, { device_os }] });
3431
+ if (typeof device_os === "string") defaultQuery.$and.push({ $or: [{ device_os: "all" }, { device_os }] });
3407
3432
  }
3408
3433
  let ret;
3409
- if (!lodash.default.has(params, "email") || lodash.default.has(params, "email") && lodash.default.isUndefined(params.email)) {
3434
+ if (params?.email === void 0) {
3410
3435
  defaultQuery.$and.push({ user_list_num: 0 });
3411
3436
  defaultQuery.$and.push({ action_button: { $elemMatch: { type: { $ne: "free_trial" } } } });
3412
3437
  ret = await this.find(defaultQuery).lean().exec();
3413
3438
  } else {
3414
- const noUserQuery = lodash.default.cloneDeep(defaultQuery);
3439
+ const noUserQuery = structuredClone(defaultQuery);
3415
3440
  noUserQuery.$and.push({ user_list_num: 0 });
3416
- const hasUserQuery = lodash.default.cloneDeep(defaultQuery);
3441
+ const hasUserQuery = structuredClone(defaultQuery);
3417
3442
  hasUserQuery.$and.push({ user_list_num: { $gt: 0 } });
3418
3443
  const [noUserData, hasUserData] = await Promise.all([this.aggregate([{ $match: noUserQuery }]).exec(), this.aggregate([
3419
3444
  { $match: hasUserQuery },
@@ -3429,9 +3454,9 @@ function buildPromotion(mongoose) {
3429
3454
  "paUserList.status": 1
3430
3455
  } }
3431
3456
  ]).exec()]);
3432
- ret = lodash.default.concat(noUserData, hasUserData);
3457
+ ret = [...noUserData, ...hasUserData];
3433
3458
  }
3434
- return lodash.default.orderBy(ret, ["order", "start_time"], ["desc", "asc"]);
3459
+ return (0, es_toolkit_compat.orderBy)(ret, ["order", "start_time"], ["desc", "asc"]);
3435
3460
  } catch (err) {
3436
3461
  log$3("ERR:getAvailableAnnouncement %j", err);
3437
3462
  throw err;
@@ -4314,7 +4339,34 @@ function buildToneThemeFeaturedList(mongoose) {
4314
4339
  }
4315
4340
  //#endregion
4316
4341
  //#region src/models/user.ts
4317
- const log$2 = (0, debug.default)("model:user");
4342
+ const log$2 = (0, node_util.debuglog)("model:user");
4343
+ /**
4344
+ * Error thrown by User auth statics. Replaces the previous dependency on
4345
+ * `@positivegrid/pg-error`'s `AuthError`. Preserves the `errorCode` +
4346
+ * `statusCode` property contract so existing duck-typing checks
4347
+ * (`err.errorCode === 'USER_UNAUTHORIZED'`) keep working. Consumers that
4348
+ * relied on `instanceof AuthError` should switch to `instanceof AuthError`
4349
+ * (re-exported from the package root).
4350
+ */
4351
+ const AUTH_ERROR_STATUS = {
4352
+ USER_UNAUTHORIZED: 401,
4353
+ USER_NOT_EXIST: 404,
4354
+ USER_OAUTH_LOGIN: 400,
4355
+ ACCOUNT_WERE_DELETED: 400,
4356
+ INTERNAL_SYSMTEM_ERROR: 500
4357
+ };
4358
+ var AuthError = class extends Error {
4359
+ errorCode;
4360
+ statusCode;
4361
+ customData;
4362
+ constructor(code, message, customData) {
4363
+ super(message);
4364
+ this.name = "AuthError";
4365
+ this.errorCode = code;
4366
+ this.statusCode = AUTH_ERROR_STATUS[code.toUpperCase()] ?? 500;
4367
+ if (customData) this.customData = customData;
4368
+ }
4369
+ };
4318
4370
  function encryptPassword(pwd) {
4319
4371
  if (!pwd) return "";
4320
4372
  const encryptType = "sha1";
@@ -4705,6 +4757,136 @@ function buildUser(mongoose) {
4705
4757
  follow_platform: 1,
4706
4758
  follow_user_id: 1
4707
4759
  }, { unique: true });
4760
+ const UserPointsSchema = new Schema({
4761
+ user_id: {
4762
+ type: ObjectId,
4763
+ ref: "User",
4764
+ required: true
4765
+ },
4766
+ points: {
4767
+ type: Number,
4768
+ default: 0,
4769
+ min: 0
4770
+ },
4771
+ lifetime_earned: {
4772
+ type: Number,
4773
+ default: 0,
4774
+ min: 0
4775
+ },
4776
+ created_on: {
4777
+ type: Date,
4778
+ default: Date.now
4779
+ },
4780
+ updated_on: {
4781
+ type: Date,
4782
+ default: Date.now
4783
+ }
4784
+ }, { collection: "user_points" });
4785
+ UserPointsSchema.index({ user_id: 1 }, { unique: true });
4786
+ const UserRewardHistorySchema = new Schema({
4787
+ user_point_id: {
4788
+ type: ObjectId,
4789
+ ref: "UserPoints",
4790
+ required: true
4791
+ },
4792
+ point_change: {
4793
+ type: Number,
4794
+ required: true
4795
+ },
4796
+ event: {
4797
+ type: String,
4798
+ required: true
4799
+ },
4800
+ created_on: {
4801
+ type: Date,
4802
+ default: Date.now
4803
+ },
4804
+ updated_on: {
4805
+ type: Date,
4806
+ default: Date.now
4807
+ }
4808
+ }, { collection: "user_reward_history" });
4809
+ UserRewardHistorySchema.index({
4810
+ user_point_id: 1,
4811
+ event: 1
4812
+ }, { unique: true });
4813
+ const RewardPointsRedeemListSchema = new Schema({
4814
+ name: {
4815
+ type: String,
4816
+ required: true
4817
+ },
4818
+ skus: {
4819
+ type: [String],
4820
+ default: []
4821
+ },
4822
+ discount_percent: {
4823
+ type: Number,
4824
+ required: true
4825
+ },
4826
+ points_required: {
4827
+ type: Number,
4828
+ required: true,
4829
+ min: 0
4830
+ },
4831
+ created_on: {
4832
+ type: Date,
4833
+ default: Date.now
4834
+ }
4835
+ }, { collection: "reward_points_redeem_list" });
4836
+ const UserRedeemRewardPointsRecordSchema = new Schema({
4837
+ user_id: {
4838
+ type: ObjectId,
4839
+ ref: "User",
4840
+ required: true
4841
+ },
4842
+ reward_points_redeem_id: {
4843
+ type: ObjectId,
4844
+ ref: "RewardPointsRedeemList",
4845
+ required: true
4846
+ },
4847
+ discount_code: {
4848
+ type: String,
4849
+ required: true
4850
+ },
4851
+ created_on: {
4852
+ type: Date,
4853
+ default: Date.now
4854
+ }
4855
+ }, { collection: "user_redeem_reward_points_record" });
4856
+ UserRedeemRewardPointsRecordSchema.index({
4857
+ user_id: 1,
4858
+ created_on: -1
4859
+ });
4860
+ const IntermediateUserOrderRewardSchema = new Schema({
4861
+ email: {
4862
+ type: String,
4863
+ required: true,
4864
+ lowercase: true,
4865
+ trim: true
4866
+ },
4867
+ order_id: {
4868
+ type: Number,
4869
+ required: true
4870
+ },
4871
+ price: {
4872
+ type: Number,
4873
+ required: true,
4874
+ min: 0
4875
+ },
4876
+ status: {
4877
+ type: Number,
4878
+ default: 1
4879
+ },
4880
+ created_on: {
4881
+ type: Date,
4882
+ default: Date.now
4883
+ }
4884
+ }, { collection: "intermediate_user_order_reward" });
4885
+ IntermediateUserOrderRewardSchema.index({
4886
+ email: 1,
4887
+ order_id: 1
4888
+ }, { unique: true });
4889
+ IntermediateUserOrderRewardSchema.index({ status: 1 });
4708
4890
  UserSchema.method({
4709
4891
  authenticate(plainText) {
4710
4892
  const passwordArr = this.password.split("$");
@@ -4746,23 +4928,23 @@ function buildUser(mongoose) {
4746
4928
  try {
4747
4929
  user = await this.findOne({ username: normalized }).exec();
4748
4930
  } catch (err) {
4749
- throw new _positivegrid_pg_error.ApiErrorCode("internal_sysmtem_error", err.message);
4931
+ throw new AuthError("internal_sysmtem_error", err.message);
4750
4932
  }
4751
4933
  if (!user) {
4752
4934
  let bgUser;
4753
4935
  try {
4754
4936
  bgUser = await this.findOne({ bk_username: { $in: [normalized] } }).exec();
4755
4937
  } catch (err) {
4756
- throw new _positivegrid_pg_error.ApiErrorCode("INTERNAL_SYSMTEM_ERROR", err.message);
4938
+ throw new AuthError("INTERNAL_SYSMTEM_ERROR", err.message);
4757
4939
  }
4758
- if (!bgUser) throw new _positivegrid_pg_error.ApiErrorCode("USER_NOT_EXIST", `Cannot find user ${normalized}`);
4759
- else if (!bgUser.authenticate(password)) throw new _positivegrid_pg_error.ApiErrorCode("USER_UNAUTHORIZED", "unauthorized");
4940
+ if (!bgUser) throw new AuthError("USER_NOT_EXIST", `Cannot find user ${normalized}`);
4941
+ else if (!bgUser.authenticate(password)) throw new AuthError("USER_UNAUTHORIZED", "unauthorized");
4760
4942
  return bgUser;
4761
4943
  }
4762
- if (user.user_status === 2) throw new _positivegrid_pg_error.ApiErrorCode("ACCOUNT_WERE_DELETED", `Account ${user.email} already deleted`);
4944
+ if (user.user_status === 2) throw new AuthError("ACCOUNT_WERE_DELETED", `Account ${user.email} already deleted`);
4763
4945
  if (!user.authenticate(password)) {
4764
- if (user.facebook_id !== null) throw new _positivegrid_pg_error.ApiErrorCode("USER_OAUTH_LOGIN", "Please use FB to login your account");
4765
- throw new _positivegrid_pg_error.ApiErrorCode("USER_UNAUTHORIZED", "unauthorized");
4946
+ if (user.facebook_id !== null) throw new AuthError("USER_OAUTH_LOGIN", "Please use FB to login your account");
4947
+ throw new AuthError("USER_UNAUTHORIZED", "unauthorized");
4766
4948
  }
4767
4949
  return user;
4768
4950
  },
@@ -4771,14 +4953,14 @@ function buildUser(mongoose) {
4771
4953
  this._async_auth(uname, password).then((user) => cb(null, user), (err) => cb(err));
4772
4954
  },
4773
4955
  login(query, cb) {
4774
- if (!lodash.default.isObject(query)) return cb(/* @__PURE__ */ new Error("Invalid login parameter"));
4956
+ if (typeof query !== "object" || query === null) return cb(/* @__PURE__ */ new Error("Invalid login parameter"));
4775
4957
  this.findOne(query).then((u) => cb(null, u), (err) => cb(err));
4776
4958
  },
4777
4959
  loginForPassport(query, cb) {
4778
- if (!lodash.default.isObject(query)) return cb(/* @__PURE__ */ new Error("Invalid login parameter"));
4960
+ if (typeof query !== "object" || query === null) return cb(/* @__PURE__ */ new Error("Invalid login parameter"));
4779
4961
  const q = query;
4780
- if (lodash.default.has(q, "username")) q.username = String(lodash.default.trim(q.username)).toLowerCase();
4781
- if (lodash.default.has(q, "email")) q.email = String(lodash.default.trim(q.email)).toLowerCase();
4962
+ if (Object.hasOwn(q, "username")) q.username = String(q.username).trim().toLowerCase();
4963
+ if (Object.hasOwn(q, "email")) q.email = String(q.email).trim().toLowerCase();
4782
4964
  this.findOne(q).then((user) => {
4783
4965
  if (!user) return cb({
4784
4966
  status: 404,
@@ -4830,9 +5012,12 @@ function buildUser(mongoose) {
4830
5012
  },
4831
5013
  async getUserDetail(query, projectFields = {}) {
4832
5014
  try {
4833
- if (!lodash.default.isObject(query)) throw new Error("Query need to be object!");
4834
- const queryCondition = lodash.default.assign({}, { user_status: 1 }, query);
4835
- const defaultProjectFields = lodash.default.assign({}, {
5015
+ if (typeof query !== "object" || query === null) throw new Error("Query need to be object!");
5016
+ const queryCondition = {
5017
+ user_status: 1,
5018
+ ...query
5019
+ };
5020
+ const defaultProjectFields = {
4836
5021
  _id: 1,
4837
5022
  email: 1,
4838
5023
  username: 1,
@@ -4840,8 +5025,9 @@ function buildUser(mongoose) {
4840
5025
  last_login: 1,
4841
5026
  "userprofile.first_name": 1,
4842
5027
  "userprofile.last_name": 1,
4843
- "userprofile.full_name": 1
4844
- }, projectFields);
5028
+ "userprofile.full_name": 1,
5029
+ ...projectFields
5030
+ };
4845
5031
  return await this.aggregate([
4846
5032
  { $match: queryCondition },
4847
5033
  { $lookup: {
@@ -4860,8 +5046,11 @@ function buildUser(mongoose) {
4860
5046
  },
4861
5047
  async getDealerDetail(query) {
4862
5048
  try {
4863
- if (!lodash.default.isObject(query)) throw new Error("Query need to be object!");
4864
- const queryCondition = lodash.default.assign({}, { user_status: 1 }, query);
5049
+ if (typeof query !== "object" || query === null) throw new Error("Query need to be object!");
5050
+ const queryCondition = {
5051
+ user_status: 1,
5052
+ ...query
5053
+ };
4865
5054
  return await this.aggregate([
4866
5055
  { $match: queryCondition },
4867
5056
  { $lookup: {
@@ -4983,12 +5172,17 @@ function buildUser(mongoose) {
4983
5172
  UserReferral: mongoose.model("UserReferral", UserReferralSchema),
4984
5173
  UserEmailStatus: mongoose.model("UserEmailStatus", UserEmailStatusSchema),
4985
5174
  UserToken: mongoose.model("UserToken", UserTokenSchema),
4986
- UserFollow: mongoose.model("UserFollow", UserFollowSchema)
5175
+ UserFollow: mongoose.model("UserFollow", UserFollowSchema),
5176
+ UserPoints: mongoose.model("UserPoints", UserPointsSchema),
5177
+ UserRewardHistory: mongoose.model("UserRewardHistory", UserRewardHistorySchema),
5178
+ RewardPointsRedeemList: mongoose.model("RewardPointsRedeemList", RewardPointsRedeemListSchema),
5179
+ UserRedeemRewardPointsRecord: mongoose.model("UserRedeemRewardPointsRecord", UserRedeemRewardPointsRecordSchema),
5180
+ IntermediateUserOrderReward: mongoose.model("IntermediateUserOrderReward", IntermediateUserOrderRewardSchema)
4987
5181
  };
4988
5182
  }
4989
5183
  //#endregion
4990
5184
  //#region src/models/userTrack.ts
4991
- const log$1 = (0, debug.default)("model:usertrack");
5185
+ const log$1 = (0, node_util.debuglog)("model:usertrack");
4992
5186
  const LICENSE_ADDITION = {
4993
5187
  PRO: 0,
4994
5188
  DEMO: 1,
@@ -5094,16 +5288,16 @@ function buildUserTrack(mongoose) {
5094
5288
  const userID = new mongoose.Types.ObjectId(data.userID);
5095
5289
  const startedAt = parseInt(String(data.startedAt), 10);
5096
5290
  if (!mongoose.Types.ObjectId.isValid(userID) || PRODUCTS.indexOf(product) === -1 || Object.keys(LICENSE_ADDITION).indexOf(addition) === -1) throw new Error(`Invalid parameter: ${String(userID)}/${product}/${addition}`);
5097
- else if (!startedAt || !(0, moment.default)(startedAt).isValid()) throw new Error(`Invalid timestamp format: ${startedAt}/${data.updatedAt}`);
5291
+ else if (!startedAt || !(0, date_fns.isValid)(new Date(startedAt))) throw new Error(`Invalid timestamp format: ${startedAt}/${data.updatedAt}`);
5098
5292
  const trackData = {
5099
5293
  user_id: userID,
5100
5294
  product,
5101
5295
  addition: LICENSE_ADDITION[addition],
5102
- started_at: (0, moment.default)(startedAt).toDate()
5296
+ started_at: new Date(startedAt)
5103
5297
  };
5104
- if (lodash.default.has(data, "updatedAt")) {
5298
+ if (Object.hasOwn(data, "updatedAt")) {
5105
5299
  const updatedAt = parseInt(String(data.updatedAt), 10);
5106
- if (updatedAt && (0, moment.default)(updatedAt).isValid()) trackData.updated_at = (0, moment.default)(updatedAt).toDate();
5300
+ if (updatedAt && (0, date_fns.isValid)(new Date(updatedAt))) trackData.updated_at = new Date(updatedAt);
5107
5301
  }
5108
5302
  if (!await this.findOne(trackData).exec()) await this.create(trackData);
5109
5303
  return true;
@@ -5120,7 +5314,7 @@ function buildUserTrack(mongoose) {
5120
5314
  }
5121
5315
  //#endregion
5122
5316
  //#region src/index.ts
5123
- const log = (0, debug.default)("model:init");
5317
+ const log = (0, node_util.debuglog)("model:init");
5124
5318
  const ALL_BUILDERS = [
5125
5319
  buildBanks,
5126
5320
  buildDevice,