GetDataJob.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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: any) => {
  31. if (!query || typeof query !== "object" || Array.isArray(query))
  32. throw new Error("Query must be an object");
  33. if (
  34. !query.filter ||
  35. typeof query.filter !== "object" ||
  36. Array.isArray(query.filter)
  37. )
  38. throw new Error("Query filter must be an object");
  39. if (typeof query.filter.property !== "string")
  40. throw new Error("Query filter property must be a string");
  41. if (
  42. !Object.values(FilterType).find(
  43. value => value === query.filterType
  44. )
  45. )
  46. throw new Error("Invalid Query filter type");
  47. });
  48. if (
  49. !["and", "or", "nor"].find(
  50. value => value === this._payload.operator
  51. )
  52. )
  53. throw new Error("Operator must be one of; and, or, nor");
  54. }
  55. protected async _execute() {
  56. const model = await DataModule.getModel<Model<any> & Partial<GetData>>(
  57. this.getModelName()
  58. );
  59. if (typeof model.getData !== "function")
  60. throw new Error("Get data not available for model");
  61. return model.getData(this._payload);
  62. }
  63. }