From 272ec9740ed07b703646d9846f70bc4be3313af6 Mon Sep 17 00:00:00 2001 From: Gwynn Dandridge-Perry Date: Fri, 21 Apr 2023 12:15:49 -0700 Subject: [PATCH] feat: update contract query result format --- server/infra/database/ContractRepository.ts | 65 ++++++++++----------- server/interfaces/ContractFilter.ts | 11 ---- server/routers/contractsRouter.ts | 60 +++++-------------- 3 files changed, 46 insertions(+), 90 deletions(-) diff --git a/server/infra/database/ContractRepository.ts b/server/infra/database/ContractRepository.ts index 649a4c25..65fac814 100644 --- a/server/infra/database/ContractRepository.ts +++ b/server/infra/database/ContractRepository.ts @@ -27,7 +27,7 @@ export default class ContractRepository extends BaseRepository { } delete parameters.tokenized; - // result.whereNot(`${this.tableName}.status`, 'deleted'); + result.whereNot(`${this.tableName}.status`, 'deleted'); whereNotNulls.forEach((whereNot) => { // to map table names to fields for query @@ -38,8 +38,6 @@ export default class ContractRepository extends BaseRepository { default: result.whereNotNull(whereNot); } - - // result.whereNotNull(whereNot); }); whereNulls.forEach((whereNull) => { @@ -51,7 +49,6 @@ export default class ContractRepository extends BaseRepository { default: result.whereNull(whereNull); } - // result.whereNull(whereNull); }); whereIns.forEach((whereIn) => { @@ -73,25 +70,11 @@ export default class ContractRepository extends BaseRepository { delete filterObject.endDate; } - // if (filterObject.tag_id) { - // filterObject[`treetracker.capture_tag.tag_id`] = filterObject.tag_id; - // delete filterObject.tag_id; - // } - if (filterObject.id) { result.where(`${this.tableName}.id`, '=', filterObject.id); delete filterObject.id; } - // if (filterObject.reference_id) { - // result.where( - // `${this.tableName}.reference_id`, - // '=', - // filterObject.reference_id, - // ); - // delete filterObject.reference_id; - // } - if (filterObject.organization_id) { result.where(`${this.tableName}.growing_organization_id`, 'in', [ ...filterObject.organization_id, @@ -106,30 +89,35 @@ export default class ContractRepository extends BaseRepository { const knex = this.session.getDB(); const { sort, ...filter } = filterCriteria; - // there are two joins to connect the capture to the token and to the wallet right now so that we can double check our data entries - // the current data entered in the tables doesn't match up so there are some mismatches let promise = knex .select( knex.raw( ` - row_to_json(contract.*) AS contract, + ${this.tableName}.id, + ${this.tableName}.status, + ${this.tableName}.notes, + ${this.tableName}.created_at, + ${this.tableName}.updated_at, + ${this.tableName}.signed_at, + ${this.tableName}.closed_at, + ${this.tableName}.listed, row_to_json(agreement.*) AS agreement, row_to_json(grower_account.*) AS worker, row_to_json(stakeholder.*) AS stakeholder - FROM contracts.contract AS contract + FROM ${this.tableName} LEFT JOIN contracts.agreement AS agreement - ON agreement.id = contract.agreement_id + ON agreement.id = ${this.tableName}.agreement_id LEFT JOIN stakeholder.stakeholder AS stakeholder ON stakeholder.id = agreement.growing_organization_id LEFT JOIN treetracker.grower_account AS grower_account - ON grower_account.id = contract.worker_id + ON grower_account.id = ${this.tableName}.worker_id `, ), ) .where((builder) => this.filterWhereBuilder(filter, builder)); promise = promise.orderBy( - sort?.order_by || `${this.tableName}.id`, + `${this.tableName}.${sort?.order_by}` || `${this.tableName}.id`, sort?.order || 'desc', ); @@ -154,13 +142,13 @@ export default class ContractRepository extends BaseRepository { .select( knex.raw( `COUNT(*) AS count - FROM contracts.contract AS contract + FROM ${this.tableName} LEFT JOIN contracts.agreement AS agreement - ON agreement.id = contract.agreement_id + ON agreement.id = ${this.tableName}.agreement_id LEFT JOIN stakeholder.stakeholder AS stakeholder ON stakeholder.id = agreement.growing_organization_id LEFT JOIN treetracker.grower_account AS grower_account - ON grower_account.id = contract.worker_id + ON grower_account.id = ${this.tableName}.worker_id `, ), ) @@ -174,17 +162,24 @@ export default class ContractRepository extends BaseRepository { .getDB() .select( this.session.getDB().raw(` - contract.*, - agreement.*, - grower_account.*, - stakeholder.* - FROM contracts.contract AS contract + ${this.tableName}.id, + ${this.tableName}.status, + ${this.tableName}.notes, + ${this.tableName}.created_at, + ${this.tableName}.updated_at, + ${this.tableName}.signed_at, + ${this.tableName}.closed_at, + ${this.tableName}.listed, + row_to_json(agreement.*) AS agreement, + row_to_json(grower_account.*) AS worker, + row_to_json(stakeholder.*) AS stakeholder + FROM ${this.tableName} LEFT JOIN contracts.agreement AS agreement - ON agreement.id = contract.agreement_id + ON agreement.id = ${this.tableName}.agreement_id LEFT JOIN stakeholder.stakeholder AS stakeholder ON stakeholder.id = agreement.growing_organization_id LEFT JOIN treetracker.grower_account AS grower_account - ON grower_account.id = contract.worker_id + ON grower_account.id = ${this.tableName}.worker_id `), ) .where(`${this.tableName}.id`, id) diff --git a/server/interfaces/ContractFilter.ts b/server/interfaces/ContractFilter.ts index 29bdfbe5..e2ae7b63 100644 --- a/server/interfaces/ContractFilter.ts +++ b/server/interfaces/ContractFilter.ts @@ -1,17 +1,6 @@ import DbModel from './DbModel'; interface ContractFilter extends DbModel { - // organization_id?: Array | undefined; - // grower_account_id?: string | undefined; - // id?: string | undefined; - // tree_id?: string | undefined; - // species_id?: string | undefined; - // tag?: string | undefined; - // device_identifier?: string | undefined; - // wallet?: string | undefined; - // token_id?: string | undefined; - // tokenized?: string | undefined; - id?: number | undefined; agreement_id?: number | undefined; worker_id?: number | undefined; diff --git a/server/routers/contractsRouter.ts b/server/routers/contractsRouter.ts index 64bcb1d2..a9cd21e2 100644 --- a/server/routers/contractsRouter.ts +++ b/server/routers/contractsRouter.ts @@ -12,34 +12,20 @@ router.get( handlerWrapper(async (req, res) => { const query = queryFormatter(req); - // verify filter values Joi.assert( query, Joi.object().keys({ - // capture filters - grower_account_id: Joi.string().uuid(), - // grower_account_id: Joi.string().uuid(), - organization_id: Joi.array(), - limit: Joi.number().integer().min(1).max(20000), - offset: Joi.number().integer().min(0), - startDate: Joi.string().regex(/^\d{4}-\d{2}-\d{2}$/), - endDate: Joi.string().regex(/^\d{4}-\d{2}-\d{2}$/), + // contract table filters id: Joi.string().uuid(), - // reference_id: Joi.string(), - // tree_id: Joi.string().uuid(), - // species_id: Joi.string().uuid(), - // tag_id: Joi.string().uuid(), - // device_identifier: Joi.string(), - wallet: Joi.string(), - // tokenized: Joi.string(), - // order_by: Joi.string(), - // order: Joi.string(), - token_id: Joi.string().uuid(), - // contract filters agreement_id: Joi.string().uuid(), worker_id: Joi.string().uuid(), // grower_account_id? listed: Joi.boolean(), - + // organization_id: Joi.array(), + startDate: Joi.string().regex(/^\d{4}-\d{2}-\d{2}$/), + endDate: Joi.string().regex(/^\d{4}-\d{2}-\d{2}$/), + // defaults + limit: Joi.number().integer().min(1).max(20000), + offset: Joi.number().integer().min(0), whereNulls: Joi.array(), whereNotNulls: Joi.array(), whereIns: Joi.array(), @@ -72,35 +58,21 @@ router.get( '/', handlerWrapper(async (req, res) => { const query = queryFormatter(req); - console.log('************************* /contract'); - // verify filter values Joi.assert( query, Joi.object().keys({ - // capture filters - // grower_account_id: Joi.string().uuid(), - organization_id: Joi.array(), - limit: Joi.number().integer().min(1).max(20000), - offset: Joi.number().integer().min(0), - startDate: Joi.string().regex(/^\d{4}-\d{2}-\d{2}$/), - endDate: Joi.string().regex(/^\d{4}-\d{2}-\d{2}$/), + // contract table filters id: Joi.string().uuid(), - // reference_id: Joi.string(), - // tree_id: Joi.string().uuid(), - // species_id: Joi.string().uuid(), - // tag_id: Joi.string().uuid(), - // device_identifier: Joi.string(), - wallet: Joi.string(), - // tokenized: Joi.string(), - // order_by: Joi.string(), - // order: Joi.string(), - token_id: Joi.string().uuid(), - // contract filters agreement_id: Joi.string().uuid(), worker_id: Joi.string().uuid(), // grower_account_id? listed: Joi.boolean(), - + // organization_id: Joi.array(), + startDate: Joi.string().regex(/^\d{4}-\d{2}-\d{2}$/), + endDate: Joi.string().regex(/^\d{4}-\d{2}-\d{2}$/), + // defaults + limit: Joi.number().integer().min(1).max(20000), + offset: Joi.number().integer().min(0), whereNulls: Joi.array(), whereNotNulls: Joi.array(), whereIns: Joi.array(), @@ -110,7 +82,7 @@ router.get( limit = 25, offset = 0, order = 'desc', - order_by = 'contract.id', + order_by = 'id', ...rest } = query; @@ -120,7 +92,7 @@ router.get( const result = await exe({ ...rest, sort }, { limit, offset }); const count = await ContractModel.getCount(repo)({ ...rest }); res.send({ - Contracts: result, + contracts: result, total: Number(count), offset, limit,