GetDataJob.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { Model } from "mongoose";
  2. import DataModule from "../DataModule";
  3. import DataModuleJob from "./DataModuleJob";
  4. import { FilterType, GetData } from "./plugins/getData";
  5. export default abstract class GetDataJob extends DataModuleJob {
  6. protected override async _validate() {
  7. if (typeof this._payload !== "object" || this._payload === null)
  8. throw new Error("Payload must be an object");
  9. if (typeof this._payload.page !== "number")
  10. throw new Error("Page must be a number");
  11. if (typeof this._payload.pageSize !== "number")
  12. throw new Error("Page size must be a number");
  13. if (!Array.isArray(this._payload.properties))
  14. throw new Error("Properties must be an array");
  15. this._payload.properties.forEach((property: unknown) => {
  16. if (typeof property !== "string")
  17. throw new Error("Property must be a string");
  18. });
  19. if (
  20. typeof this._payload.sort !== "object" ||
  21. Array.isArray(this._payload.sort)
  22. )
  23. throw new Error("Sort must be an object");
  24. Object.values(this._payload.sort).forEach(sort => {
  25. if (sort !== "ascending" && sort !== "descending")
  26. throw new Error("Sort must be ascending or descending");
  27. });
  28. if (!Array.isArray(this._payload.queries))
  29. throw new Error("Queries must be an array");
  30. Object.values(this._payload.queries).forEach(query => {
  31. if (typeof query !== "object" || Array.isArray(query))
  32. throw new Error("Query must be an object");
  33. if (typeof query.filter !== "object" || Array.isArray(query.filter))
  34. throw new Error("Query filter must be an object");
  35. if (typeof query.filter?.property !== "string")
  36. throw new Error("Query filter property must be a string");
  37. if (
  38. !Object.values(FilterType).find(
  39. value => value === query.filterType
  40. )
  41. )
  42. throw new Error("Invalid Query filter type");
  43. });
  44. if (
  45. !["and", "or", "nor"].find(
  46. value => value === this._payload.operator
  47. )
  48. )
  49. throw new Error("Operator must be one of; and, or, nor");
  50. }
  51. protected async _execute() {
  52. const model = await DataModule.getModel<Model<any> & Partial<GetData>>(
  53. this.getModelName()
  54. );
  55. if (typeof model.getData !== "function")
  56. throw new Error("Get data not available for model");
  57. return model.getData(this._payload);
  58. }
  59. }