From 3747414c3cb574f2a5c9708798a7aed43158ab2a Mon Sep 17 00:00:00 2001 From: humsika Date: Tue, 22 Sep 2026 22:55:20 -0500 Subject: [PATCH 1/4] [BI-2922] BI-2922: Modified the existing Max Page count to be 65000 instead of the current 100000 which exceeds the backend limit. Also updated the lookup logic. --- src/breeding-insight/dao/StudyDAO.ts | 53 ++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/src/breeding-insight/dao/StudyDAO.ts b/src/breeding-insight/dao/StudyDAO.ts index 69ebdccf..3711580a 100644 --- a/src/breeding-insight/dao/StudyDAO.ts +++ b/src/breeding-insight/dao/StudyDAO.ts @@ -23,29 +23,52 @@ import {BrAPIDAOUtil} from "@/breeding-insight/dao/BrAPIDAOUtil"; export class StudyDAO { + private static readonly MAX_BRAPI_PAGE_SIZE = 65000; + + private static async getAllPages(programId: string, params: any): Promise { + let page = 0; + let totalPages = 1; + let responseData: any; + let studies: any[] = []; + + do { + const { data } = await api.call({ + url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/brapi/v2/studies`, + method: 'get', + params: { + ...params, + page, + pageSize: StudyDAO.MAX_BRAPI_PAGE_SIZE + } + }) as Response; + + responseData = data; + studies = studies.concat(data.result.data); + totalPages = data.metadata.pagination.totalPages; + page++; + } while (page < totalPages); + + responseData.result.data = studies; + responseData.metadata.pagination.currentPage = 0; + responseData.metadata.pagination.pageSize = studies.length; + responseData.metadata.pagination.totalCount = studies.length; + responseData.metadata.pagination.totalPages = studies.length === 0 ? 0 : 1; + + return new BiResponse(responseData); + } + static async getAllForTrial(programId: string, trialDbId: string): Promise> { // Use GET endpoint to get all Studies for a single Trial by external reference. - const { data } = await api.call({ - url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/brapi/v2/studies`, - method: 'get', - params: { - trialDbId: trialDbId, - pageSize: 1000000 } - }) as Response; + const response = await StudyDAO.getAllPages(programId, { trialDbId }); - return ResultGenerator.success(new BiResponse(data)); + return ResultGenerator.success(response); } static async getAll(programId: string, paginationQuery: PaginationQuery, full : boolean): Promise> { try { - // TODO: update pageSize setting when we can do backend brapi sorting - const { data } = await api.call({ - url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/brapi/v2/studies`, - method: 'get', - params: { full, pageSize: 1000000 } - }) as Response; + const response = await StudyDAO.getAllPages(programId, { full }); - return ResultGenerator.success(new BiResponse(data)); + return ResultGenerator.success(response); } catch (error) { return ResultGenerator.err(error); From b682fa88b5dd3a119cae584c1b022aafc4a7077c Mon Sep 17 00:00:00 2001 From: humsika Date: Sun, 27 Sep 2026 20:32:03 -0500 Subject: [PATCH 2/4] [BI-2922] BI-2922: Updated the code on the BI Web to be lookup only 65k records and removed the additional logic. --- src/breeding-insight/dao/StudyDAO.ts | 99 +++++++++++----------------- 1 file changed, 39 insertions(+), 60 deletions(-) diff --git a/src/breeding-insight/dao/StudyDAO.ts b/src/breeding-insight/dao/StudyDAO.ts index 3711580a..32430f0e 100644 --- a/src/breeding-insight/dao/StudyDAO.ts +++ b/src/breeding-insight/dao/StudyDAO.ts @@ -18,75 +18,54 @@ import {BiResponse, Response} from "@/breeding-insight/model/BiResponse"; import * as api from "@/util/api"; import {PaginationQuery} from "@/breeding-insight/model/PaginationQuery"; -import { Result, Err, Success, ResultGenerator } from "@/breeding-insight/model/Result"; -import {BrAPIDAOUtil} from "@/breeding-insight/dao/BrAPIDAOUtil"; +import {Result, Err, Success, ResultGenerator} from "@/breeding-insight/model/Result"; export class StudyDAO { - private static readonly MAX_BRAPI_PAGE_SIZE = 65000; + static async getAllForTrial(programId: string, trialDbId: string): Promise> { + // Use GET endpoint to get all Studies for a single Trial by external reference. + const {data} = await api.call({ + url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/brapi/v2/studies`, + method: 'get', + params: { + trialDbId: trialDbId, + pageSize: 65000 + } + }) as Response; - private static async getAllPages(programId: string, params: any): Promise { - let page = 0; - let totalPages = 1; - let responseData: any; - let studies: any[] = []; - - do { - const { data } = await api.call({ - url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/brapi/v2/studies`, - method: 'get', - params: { - ...params, - page, - pageSize: StudyDAO.MAX_BRAPI_PAGE_SIZE - } - }) as Response; - - responseData = data; - studies = studies.concat(data.result.data); - totalPages = data.metadata.pagination.totalPages; - page++; - } while (page < totalPages); - - responseData.result.data = studies; - responseData.metadata.pagination.currentPage = 0; - responseData.metadata.pagination.pageSize = studies.length; - responseData.metadata.pagination.totalCount = studies.length; - responseData.metadata.pagination.totalPages = studies.length === 0 ? 0 : 1; - - return new BiResponse(responseData); - } + return ResultGenerator.success(new BiResponse(data)); + } - static async getAllForTrial(programId: string, trialDbId: string): Promise> { - // Use GET endpoint to get all Studies for a single Trial by external reference. - const response = await StudyDAO.getAllPages(programId, { trialDbId }); + static async getAll(programId: string, paginationQuery: PaginationQuery, full: boolean): Promise> { + try { + const {data} = await api.call({ + url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/brapi/v2/studies`, + method: 'get', + params: { + full, + pageSize: 65000 + } + }) as Response; - return ResultGenerator.success(response); - } + return ResultGenerator.success(new BiResponse(data)); - static async getAll(programId: string, paginationQuery: PaginationQuery, full : boolean): Promise> { - try { - const response = await StudyDAO.getAllPages(programId, { full }); + } catch (error) { + return ResultGenerator.err(error); + } + } - return ResultGenerator.success(response); - - } catch (error) { - return ResultGenerator.err(error); - } - } + static async getById(programId: string, studyId: string): Promise> { + try { + const {data} = await api.call({ + url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/brapi/v2/studies`, + method: 'get', + params: {studyDbId: studyId} + }) as Response; - static async getById(programId: string, studyId: string): Promise> { - try { - const { data } = await api.call({ - url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/brapi/v2/studies`, - method: 'get', - params: { studyDbId: studyId } - }) as Response; + return ResultGenerator.success(new BiResponse(data)); - return ResultGenerator.success(new BiResponse(data)); - - } catch (error) { - return ResultGenerator.err(error); + } catch (error) { + return ResultGenerator.err(error); + } } - } } From 3a6190805c121d58dc18fb8487251b2443d91273 Mon Sep 17 00:00:00 2001 From: humsika Date: Mon, 28 Sep 2026 11:31:59 -0500 Subject: [PATCH 3/4] [BI-2922] BI-2922: Added a configurable variable for the max page size. --- .env.development | 3 +++ src/breeding-insight/dao/StudyDAO.ts | 6 ++++-- vue.config.js | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.env.development b/.env.development index 0f3dd2fa..f207bc60 100644 --- a/.env.development +++ b/.env.development @@ -16,6 +16,9 @@ VUE_APP_LOG_LEVEL=${WEB_LOG_LEVEL} # The reference source VUE_APP_BI_REFERENCE_SOURCE=${BRAPI_REFERENCE_SOURCE} +# Maximum page size for BrAPI fetch-all requests +VUE_APP_BRAPI_FETCH_PAGE_SIZE=${BRAPI_FETCH_PAGE_SIZE} + # feature flags VUE_APP_BRAPI_VENDOR_SUBMISSION_ENABLED=${BRAPI_VENDOR_SUBMISSION_ENABLED} VUE_APP_ALTERNATE_AUTHENTICATION_ENABLED=${ALTERNATE_AUTHENTICATION_ENABLED} \ No newline at end of file diff --git a/src/breeding-insight/dao/StudyDAO.ts b/src/breeding-insight/dao/StudyDAO.ts index 32430f0e..009bb250 100644 --- a/src/breeding-insight/dao/StudyDAO.ts +++ b/src/breeding-insight/dao/StudyDAO.ts @@ -20,6 +20,8 @@ import * as api from "@/util/api"; import {PaginationQuery} from "@/breeding-insight/model/PaginationQuery"; import {Result, Err, Success, ResultGenerator} from "@/breeding-insight/model/Result"; +const BRAPI_FETCH_PAGE_SIZE = Number(process.env.VUE_APP_BRAPI_FETCH_PAGE_SIZE); + export class StudyDAO { static async getAllForTrial(programId: string, trialDbId: string): Promise> { @@ -29,7 +31,7 @@ export class StudyDAO { method: 'get', params: { trialDbId: trialDbId, - pageSize: 65000 + pageSize: BRAPI_FETCH_PAGE_SIZE } }) as Response; @@ -43,7 +45,7 @@ export class StudyDAO { method: 'get', params: { full, - pageSize: 65000 + pageSize: BRAPI_FETCH_PAGE_SIZE } }) as Response; diff --git a/vue.config.js b/vue.config.js index eed14c1f..fc6740f8 100644 --- a/vue.config.js +++ b/vue.config.js @@ -27,6 +27,7 @@ process.env.VUE_APP_OPENID_LOGOUT_URL = process.env.VUE_APP_OPENID_LOGOUT_URL || process.env.VUE_APP_BI_API_V1_PATH = process.env.VUE_APP_BI_API_ROOT + "/v1"; process.env.VUE_APP_LOG_LEVEL = process.env.VUE_APP_LOG_LEVEL || 'error'; process.env.VUE_APP_BI_REFERENCE_SOURCE = process.env.VUE_APP_BI_REFERENCE_SOURCE || 'breedinginsight.org'; +process.env.VUE_APP_BRAPI_FETCH_PAGE_SIZE = process.env.VUE_APP_BRAPI_FETCH_PAGE_SIZE || '65000'; process.env.VUE_APP_BRAPI_VENDOR_SUBMISSION_ENABLED = ('true' === process.env.VUE_APP_BRAPI_VENDOR_SUBMISSION_ENABLED); process.env.VUE_APP_ALTERNATE_AUTHENTICATION_ENABLED = ('true' === process.env.VUE_APP_ALTERNATE_AUTHENTICATION_ENABLED); From 389a6980aad71823b5cea14e63d351150cf34a0e Mon Sep 17 00:00:00 2001 From: humsika Date: Mon, 28 Sep 2026 12:29:22 -0500 Subject: [PATCH 4/4] [BI-2922] BI-2922: Added a configurable variable for the max page size. --- .env.development | 3 --- vue.config.js | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.env.development b/.env.development index f207bc60..0f3dd2fa 100644 --- a/.env.development +++ b/.env.development @@ -16,9 +16,6 @@ VUE_APP_LOG_LEVEL=${WEB_LOG_LEVEL} # The reference source VUE_APP_BI_REFERENCE_SOURCE=${BRAPI_REFERENCE_SOURCE} -# Maximum page size for BrAPI fetch-all requests -VUE_APP_BRAPI_FETCH_PAGE_SIZE=${BRAPI_FETCH_PAGE_SIZE} - # feature flags VUE_APP_BRAPI_VENDOR_SUBMISSION_ENABLED=${BRAPI_VENDOR_SUBMISSION_ENABLED} VUE_APP_ALTERNATE_AUTHENTICATION_ENABLED=${ALTERNATE_AUTHENTICATION_ENABLED} \ No newline at end of file diff --git a/vue.config.js b/vue.config.js index fc6740f8..44677347 100644 --- a/vue.config.js +++ b/vue.config.js @@ -27,7 +27,7 @@ process.env.VUE_APP_OPENID_LOGOUT_URL = process.env.VUE_APP_OPENID_LOGOUT_URL || process.env.VUE_APP_BI_API_V1_PATH = process.env.VUE_APP_BI_API_ROOT + "/v1"; process.env.VUE_APP_LOG_LEVEL = process.env.VUE_APP_LOG_LEVEL || 'error'; process.env.VUE_APP_BI_REFERENCE_SOURCE = process.env.VUE_APP_BI_REFERENCE_SOURCE || 'breedinginsight.org'; -process.env.VUE_APP_BRAPI_FETCH_PAGE_SIZE = process.env.VUE_APP_BRAPI_FETCH_PAGE_SIZE || '65000'; +process.env.VUE_APP_BRAPI_FETCH_PAGE_SIZE = process.env.CACHE_BRAPI_FETCH_PAGE_SIZE || '65000'; process.env.VUE_APP_BRAPI_VENDOR_SUBMISSION_ENABLED = ('true' === process.env.VUE_APP_BRAPI_VENDOR_SUBMISSION_ENABLED); process.env.VUE_APP_ALTERNATE_AUTHENTICATION_ENABLED = ('true' === process.env.VUE_APP_ALTERNATE_AUTHENTICATION_ENABLED);