From 2bfeaadf0613d18f239318fdd017a3a85b890f31 Mon Sep 17 00:00:00 2001 From: shivam-bit Date: Fri, 31 May 2024 16:05:59 +0530 Subject: [PATCH 1/9] feat: filter utilities to improve code organization and readability --- web-server/src/utils/filterUtils.ts | 94 +++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 web-server/src/utils/filterUtils.ts diff --git a/web-server/src/utils/filterUtils.ts b/web-server/src/utils/filterUtils.ts new file mode 100644 index 000000000..bf58f3ddc --- /dev/null +++ b/web-server/src/utils/filterUtils.ts @@ -0,0 +1,94 @@ +import { getAllTeamsReposProdBranchesForOrgAsMap } from '@/api/internal/team/[team_id]/repo_branches'; +import { + repoFiltersFromTeamProdBranches, + updatePrFilterParams, + workFlowFiltersFromTeamProdBranches +} from '@/api-helpers/team'; +import { ActiveBranchMode, TeamRepoBranchDetails } from '@/types/resources'; + +export const getBranchesAndRepoFilter = async (params: { + orgId: ID; + teamId: ID; + branches?: string; + branchMode: ActiveBranchMode; + ignoreBranches?: boolean; +}) => { + const { orgId, teamId, branchMode, ignoreBranches, branches } = params; + const useProdBranches = branchMode === ActiveBranchMode.PROD; + const teamProdBranchesMap = + await getAllTeamsReposProdBranchesForOrgAsMap(orgId); + + const teamRepoFiltersMap = + repoFiltersFromTeamProdBranches(teamProdBranchesMap); + return { + branches: + ignoreBranches || useProdBranches + ? null + : branchMode === ActiveBranchMode.ALL + ? '^' + : branches, + repo_filters: useProdBranches ? teamRepoFiltersMap[teamId] : null + }; +}; + +export const getBranchesAndRepoFilterAsPayload = async (params: { + orgId: ID; + teamIds: ID[]; + branches?: string; + branchMode: ActiveBranchMode; + ignoreBranches?: boolean; + teamProdBranchesMap: Record; +}) => { + const { teamIds, branches, branchMode, ignoreBranches, teamProdBranchesMap } = + params; + + const useProdBranches = branchMode === ActiveBranchMode.PROD; + const teamRepoFiltersMap = + repoFiltersFromTeamProdBranches(teamProdBranchesMap); + + const teamsPrFilters = await Promise.all( + teamIds.map((teamId) => + updatePrFilterParams( + teamId, + {}, + { + branches: + ignoreBranches || useProdBranches + ? null + : branchMode === ActiveBranchMode.ALL + ? '^' + : branches, + repo_filters: useProdBranches ? teamRepoFiltersMap[teamId] : null + } + ).then(({ pr_filter }) => ({ + pr_filter + })) + ) + ); + + return teamsPrFilters; +}; + +export const getWorkFlowFilters = async (params: { + teamProdBranchesMap: Record; + teamIds: ID[]; +}) => { + const { teamProdBranchesMap, teamIds } = params; + return Object.fromEntries( + Object.entries( + workFlowFiltersFromTeamProdBranches(teamProdBranchesMap) + ).filter(([id]) => teamIds.includes(id)) + ); +}; + +export const getWorkFlowFiltersAsPayloadForSingleTeam = async (params: { + orgId: ID; + teamId: ID; +}) => { + const { orgId, teamId } = params; + const teamProdBranchesMap = + await getAllTeamsReposProdBranchesForOrgAsMap(orgId); + return Object.fromEntries( + Object.entries(workFlowFiltersFromTeamProdBranches(teamProdBranchesMap)) + )[teamId]; +}; From 7656a25c71f53ac1385a3cb81a0ee613c809319b Mon Sep 17 00:00:00 2001 From: shivam-bit Date: Fri, 31 May 2024 16:06:11 +0530 Subject: [PATCH 2/9] feat: useBranchesForPrFilters to get branches and branch_mode --- web-server/src/hooks/useStateTeamConfig.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/web-server/src/hooks/useStateTeamConfig.tsx b/web-server/src/hooks/useStateTeamConfig.tsx index 4bdaff8d1..db1aeb4fc 100644 --- a/web-server/src/hooks/useStateTeamConfig.tsx +++ b/web-server/src/hooks/useStateTeamConfig.tsx @@ -167,6 +167,19 @@ export const useStateBranchConfig = () => { return branchNames; }; +export const useBranchesForPrFilters = () => { + const branches = useStateBranchConfig(); + const activeBranchMode = useSelector((s) => s.app.branchMode); + + return useMemo( + () => ({ + branches: activeBranchMode === ActiveBranchMode.CUSTOM ? branches : null, + branch_mode: activeBranchMode + }), + [activeBranchMode, branches] + ); +}; + export const useCurrentDateRangeReactNode = () => { const { start, end, partiallyUnselected } = useStateDateConfig(); return !partiallyUnselected ? ( From 8efa31abf1ee233f1b9846327f042890c37aa912 Mon Sep 17 00:00:00 2001 From: shivam-bit Date: Fri, 31 May 2024 16:20:34 +0530 Subject: [PATCH 3/9] feat: Refactor dora_metrics.ts to use updated filter utilities --- .../internal/team/[team_id]/dora_metrics.ts | 61 ++++++++++--------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/web-server/pages/api/internal/team/[team_id]/dora_metrics.ts b/web-server/pages/api/internal/team/[team_id]/dora_metrics.ts index 74540e68d..8a603baaf 100644 --- a/web-server/pages/api/internal/team/[team_id]/dora_metrics.ts +++ b/web-server/pages/api/internal/team/[team_id]/dora_metrics.ts @@ -4,13 +4,12 @@ import * as yup from 'yup'; import { getTeamRepos } from '@/api/resources/team_repos'; import { getUnsyncedRepos } from '@/api/resources/teams/[team_id]/unsynced_repos'; import { Endpoint } from '@/api-helpers/global'; -import { - repoFiltersFromTeamProdBranches, - updatePrFilterParams, - workFlowFiltersFromTeamProdBranches -} from '@/api-helpers/team'; +import { updatePrFilterParams } from '@/api-helpers/team'; import { mockDoraMetrics } from '@/mocks/dora_metrics'; -import { TeamDoraMetricsApiResponseType } from '@/types/resources'; +import { + ActiveBranchMode, + TeamDoraMetricsApiResponseType +} from '@/types/resources'; import { fetchLeadTimeStats, fetchChangeFailureRateStats, @@ -18,9 +17,12 @@ import { fetchDeploymentFrequencyStats } from '@/utils/cockpitMetricUtils'; import { isoDateString, getAggregateAndTrendsIntervalTime } from '@/utils/date'; +import { + getBranchesAndRepoFilter, + getWorkFlowFiltersAsPayloadForSingleTeam +} from '@/utils/filterUtils'; import { getTeamLeadTimePRs } from './insights'; -import { getAllTeamsReposProdBranchesForOrgAsMap } from './repo_branches'; const pathSchema = yup.object().shape({ team_id: yup.string().uuid().required() @@ -31,7 +33,8 @@ const getSchema = yup.object().shape({ branches: yup.string().optional().nullable(), from_date: yup.date().required(), to_date: yup.date().required(), - repo_filters: yup.mixed().optional().nullable() + repo_filters: yup.mixed().optional().nullable(), + branch_mode: yup.string().oneOf(Object.values(ActiveBranchMode)).required() }); const endpoint = new Endpoint(pathSchema); @@ -46,33 +49,31 @@ endpoint.handle.GET(getSchema, async (req, res) => { team_id: teamId, from_date: rawFromDate, to_date: rawToDate, - branches + branches, + branch_mode } = req.payload; - const [teamProdBranchesMap, unsyncedRepos] = await Promise.all([ - getAllTeamsReposProdBranchesForOrgAsMap(org_id), - getUnsyncedRepos(teamId) - ]); - const teamRepoFiltersMap = - repoFiltersFromTeamProdBranches(teamProdBranchesMap); - const from_date = isoDateString(startOfDay(new Date(rawFromDate))); const to_date = isoDateString(endOfDay(new Date(rawToDate))); - - const [prFilters, workflowFilters] = await Promise.all([ - updatePrFilterParams( + const [branchAndRepoFilters, unsyncedRepos] = await Promise.all([ + getBranchesAndRepoFilter({ + orgId: org_id, teamId, - {}, - { - branches: branches, - repo_filters: !branches ? teamRepoFiltersMap[teamId] : null - } - ).then(({ pr_filter }) => ({ - pr_filter - })), - Object.fromEntries( - Object.entries(workFlowFiltersFromTeamProdBranches(teamProdBranchesMap)) - )[teamId] + branchMode: branch_mode as ActiveBranchMode, + branches + }), + getUnsyncedRepos(teamId) + ]); + const [prFilters, workflowFilters] = await Promise.all([ + updatePrFilterParams(teamId, {}, branchAndRepoFilters).then( + ({ pr_filter }) => ({ + pr_filter + }) + ), + getWorkFlowFiltersAsPayloadForSingleTeam({ + orgId: org_id, + teamId: teamId + }) ]); const { From 6eab6a15ee64689606dcdf715f28892a0b4412c5 Mon Sep 17 00:00:00 2001 From: shivam-bit Date: Fri, 31 May 2024 16:21:15 +0530 Subject: [PATCH 4/9] chore: deleted filters-api.ts --- .../api/internal/[org_id]/filters-api.ts | 104 ------------------ 1 file changed, 104 deletions(-) delete mode 100644 web-server/pages/api/internal/[org_id]/filters-api.ts diff --git a/web-server/pages/api/internal/[org_id]/filters-api.ts b/web-server/pages/api/internal/[org_id]/filters-api.ts deleted file mode 100644 index 4ce03a000..000000000 --- a/web-server/pages/api/internal/[org_id]/filters-api.ts +++ /dev/null @@ -1,104 +0,0 @@ -import * as yup from 'yup'; - -import { getAllTeamsReposProdBranchesForOrgAsMap } from '@/api/internal/team/[team_id]/repo_branches'; -import { Endpoint } from '@/api-helpers/global'; -import { - updatePrFilterParams, - updateTicketFilterParams, - workFlowFiltersFromTeamProdBranches, - repoFiltersFromTeamProdBranches -} from '@/api-helpers/team'; -import { CockpitBranchMode } from '@/types/resources'; -import { getFilters } from '@/utils/cockpitMetricUtils'; -import { isoDateString, getAggregateAndTrendsIntervalTime } from '@/utils/date'; -const IdSchema = yup.string().uuid().required(); - -const pathSchema = yup.object().shape({ - org_id: IdSchema -}); - -const postSchema = yup.object().shape({ - team_ids: yup.array().of(IdSchema).required('Team IDs are required'), - from_time: yup.date().required(), - to_time: yup.date().required(), - branch_mode: yup.string().oneOf(Object.values(CockpitBranchMode)).required() -}); - -const endpoint = new Endpoint(pathSchema); -export default endpoint.serve(); - -endpoint.handle.POST(postSchema, async (req, res) => { - const { org_id, from_time, team_ids, to_time, branch_mode } = req.payload; - const useProdBranches = branch_mode === CockpitBranchMode.PROD; - const teamProdBranchesMap = - await getAllTeamsReposProdBranchesForOrgAsMap(org_id); - const teamRepoFiltersMap = - repoFiltersFromTeamProdBranches(teamProdBranchesMap); - - const [prFilters, ticketFilters, workflowFilters] = await Promise.all([ - Promise.all( - team_ids.map((teamId) => - updatePrFilterParams( - teamId, - {}, - { - repo_filters: useProdBranches ? teamRepoFiltersMap[teamId] : null - } - ).then(({ pr_filter }) => ({ - pr_filter - })) - ) - ), - Promise.all( - team_ids.map((teamId) => - updateTicketFilterParams(teamId, {}).then(({ ticket_filter }) => ({ - ticket_filter - })) - ) - ), - Object.fromEntries( - Object.entries( - workFlowFiltersFromTeamProdBranches(teamProdBranchesMap) - ).filter(([id]) => team_ids.includes(id)) - ) - ]); - - const { - currTrendsTimeObject, - prevTrendsTimeObject, - prevCycleStartDay, - prevCycleEndDay, - currentCycleStartDay, - currentCycleEndDay - } = getAggregateAndTrendsIntervalTime(from_time, to_time); - - const prDataObject = { - from_time: isoDateString(currentCycleStartDay), - to_time: isoDateString(currentCycleEndDay), - teams_pr_filters: getFilters(prFilters, team_ids) - }; - - const ticketDataObject = { - from_time: isoDateString(currentCycleStartDay), - to_time: isoDateString(currentCycleEndDay), - teams_ticket_filters: getFilters(ticketFilters, team_ids) - }; - - const workflowDataObject = { - from_time: isoDateString(currentCycleStartDay), - to_time: isoDateString(currentCycleEndDay), - teams_workflow_filters: workflowFilters - }; - - return res.send({ - prDataObject, - ticketDataObject, - workflowDataObject, - currTrendsTimeObject, - prevTrendsTimeObject, - prevCycleIntervalObject: { - prevCycleStartDay: isoDateString(prevCycleStartDay), - prevCycleEndDay: isoDateString(prevCycleEndDay) - } - }); -}); From 864a19e5681b8385da3a673d481118ee1da1f701 Mon Sep 17 00:00:00 2001 From: shivam-bit Date: Fri, 31 May 2024 16:30:29 +0530 Subject: [PATCH 5/9] refactor: API endpoints to use updated filter utilities --- .../internal/team/[team_id]/get_incidents.ts | 31 ++++--- .../api/internal/team/[team_id]/insights.ts | 83 ++++++++----------- 2 files changed, 51 insertions(+), 63 deletions(-) diff --git a/web-server/pages/api/internal/team/[team_id]/get_incidents.ts b/web-server/pages/api/internal/team/[team_id]/get_incidents.ts index b3c19abb8..351183c5b 100644 --- a/web-server/pages/api/internal/team/[team_id]/get_incidents.ts +++ b/web-server/pages/api/internal/team/[team_id]/get_incidents.ts @@ -2,19 +2,17 @@ import { endOfDay, startOfDay } from 'date-fns'; import { isNil, reject } from 'ramda'; import * as yup from 'yup'; -import { getAllTeamsReposProdBranchesForOrgAsMap } from '@/api/internal/team/[team_id]/repo_branches'; import { handleRequest } from '@/api-helpers/axios'; import { Endpoint } from '@/api-helpers/global'; -import { - updatePrFilterParams, - repoFiltersFromTeamProdBranches -} from '@/api-helpers/team'; +import { updatePrFilterParams } from '@/api-helpers/team'; import { mockDeploymentsWithIncidents } from '@/mocks/incidents'; import { DeploymentWithIncidents, - IncidentApiResponseType + IncidentApiResponseType, + ActiveBranchMode } from '@/types/resources'; import { getWeekStartAndEndInterval } from '@/utils/date'; +import { getBranchesAndRepoFilter } from '@/utils/filterUtils'; const pathSchema = yup.object().shape({ team_id: yup.string().uuid().required() @@ -25,7 +23,8 @@ const getSchema = yup.object().shape({ to_date: yup.date().required(), branches: yup.string().optional().nullable(), repo_filters: yup.mixed().optional().nullable(), - org_id: yup.string().uuid().required() + org_id: yup.string().uuid().required(), + branch_mode: yup.string().oneOf(Object.values(ActiveBranchMode)).required() }); const endpoint = new Endpoint(pathSchema); @@ -39,22 +38,22 @@ endpoint.handle.GET(getSchema, async (req, res) => { from_date: rawFromDate, to_date: rawToDate, branches, - org_id + org_id, + branch_mode } = req.payload; const from_date = startOfDay(new Date(rawFromDate)); const to_date = endOfDay(new Date(rawToDate)); - const teamProdBranchesMap = - await getAllTeamsReposProdBranchesForOrgAsMap(org_id); - const teamRepoFiltersMap = - repoFiltersFromTeamProdBranches(teamProdBranchesMap); + const branchAndRepoFilters = await getBranchesAndRepoFilter({ + orgId: org_id, + teamId: team_id, + branchMode: branch_mode as ActiveBranchMode, + branches + }); const prFilter = await updatePrFilterParams( team_id, {}, - { - branches: branches, - repo_filters: !branches ? teamRepoFiltersMap[team_id] : null - } + branchAndRepoFilters ).then(({ pr_filter }) => ({ pr_filter })); diff --git a/web-server/pages/api/internal/team/[team_id]/insights.ts b/web-server/pages/api/internal/team/[team_id]/insights.ts index 05f102cbb..da722bac0 100644 --- a/web-server/pages/api/internal/team/[team_id]/insights.ts +++ b/web-server/pages/api/internal/team/[team_id]/insights.ts @@ -1,6 +1,7 @@ import { endOfDay, startOfDay } from 'date-fns'; import * as yup from 'yup'; +import { handleRequest } from '@/api-helpers/axios'; import { Endpoint } from '@/api-helpers/global'; import { batchPaginatedRequest, @@ -10,11 +11,17 @@ import { adaptPr } from '@/api-helpers/pr'; import { updatePrFilterParams } from '@/api-helpers/team'; import { MAX_INT } from '@/constants/generic'; import { mockTeamPullRequests } from '@/mocks/pull-requests'; -import { BasePR, Comparison, PR, RepoFilterConfig } from '@/types/resources'; +import { + ActiveBranchMode, + BasePR, + Comparison, + PR, + RepoFilterConfig +} from '@/types/resources'; +import { getFilters } from '@/utils/cockpitMetricUtils'; import { getCycleTimeForPr } from '@/utils/code'; import { isoDateString, getDateWithComparisonRanges } from '@/utils/date'; -import { getFilters } from '@/utils/cockpitMetricUtils'; -import { handleRequest } from '@/api-helpers/axios'; +import { getBranchesAndRepoFilter } from '@/utils/filterUtils'; const pathSchema = yup.object().shape({ team_id: yup.string().uuid().required() @@ -32,7 +39,8 @@ const getSchema = yup.object().shape({ }) .optional() .nullable(), - repo_filters: yup.mixed().optional().nullable() + repo_filters: yup.mixed().optional().nullable(), + branch_mode: yup.string().oneOf(Object.values(ActiveBranchMode)).required() }); const endpoint = new Endpoint(pathSchema); @@ -44,22 +52,31 @@ endpoint.handle.GET(getSchema, async (req, res) => { prev: mockTeamPullRequests }); } + const { + org_id, + team_id, + from_date, + to_date, + branch_mode, + branches, + cycle_time + } = req.payload; + + const { curr } = getDateWithComparisonRanges(from_date, to_date); + const branchAndRepoFilters = await getBranchesAndRepoFilter({ + orgId: org_id, + teamId: team_id, + branchMode: branch_mode as ActiveBranchMode, + branches + }); - const { curr } = getDateWithComparisonRanges( - req.payload.from_date, - req.payload.to_date - ); - - const [currInsights] = await Promise.all([ - getTeamPrs({ - team_id: req.payload.team_id, - branches: req.payload.branches, - from_date: curr.from, - to_date: curr.to, - cycle_time: req.payload.cycle_time, - repo_filters: req.payload.repo_filters - }) - ]); + const currInsights = await getTeamPrs({ + team_id: team_id, + from_date: curr.from, + to_date: curr.to, + cycle_time: cycle_time, + ...branchAndRepoFilters + }); return res.send({ curr: currInsights, @@ -112,34 +129,6 @@ export const getTeamPrs = async ({ })); }; -export const getTeamPrsWithComparisonSegment = ({ - team_id, - branches, - from_date, - to_date, - repo_filters -}: GetTeamPrs): [Promise, Promise] => { - const { curr, prev } = getDateWithComparisonRanges(from_date, to_date); - - const currentSegmentPromise = getTeamPrs({ - team_id, - branches, - from_date: curr.from, - to_date: curr.to, - repo_filters - }).then((r) => r.data); - - const previousSegmentPromise = getTeamPrs({ - team_id, - branches, - from_date: prev.from, - to_date: prev.to, - repo_filters - }).then((r) => r.data); - - return [currentSegmentPromise, previousSegmentPromise]; -}; - export const getTeamLeadTimePRs = ( team_id: string, from_time: Date | DateString, From 9fe45c1ebfee3a5bc547195c300819aa7880c04f Mon Sep 17 00:00:00 2001 From: shivam-bit Date: Fri, 31 May 2024 16:32:23 +0530 Subject: [PATCH 6/9] refactor: Remove unused repo_filters field in dora_metrics.ts API endpoint --- web-server/pages/api/internal/team/[team_id]/dora_metrics.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/web-server/pages/api/internal/team/[team_id]/dora_metrics.ts b/web-server/pages/api/internal/team/[team_id]/dora_metrics.ts index 8a603baaf..9ec5eb28b 100644 --- a/web-server/pages/api/internal/team/[team_id]/dora_metrics.ts +++ b/web-server/pages/api/internal/team/[team_id]/dora_metrics.ts @@ -33,7 +33,6 @@ const getSchema = yup.object().shape({ branches: yup.string().optional().nullable(), from_date: yup.date().required(), to_date: yup.date().required(), - repo_filters: yup.mixed().optional().nullable(), branch_mode: yup.string().oneOf(Object.values(ActiveBranchMode)).required() }); From 53d28c8113923702ae569b05312b757d7b963c9c Mon Sep 17 00:00:00 2001 From: shivam-bit Date: Fri, 31 May 2024 17:55:09 +0530 Subject: [PATCH 7/9] refactor: Remove unused repo_filters field in dora_metrics.ts API endpoint --- .../content/DoraMetrics/DoraMetricsBody.tsx | 21 ++++++------------- web-server/src/slices/dora_metrics.ts | 13 ++++++------ 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/web-server/src/content/DoraMetrics/DoraMetricsBody.tsx b/web-server/src/content/DoraMetrics/DoraMetricsBody.tsx index f60275b74..251d2b1ab 100644 --- a/web-server/src/content/DoraMetrics/DoraMetricsBody.tsx +++ b/web-server/src/content/DoraMetrics/DoraMetricsBody.tsx @@ -17,12 +17,11 @@ import { useAuth } from '@/hooks/useAuth'; import { useBoolState, useEasyState } from '@/hooks/useEasyState'; import { usePageRefreshCallback } from '@/hooks/usePageRefreshCallback'; import { - useSingleTeamConfig, - useStateBranchConfig + useBranchesForPrFilters, + useSingleTeamConfig } from '@/hooks/useStateTeamConfig'; import { fetchTeamDoraMetrics, getUnyncedRepos } from '@/slices/dora_metrics'; import { useDispatch, useSelector } from '@/store'; -import { ActiveBranchMode } from '@/types/resources'; import { depFn } from '@/utils/fn'; import { getRandomLoadMsg } from '@/utils/loading-messages'; @@ -40,7 +39,7 @@ export const DoraMetricsBody = () => { integrations: { github: isGithubIntegrated } } = useAuth(); const { singleTeamId, dates } = useSingleTeamConfig(); - const branches = useStateBranchConfig(); + const branchPayloadForPrFilters = useBranchesForPrFilters(); const isLoading = useSelector( (s) => s.doraMetrics.requests?.metrics_summary === FetchState.REQUEST ); @@ -50,8 +49,6 @@ export const DoraMetricsBody = () => { const firstLoadDone = useSelector((s) => s.doraMetrics.firstLoadDone); - const activeBranchMode = useSelector((s) => s.app.branchMode); - const isTeamInsightsEmpty = useSelector( (s) => !s.doraMetrics.metrics_summary?.change_failure_rate_stats.current @@ -72,23 +69,17 @@ export const DoraMetricsBody = () => { teamId: singleTeamId, fromDate: dates.start, toDate: dates.end, - branches: - activeBranchMode === ActiveBranchMode.PROD - ? null - : activeBranchMode === ActiveBranchMode.ALL - ? '^' - : branches + ...branchPayloadForPrFilters }) ); }, [ - branches, dates.end, dates.start, dispatch, orgId, singleTeamId, - activeBranchMode, - isGithubIntegrated + isGithubIntegrated, + branchPayloadForPrFilters ]); const stats = useDoraStats(); diff --git a/web-server/src/slices/dora_metrics.ts b/web-server/src/slices/dora_metrics.ts index b4fbc185a..301131337 100644 --- a/web-server/src/slices/dora_metrics.ts +++ b/web-server/src/slices/dora_metrics.ts @@ -4,6 +4,7 @@ import { omit } from 'ramda'; import { handleApi } from '@/api-helpers/axios-api-instance'; import { Row } from '@/constants/db'; +import { useBranchesForPrFilters } from '@/hooks/useStateTeamConfig'; import { StateFetchConfig } from '@/types/redux'; import { Deployment, @@ -11,9 +12,9 @@ import { TeamDeploymentsApiResponse, DeploymentWithIncidents, IncidentsWithDeploymentResponseType, - RepoFilterConfig, IncidentApiResponseType, - ChangeTimeModes + ChangeTimeModes, + ActiveBranchMode } from '@/types/resources'; import { addFetchCasesToReducer } from '@/utils/redux'; @@ -146,9 +147,7 @@ type DoraMetricsApiParamsType = { team_id: ID; from_date: Date; to_date: Date; - branches?: string; - repo_filters?: RepoFilterConfig; -}; +} & ReturnType; export const fetchTeamDoraMetrics = createAsyncThunk( 'dora_metrics/fetchTeamDoraMetrics', @@ -158,6 +157,7 @@ export const fetchTeamDoraMetrics = createAsyncThunk( fromDate: Date; toDate: Date; branches: string; + branch_mode: ActiveBranchMode; }) => { return await handleApi( `internal/team/${params.teamId}/dora_metrics`, @@ -166,7 +166,8 @@ export const fetchTeamDoraMetrics = createAsyncThunk( org_id: params.orgId, from_date: params.fromDate, to_date: params.toDate, - branches: params.branches + branches: params.branches, + branch_mode: params.branch_mode } } ); From e37da6939f50bd5e4837b8752e14594ee48d87b9 Mon Sep 17 00:00:00 2001 From: shivam-bit Date: Fri, 31 May 2024 17:55:27 +0530 Subject: [PATCH 8/9] refactor: Update usePageRefreshCallback to use useBranchesForPrFilters hook --- web-server/src/hooks/usePageRefreshCallback.ts | 17 +++++------------ web-server/src/hooks/useStateTeamConfig.tsx | 2 +- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/web-server/src/hooks/usePageRefreshCallback.ts b/web-server/src/hooks/usePageRefreshCallback.ts index 122cf32e2..0ed8e5e1f 100644 --- a/web-server/src/hooks/usePageRefreshCallback.ts +++ b/web-server/src/hooks/usePageRefreshCallback.ts @@ -3,21 +3,19 @@ import { useRouter } from 'next/router'; import { ROUTES } from '@/constants/routes'; import { useAuth } from '@/hooks/useAuth'; import { - useSingleTeamConfig, - useStateBranchConfig + useBranchesForPrFilters, + useSingleTeamConfig } from '@/hooks/useStateTeamConfig'; import { fetchTeamDoraMetrics } from '@/slices/dora_metrics'; -import { useDispatch, useSelector } from '@/store'; -import { ActiveBranchMode } from '@/types/resources'; +import { useDispatch } from '@/store'; export const usePageRefreshCallback = () => { const router = useRouter(); const dispatch = useDispatch(); const { orgId } = useAuth(); const { dates, singleTeamId } = useSingleTeamConfig(); - const activeBranchMode = useSelector((s) => s.app.branchMode); + const branchPayloadForPrFilters = useBranchesForPrFilters(); - const branches = useStateBranchConfig(); switch (router.pathname) { case ROUTES.DORA_METRICS.PATH: return () => @@ -27,12 +25,7 @@ export const usePageRefreshCallback = () => { teamId: singleTeamId, fromDate: dates.start, toDate: dates.end, - branches: - activeBranchMode === ActiveBranchMode.PROD - ? null - : activeBranchMode === ActiveBranchMode.ALL - ? '^' - : branches + ...branchPayloadForPrFilters }) ); default: diff --git a/web-server/src/hooks/useStateTeamConfig.tsx b/web-server/src/hooks/useStateTeamConfig.tsx index db1aeb4fc..0fed84677 100644 --- a/web-server/src/hooks/useStateTeamConfig.tsx +++ b/web-server/src/hooks/useStateTeamConfig.tsx @@ -163,7 +163,7 @@ export const useSingleTeamConfig = () => { export const useStateBranchConfig = () => { const branchMode = useSelector((s) => s.app.branchMode); const branchNames = useSelector((s) => s.app.branchNames); - if (branchMode === ActiveBranchMode.ALL) return null; + if (branchMode === ActiveBranchMode.ALL) return '^'; return branchNames; }; From eab84f8904bee0185d227836b183d7c7c01d47a4 Mon Sep 17 00:00:00 2001 From: shivam-bit Date: Fri, 31 May 2024 17:56:03 +0530 Subject: [PATCH 9/9] refactor: Update ResolvedIncidentsBody component to use useBranchesForPrFilters hook --- .../src/content/DoraMetrics/ResolvedIncidents.tsx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/web-server/src/content/DoraMetrics/ResolvedIncidents.tsx b/web-server/src/content/DoraMetrics/ResolvedIncidents.tsx index da94ea426..33ff7aece 100644 --- a/web-server/src/content/DoraMetrics/ResolvedIncidents.tsx +++ b/web-server/src/content/DoraMetrics/ResolvedIncidents.tsx @@ -17,6 +17,7 @@ import { useAuth } from '@/hooks/useAuth'; import { useDoraMetricsGraph } from '@/hooks/useDoraMetricsGraph'; import { useEasyState } from '@/hooks/useEasyState'; import { + useBranchesForPrFilters, useCurrentDateRangeReactNode, useSingleTeamConfig } from '@/hooks/useStateTeamConfig'; @@ -36,7 +37,7 @@ export const ResolvedIncidentsBody = () => { const dispatch = useDispatch(); const { orgId } = useAuth(); const { singleTeamId, dates, team } = useSingleTeamConfig(); - + const branchPayloadForPrFilters = useBranchesForPrFilters(); const dateRangeLabel = useCurrentDateRangeReactNode(); const isLoading = useSelector( (s) => s.doraMetrics.requests?.resolved_incidents === FetchState.REQUEST @@ -72,10 +73,18 @@ export const ResolvedIncidentsBody = () => { fetchAllResolvedIncidents({ team_id: singleTeamId, from_date: dates.start, - to_date: dates.end + to_date: dates.end, + ...branchPayloadForPrFilters }) ); - }, [dates.end, dates.start, dispatch, orgId, singleTeamId]); + }, [ + branchPayloadForPrFilters, + dates.end, + dates.start, + dispatch, + orgId, + singleTeamId + ]); const { trendsSeriesMap } = useDoraMetricsGraph(); const isTrendsSeriesDataAvailable = head(