From 1ee67678879c8af6aea20fccd09c391b959f7d4f Mon Sep 17 00:00:00 2001 From: aayushgauba <55630226+aayushgauba@users.noreply.github.com> Date: Mon, 17 Jul 2023 16:37:00 +0530 Subject: [PATCH 1/2] fix:species total counter --- server/infra/database/SpeciesRepository.ts | 29 ++++++++++++++++ server/infra/database/SpeciesRepositoryV2.ts | 33 ++++++++++++++++-- server/models/Species.ts | 17 ++++++++++ server/models/SpeciesV2.ts | 35 ++++++++++++++------ server/routers/speciesRouter.ts | 2 +- server/routers/speciesRouterV2.ts | 10 +++--- 6 files changed, 108 insertions(+), 18 deletions(-) diff --git a/server/infra/database/SpeciesRepository.ts b/server/infra/database/SpeciesRepository.ts index 331341af..ce75b0ce 100644 --- a/server/infra/database/SpeciesRepository.ts +++ b/server/infra/database/SpeciesRepository.ts @@ -40,6 +40,35 @@ export default class SpeciesRepository extends BaseRepository { return object.rows; } + async countByOrganization(organization_id: number) { + const totalSql = ` + SELECT + species_id as id, total, ts.name, ts.desc + FROM + ( + SELECT + ss.species_id, count(ss.species_id) as total + from webmap.species_stat ss + WHERE + ss.planter_id IN ( + SELECT + id + FROM planter p + WHERE + p.organization_id in ( SELECT entity_id from getEntityRelationshipChildren(${organization_id})) + ) + OR + ss.planting_organization_id = ${organization_id} + GROUP BY ss.species_id + ) s_count + JOIN tree_species ts + ON ts.id = s_count.species_id + ORDER BY total DESC + `; + const total = await this.session.getDB().raw(totalSql); + return parseInt(total.rows[0].count.toString()); + } + async getByPlanter(planter_id: number, options: FilterOptions) { const { limit, offset } = options; const sql = ` diff --git a/server/infra/database/SpeciesRepositoryV2.ts b/server/infra/database/SpeciesRepositoryV2.ts index 0dbf7090..b4dcb321 100644 --- a/server/infra/database/SpeciesRepositoryV2.ts +++ b/server/infra/database/SpeciesRepositoryV2.ts @@ -40,7 +40,36 @@ export default class SpeciesRepositoryV2 extends BaseRepository { return object.rows; } -async getByPlanter(planter_id: number, options: FilterOptions) { + async countByOrganization(organization_id: number) { + const totalSql = ` + SELECT + species_id as id, total, ts.name, ts.desc + FROM + ( + SELECT + ss.species_id, count(ss.species_id) as total + from webmap.species_stat ss + WHERE + ss.planter_id IN ( + SELECT + id + FROM planter p + WHERE + p.organization_id in ( SELECT entity_id from getEntityRelationshipChildren(${organization_id})) + ) + OR + ss.planting_organization_id = ${organization_id} + GROUP BY ss.species_id + ) s_count + JOIN tree_species ts + ON ts.id = s_count.species_id + ORDER BY total DESC + `; + const total = await this.session.getDB().raw(totalSql); + return parseInt(total.rows[0].count.toString()); + } + + async getByPlanter(planter_id: number, options: FilterOptions) { const { limit, offset } = options; const sql = ` SELECT @@ -119,4 +148,4 @@ async getByPlanter(planter_id: number, options: FilterOptions) { const object = await this.session.getDB().raw(sql); return object.rows; } -} \ No newline at end of file +} diff --git a/server/models/Species.ts b/server/models/Species.ts index cb73ae83..195465fd 100644 --- a/server/models/Species.ts +++ b/server/models/Species.ts @@ -45,7 +45,24 @@ function getByFilter( }; } +function countByFilter( + speciesRepository: SpeciesRepository, +): (filter: Filter) => Promise { + return async function (filter: Filter) { + if (filter.organization_id) { + log.warn('using org filter...'); + const total = await speciesRepository.countByOrganization( + filter.organization_id, + ); + return total; + } + const total = await speciesRepository.countByFilter(filter); + return total; + }; +} + export default { getById: delegateRepository('getById'), getByFilter, + countByFilter, }; diff --git a/server/models/SpeciesV2.ts b/server/models/SpeciesV2.ts index 45dfc7b2..4ec0a13b 100644 --- a/server/models/SpeciesV2.ts +++ b/server/models/SpeciesV2.ts @@ -8,7 +8,7 @@ type Filter = Partial<{ planter_id: number; organization_id: number; wallet_id: string; - grower_id:string; + grower_id: string; }>; function getByFilter( @@ -41,21 +41,36 @@ function getByFilter( return trees; } if (filter.grower_id) { - log.warn('using grower filter...'); - const trees = await speciesRepository.getByGrower( - filter.grower_id, - options, - ); - return trees; - } + log.warn('using grower filter...'); + const trees = await speciesRepository.getByGrower( + filter.grower_id, + options, + ); + return trees; + } const trees = await speciesRepository.getByFilter(filter, options); return trees; }; } - +function countByFilter( + speciesRepository: SpeciesRepositoryV2, +): (filter: Filter) => Promise { + return async function (filter: Filter) { + if (filter.organization_id) { + log.warn('using org filter...'); + const total = await speciesRepository.countByOrganization( + filter.organization_id, + ); + return total; + } + const total = await speciesRepository.countByFilter(filter); + return total; + }; +} export default { getById: delegateRepository('getById'), - getByGrower:delegateRepository('getByGrower'), + getByGrower: delegateRepository('getByGrower'), getByFilter, + countByFilter, }; diff --git a/server/routers/speciesRouter.ts b/server/routers/speciesRouter.ts index 4c66a131..5682785b 100644 --- a/server/routers/speciesRouter.ts +++ b/server/routers/speciesRouter.ts @@ -61,7 +61,7 @@ router.get( }); log.warn('species filter:', filter, 'took time:', Date.now() - begin, 'ms'); res.send({ - total: null, + total: await SpeciesModel.countByFilter(repo)(filter), offset, limit, species: result, diff --git a/server/routers/speciesRouterV2.ts b/server/routers/speciesRouterV2.ts index faa2ea6d..3ee160a0 100644 --- a/server/routers/speciesRouterV2.ts +++ b/server/routers/speciesRouterV2.ts @@ -34,7 +34,7 @@ router.get( Joi.object().keys({ organization_id: Joi.number().integer().min(0), planter_id: Joi.number().integer().min(0), - grower_id:Joi.string().guid(), + grower_id: Joi.string().guid(), wallet_id: Joi.string(), limit: Joi.number().integer().min(1).max(1000), offset: Joi.number().integer().min(0), @@ -56,9 +56,9 @@ router.get( filter.planter_id = planter_id; } else if (wallet_id) { filter.wallet_id = wallet_id; - } else if(grower_id){ - filter.grower_id = grower_id; - } + } else if (grower_id) { + filter.grower_id = grower_id; + } const begin = Date.now(); const result = await SpeciesModel.getByFilter(repo)(filter, { limit, @@ -66,7 +66,7 @@ router.get( }); log.warn('species filter:', filter, 'took time:', Date.now() - begin, 'ms'); res.send({ - total: null, + total: await SpeciesModel.countByFilter(repo)(filter), offset, limit, species: result, From 50432797232dfe4782b78912839dba85266bb79d Mon Sep 17 00:00:00 2001 From: aayushgauba <55630226+aayushgauba@users.noreply.github.com> Date: Mon, 17 Jul 2023 17:02:39 +0530 Subject: [PATCH 2/2] fix:organization total counter --- server/models/Organization.ts | 10 ++++++++++ server/models/OrganizationV2.ts | 10 +++++++++- server/routers/organizationsRouter.ts | 2 +- server/routers/organizationsRouterV2.ts | 2 +- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/server/models/Organization.ts b/server/models/Organization.ts index d011c297..f13d89cb 100644 --- a/server/models/Organization.ts +++ b/server/models/Organization.ts @@ -33,6 +33,15 @@ function getOrganizationLinks(organization) { return links; } +function countByFilter( + organizationRepository: OrganizationRepository, +): (filter: Filter) => Promise { + return async function (filter: Filter) { + const total = await organizationRepository.countByFilter(filter); + return total; + }; +} + export default { getById: delegateRepository('getById'), getByMapName: delegateRepository( @@ -40,6 +49,7 @@ export default { ), getByFilter, getOrganizationLinks, + countByFilter, getFeaturedOrganizations: delegateRepository< OrganizationRepository, Organization diff --git a/server/models/OrganizationV2.ts b/server/models/OrganizationV2.ts index c3ab7cef..3d5ecdbb 100644 --- a/server/models/OrganizationV2.ts +++ b/server/models/OrganizationV2.ts @@ -39,13 +39,21 @@ function getOrganizationLinks(organization) { }; return links; } - +function countByFilter( + organizationRepository: OrganizationRepositoryV2, +): (filter: Filter) => Promise { + return async function (filter: Filter) { + const total = await organizationRepository.countByFilter(filter); + return total; + }; +} export default { getById: delegateRepository('getById'), getByMapName: delegateRepository( 'getByMapName', ), getByFilter, + countByFilter, getOrganizationLinks, getFeaturedOrganizations: delegateRepository< OrganizationRepositoryV2, diff --git a/server/routers/organizationsRouter.ts b/server/routers/organizationsRouter.ts index a20eb608..b05fa4c5 100644 --- a/server/routers/organizationsRouter.ts +++ b/server/routers/organizationsRouter.ts @@ -66,7 +66,7 @@ router.get( offset, }); res.send({ - total: null, + total: await OrganizationModel.countByFilter(repo)(filter), offset, limit, organizations: result.map((organization) => ({ diff --git a/server/routers/organizationsRouterV2.ts b/server/routers/organizationsRouterV2.ts index dd7cd955..b616d154 100644 --- a/server/routers/organizationsRouterV2.ts +++ b/server/routers/organizationsRouterV2.ts @@ -69,7 +69,7 @@ router.get( offset, }); res.send({ - total: null, + total: await OrganizationModel.countByFilter(repo)(filter), offset, limit, organizations: result.map((organization) => ({