diff --git a/src/adverts/repository/fs/fs-adverts-repository.ts b/src/adverts/repository/fs/fs-adverts-repository.ts index 0fb205a..5d776d3 100644 --- a/src/adverts/repository/fs/fs-adverts-repository.ts +++ b/src/adverts/repository/fs/fs-adverts-repository.ts @@ -169,10 +169,19 @@ export const createFsAdvertsRepository = ( return null } - const countBy: AdvertsRepository['countBy'] = async (user, by) => + const countBy: AdvertsRepository['countBy'] = async ( + user, + by, + excludeArchived + ) => list(user).then(advertList => mapValues( - toLookup(advertList.adverts, advert => advert[by]), + toLookup( + advertList.adverts.filter(a => + excludeArchived ? !a.archivedAt : true + ), + advert => advert[by] + ), l => l.length ) ) diff --git a/src/adverts/repository/memory/index.ts b/src/adverts/repository/memory/index.ts index f712231..f09b219 100644 --- a/src/adverts/repository/memory/index.ts +++ b/src/adverts/repository/memory/index.ts @@ -54,9 +54,12 @@ export const createInMemoryAdvertsRepository = ( } return null }, - countBy: async (user, by) => + countBy: async (user, by, excludeArchived) => Object.values(db).reduce>((s, advert) => { const v = (advert[by] || '').toString() + if (excludeArchived && advert.archivedAt) { + return s + } // eslint-disable-next-line no-param-reassign s[v] = (s[v] || 0) + 1 return s diff --git a/src/adverts/repository/mongo/mongo-db-adverts-repository.ts b/src/adverts/repository/mongo/mongo-db-adverts-repository.ts index 01987ca..5dae078 100644 --- a/src/adverts/repository/mongo/mongo-db-adverts-repository.ts +++ b/src/adverts/repository/mongo/mongo-db-adverts-repository.ts @@ -124,21 +124,34 @@ export const createMongoAdvertsRepository = ( return result.modifiedCount > 0 ? advert : null } - const countBy: AdvertsRepository['countBy'] = async (user, by) => { + const countBy: AdvertsRepository['countBy'] = async ( + user, + by, + excludeArchived + ) => { // https://www.mongodb.com/docs/manual/reference/operator/aggregation/count-accumulator/#use-in--group-stage const collection = await getCollection() - const cursor = collection.aggregate<{ _id: string; c: number }>([ - { - $group: { - _id: `$advert.${by}`, - c: { - // NOTE: $count operator doesnt work on Mongo 4.*. $sum: 1 i equivalent - // https://www.mongodb.com/docs/manual/reference/operator/aggregation/count-accumulator/#mongodb-group-grp.-count - $sum: 1, + const cursor = collection.aggregate<{ _id: string; c: number }>( + [ + excludeArchived + ? { + $match: { 'meta.archived': { $ne: true } }, + } + : null, + { + $group: { + _id: `$advert.${by}`, + c: { + // NOTE: $count operator doesnt work on Mongo 4.*. $sum: 1 i equivalent + // https://www.mongodb.com/docs/manual/reference/operator/aggregation/count-accumulator/#mongodb-group-grp.-count + $sum: 1, + }, }, }, - }, - ]) + ] + .filter(v => v) + .map(v => v!) + ) const rows = await cursor.toArray() return toMap( rows, diff --git a/src/adverts/types.ts b/src/adverts/types.ts index cc606e9..9c41149 100644 --- a/src/adverts/types.ts +++ b/src/adverts/types.ts @@ -243,7 +243,8 @@ export interface AdvertsRepository { // return count of adverts per value of selected property countBy: ( user: HaffaUser, - by: keyof Only + by: keyof Only, + excludeArchived?: boolean // by: keyof Extract ) => Promise> getAdvertsByClaimStatus: (filter: AdvertsClaimFilter) => Promise diff --git a/src/categories/categories-gql-module.ts b/src/categories/categories-gql-module.ts index 0f5dbb7..32a1337 100644 --- a/src/categories/categories-gql-module.ts +++ b/src/categories/categories-gql-module.ts @@ -19,6 +19,13 @@ export const createCategoriesGqlModule = ({ ) return summary[source.id] || 0 }, + unarchivedAdvertCount: async ({ source, ctx, cache }) => { + const summary = await cache.getOrCreateCachedValue( + 'unarchived-adverts-category-summary', + () => adverts.countBy(ctx.user, 'category', true) + ) + return summary[source.id] || 0 + }, }, Query: { // https://www.graphql-tools.com/docs/resolvers diff --git a/src/categories/categories.gql.schema.ts b/src/categories/categories.gql.schema.ts index 1da143d..288a7a6 100644 --- a/src/categories/categories.gql.schema.ts +++ b/src/categories/categories.gql.schema.ts @@ -14,6 +14,7 @@ export const categoriesGqlSchema = /* GraphQL */ ` co2kg: Int valueByUnit: Int advertCount: Int! + unarchivedAdvertCount: Int! } input CategoryInput {