Query.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import type { Query as PiniaOrmQuery } from 'pinia-orm'
  2. import type { ApiFilter } from '~/types/data'
  3. import type ApiResource from '~/models/ApiResource'
  4. /**
  5. * A Query to filter and sort ApiResources.
  6. * Pass it to the `fetchCollection` method of the EntityManager to apply these filters to both
  7. * API fetch and PiniaOrm query, which allow to maintain this collection reactivity.
  8. */
  9. export default class Query {
  10. protected filters: Array<ApiFilter> = []
  11. constructor(...filters: Array<ApiFilter>) {
  12. this.filters = filters
  13. }
  14. /**
  15. * Add an ApiFilter to the query
  16. *
  17. * @param filter
  18. */
  19. public add(filter: ApiFilter): this {
  20. this.filters.push(filter)
  21. return this
  22. }
  23. /**
  24. * Returns the URL's query in the Api Platform format.
  25. *
  26. * @see https://api-platform.com/docs/core/filters/
  27. */
  28. public getUrlQuery(): string {
  29. const queryParts: string[] = []
  30. this.filters.forEach((filter) => {
  31. const queryPart = filter.getApiQueryPart()
  32. queryParts.push(queryPart)
  33. })
  34. // console.log(queryParts)
  35. return queryParts.join('&')
  36. }
  37. /**
  38. * Apply this query to the pinia orm query and return it.
  39. *
  40. * @see https://pinia-orm.codedredd.de/guide/repository/retrieving-data
  41. * @param query
  42. */
  43. public applyToPiniaOrmQuery(
  44. query: PiniaOrmQuery<ApiResource>,
  45. ): PiniaOrmQuery<ApiResource> {
  46. this.filters.forEach((filter) => {
  47. query = filter.applyToPiniaOrmQuery(query)
  48. })
  49. // console.log(query)
  50. return query
  51. }
  52. }