Query Engine vs Entity Service vs Rest API

System Information
  • Strapi Version: 4.16.0

On the documentation, Strapi recommend to use Query Engine to interfact with the database, but, I don’t really like because there is no easy solution to manage pagination…
And also, the transformResponse function add attributes to the strucutre and I don’t understand why ? It complicates the structure

So, I made a few examples to test the different solution and to have your opinion :slight_smile:

async find(ctx) {
    const page = parseInt(ctx.query.page) || 1;
    const pageSize = parseInt(ctx.query.pageSize) || 2;
    const filters = ctx.query.filters;
    const populate = ctx.query.populate || populateActivity;

    /***** Default Override function ******/
    await this.validateQuery(ctx);
    const sanitizedQueryParams = await this.sanitizeQuery(ctx);
    const { results: resultsTs, pagination: paginationTs } = await strapi
      .service("api::activity.activity")
      .find(sanitizedQueryParams);
    const sanitizedResults = await this.sanitizeOutput(resultsTs, ctx);
//the transformResponse function add data.attributes..... Why ?
    return this.transformResponse(sanitizedResults, { paginationTs });
    /*-----------------------------------------*/

    /***** REST Api ? With Pagination *****/
    const { results, pagination } = await strapi.service("api::activity.activity").find({
      populate: populate,
      pagination: {
        page: page,
        pageSize: pageSize,
      },
      filters: filters,
    });

    const activitiesMetaApi = {
      data: results,
      meta: pagination,
    };
    return activitiesMetaApi;
    /*-----------------------------------------*/

    /***** Entity Services -> no pagination ?! *****/
    const activitiesEntity = await strapi.entityService.findMany("api::activity.activity", {
      sort: "id",
    });

    return activitiesEntity;

    /*-----------------------------------------*/

    /***** Query Engine Api With Pagination *****/
    const [activities, count] = await strapi.db.query("api::activity.activity").findWithCount({
      offset: (page - 1) * pageSize,
      limit: pageSize,
      populate: populate,
      filters: filters,
    });
    const pageCount = Math.ceil(count / pageSize);
    const meta = {
      pagination: {
        page: page,
        pageSize: pageSize,
        pageCount: pageCount,
        total: count,
      },
    };
    const activitiesMeta = {
      data: activities,
      meta: meta,
    };
    return activitiesMeta;
    /*-----------------------------------------*/
  },