Skip to content

Commit a056748

Browse files
Merge pull request #2278 from OneCommunityGlobal/Abhishek_FixLongestOpenIssuesDataAndTheming
Abhishek_fix: correct issueName fallback, flatten response shape, and sort by duration in Longest Open Issues
2 parents 2475d70 + 2f2d4bb commit a056748

2 files changed

Lines changed: 19 additions & 15 deletions

File tree

src/controllers/bmdashboard/__tests__/bmIssueController.test.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -793,8 +793,7 @@ describe('Building Issue Controller', () => {
793793
const result = res.json.mock.calls[0][0];
794794
expect(result).toHaveLength(1);
795795
expect(result[0].issueName).toBe('Old Issue');
796-
expect(result[0].projects).toHaveLength(1);
797-
expect(result[0].projects[0].durationOpen).toBeGreaterThan(0);
796+
expect(result[0].durationOpen).toBeGreaterThan(0);
798797
});
799798

800799
it('should filter by projects when provided', async () => {
@@ -849,12 +848,15 @@ describe('Building Issue Controller', () => {
849848

850849
const result = res.json.mock.calls[0][0];
851850
expect(result).toHaveLength(7);
852-
// Response is capped at 7 items; each item has issueName and projects with durationOpen
851+
// Response is capped at 7 items; each item is a flat object with issueName and durationOpen
853852
result.forEach((item) => {
854853
expect(item.issueName).toBeDefined();
855-
expect(item.projects).toHaveLength(1);
856-
expect(typeof item.projects[0].durationOpen).toBe('number');
854+
expect(typeof item.durationOpen).toBe('number');
857855
});
856+
// Confirm results are actually sorted longest-to-shortest
857+
for (let i = 1; i < result.length; i += 1) {
858+
expect(result[i - 1].durationOpen).toBeGreaterThanOrEqual(result[i].durationOpen);
859+
}
858860
});
859861

860862
it('should format duration correctly for months', async () => {
@@ -874,7 +876,7 @@ describe('Building Issue Controller', () => {
874876
await controller.getLongestOpenIssues(req, res);
875877

876878
const result = res.json.mock.calls[0][0];
877-
expect(result[0].projects[0].durationOpen).toBeGreaterThanOrEqual(2);
879+
expect(result[0].durationOpen).toBeGreaterThanOrEqual(2);
878880
});
879881

880882
it('should return 500 error when database error occurs', async () => {

src/controllers/bmdashboard/bmIssueController.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,10 @@ const getDurationOpenMonths = (issueDate) =>
6565

6666
const buildGroupedIssues = (issues) => {
6767
const grouped = {};
68-
6968
issues.forEach((issue) => {
7069
if (!issue.issueDate || !issue.projectId) return;
71-
72-
const issueName = Array.isArray(issue.issueTitle)
73-
? issue.issueTitle[0]
74-
: issue.issueTitle || 'Unknown Issue';
70+
const rawTitle = Array.isArray(issue.issueTitle) ? issue.issueTitle[0] : issue.issueTitle;
71+
const issueName = rawTitle || 'Unknown Issue';
7572

7673
const projectId = issue.projectId._id.toString();
7774
const projectName = issue.projectId.projectName || issue.projectId.name || 'Unknown Project';
@@ -93,10 +90,15 @@ const buildGroupedIssues = (issues) => {
9390

9491
const buildLongestOpenResponse = (grouped) =>
9592
Object.entries(grouped)
96-
.map(([issueName, projectsById]) => ({
97-
issueName,
98-
projects: Object.values(projectsById),
99-
}))
93+
.flatMap(([issueName, projectsById]) =>
94+
Object.values(projectsById).map((project) => ({
95+
issueName,
96+
projectId: project.projectId,
97+
projectName: project.projectName,
98+
durationOpen: project.durationOpen,
99+
})),
100+
)
101+
.sort((a, b) => b.durationOpen - a.durationOpen)
100102
.slice(0, MAX_LONGEST_OPEN_ISSUES);
101103

102104
const omitUndefined = (obj) =>

0 commit comments

Comments
 (0)