From be5471f958e13c19a99ac689a22d1afb8d5e16ef Mon Sep 17 00:00:00 2001 From: Niklas Fondberg Date: Wed, 16 Feb 2022 16:20:35 +0100 Subject: [PATCH] Add pagination to orders and products (#106) * Add pagination to orders and products * remove comment Co-authored-by: Anders Gustafsson --- docker-compose-prodlike.yml | 10 ++++++++++ src/datasources/order-api.ts | 11 ++++++----- src/datasources/product-api.ts | 3 +-- src/datasources/sql/products-sql.ts | 3 ++- src/resolvers/orders-resolver.ts | 3 ++- src/resolvers/products-resolver.ts | 4 ++-- src/schema.graphql | 3 --- 7 files changed, 23 insertions(+), 14 deletions(-) diff --git a/docker-compose-prodlike.yml b/docker-compose-prodlike.yml index 0383913..a8da5b3 100644 --- a/docker-compose-prodlike.yml +++ b/docker-compose-prodlike.yml @@ -10,8 +10,18 @@ services: ports: - '4000:4000' environment: + - ENVIRONMENT_NAME=${ENVIRONMENT_NAME} - COGNITO_POOL_ID=eu-west-1_3O4VfvPn7 - DATABASE_URL=${DATABASE_URL} + - INTERIORS_TOKEN=${INTERIORS_TOKEN} + - INTERIORS_URL=${INTERIORS_URL} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} + - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} + - NODE_ENV=development + - BERNARD_QUEUE_URL=${BERNARD_QUEUE_URL} + - NEW_RELIC_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY} + - NEW_RELIC_APP_NAME=${NEW_RELIC_APP_NAME} networks: default: diff --git a/src/datasources/order-api.ts b/src/datasources/order-api.ts index 1fcb4c7..cd547ba 100644 --- a/src/datasources/order-api.ts +++ b/src/datasources/order-api.ts @@ -29,19 +29,20 @@ export class OrderAPI extends BaseSQLDataSource { : null; } - async getOrdersTotal(input: Maybe): Promise { + async getOrdersTotal(input: GeneralInput): Promise { const res = await this.getOrdersQuery(input) .clone() .count() .first() - .cache(MINUTE * 60); + .cache(MINUTE * 5); return res['count'] as number; // Optimize later to return Promise } - async getOrders(input: Maybe): Promise> { - let query = this.getOrdersQuery(input).limit(input?.pagination.limit); + async getOrders(input: GeneralInput): Promise> { + const offset = input.pagination.offset ?? 0; + const limit = input.pagination.limit ?? 100; + let query = this.getOrdersQuery(input).limit(limit).offset(offset); - // TODO: handle offset query = query.orderBy('inserted', 'ASC'); return query.cache(MINUTE); } diff --git a/src/datasources/product-api.ts b/src/datasources/product-api.ts index e8e079f..9c32bde 100644 --- a/src/datasources/product-api.ts +++ b/src/datasources/product-api.ts @@ -168,13 +168,12 @@ export class ProductAPI extends BaseSQLDataSource { async getProductsTotal(input: ProductsFilterInput): Promise { const query = sql.productsTotal(input); const res = await this.cachedRaw(query) - .cache(MINUTE * 60) + .cache(MINUTE * 5) .then((data) => data.rows); return res[0]['count'] as number; // Optimize later to return Promise } async getProducts(input: ProductsFilterInput): Promise> { - // TODO: handle offset const query = sql.products(input); return this.knex diff --git a/src/datasources/sql/products-sql.ts b/src/datasources/sql/products-sql.ts index e120d2e..e16b87b 100644 --- a/src/datasources/sql/products-sql.ts +++ b/src/datasources/sql/products-sql.ts @@ -77,6 +77,7 @@ FROM "product-products" products export function products(input: ProductsFilterInput) { const limit = input.pagination.limit ?? 100; + const offset = input.pagination.offset ?? 0; const filter = input.filter ?? null; return ( baseQuery + @@ -89,7 +90,7 @@ export function products(input: ProductsFilterInput) { : `` } ORDER BY products.inserted DESC -LIMIT ${limit} +LIMIT ${limit} OFFSET ${offset} ` ); } diff --git a/src/resolvers/orders-resolver.ts b/src/resolvers/orders-resolver.ts index 2e4c8bb..b28987a 100644 --- a/src/resolvers/orders-resolver.ts +++ b/src/resolvers/orders-resolver.ts @@ -41,12 +41,13 @@ async function getOrdersResult( checkAccess(['orders.read'], auth); const total = (dataSources.orderApi).getOrdersTotal(input); const items = (dataSources.orderApi).getOrders(input); + const offset = input.pagination?.offset ?? 0; return { items: items, pagination: { total: total, limit: input.pagination.limit, - offset: 0, // TODO: this will be implemented later if the client app needs it + offset: offset, }, }; } diff --git a/src/resolvers/products-resolver.ts b/src/resolvers/products-resolver.ts index 56dbf58..aabb419 100644 --- a/src/resolvers/products-resolver.ts +++ b/src/resolvers/products-resolver.ts @@ -68,11 +68,11 @@ async function getProductsResult( checkAccess(['products.read'], auth); const total = (dataSources.productApi).getProductsTotal(input); const items = (dataSources.productApi).getProducts(input); - + const offset = input.pagination?.offset ?? 0; return { pagination: { limit: input.pagination.limit, - offset: 0, // TODO: this will be implemented later if the client app needs it + offset: offset, total: total, }, items: items, diff --git a/src/schema.graphql b/src/schema.graphql index 8934a45..ee53a57 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -58,9 +58,6 @@ input SignedUploadURLInput { input PaginationInput { limit: Int! - """ - offset is not implemented yet and result will always return as if it was 0. Implement when needed. - """ offset: Int }