Skip to content

Commit abaa785

Browse files
author
theo.gillet
committed
feat: implement audit run history feature
1 parent 63741e4 commit abaa785

11 files changed

Lines changed: 523 additions & 2 deletions

File tree

v6y-apps/bff/src/resolvers/application/ApplicationQueries.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,53 @@ const getApplicationDetailsAuditReportsByParams = async (
8383
}
8484
};
8585

86+
/**
87+
* Get application audit runs history by params
88+
* @param _
89+
* @param args
90+
* @param user
91+
*/
92+
const getApplicationAuditRunsByParams = async (
93+
_: unknown,
94+
args: ApplicationType,
95+
{ user }: { user: AccountType },
96+
) => {
97+
try {
98+
const { _id } = args || {};
99+
100+
AppLogger.info(`[ApplicationQueries - getApplicationAuditRuns] Received args:`, args);
101+
AppLogger.info(`[ApplicationQueries - getApplicationAuditRuns] _id : ${_id}`);
102+
103+
if (!_id) {
104+
AppLogger.error('[ApplicationQueries - getApplicationAuditRuns] Missing _id parameter');
105+
return [];
106+
}
107+
108+
if (!(user.role === 'ADMIN' || user.role === 'SUPERADMIN')) {
109+
const userApplicationsIds = user.applications || [];
110+
if (!userApplicationsIds.includes(_id)) {
111+
AppLogger.warn(
112+
`[ApplicationQueries - getApplicationAuditRuns] Unauthorized access attempt for app ${_id}`,
113+
);
114+
throw new Error('Unauthorized');
115+
}
116+
}
117+
118+
const auditRuns = await AuditRunProvider.getAuditRunsByAppId(_id);
119+
120+
AppLogger.info(
121+
`[ApplicationQueries - getApplicationAuditRuns] Found ${auditRuns?.length} audit runs for app ${_id}`,
122+
);
123+
124+
return auditRuns || [];
125+
} catch (error) {
126+
AppLogger.error(
127+
`[ApplicationQueries - getApplicationAuditRuns] error for app ${args?._id} : ${error}`,
128+
);
129+
return [];
130+
}
131+
};
132+
86133
/**
87134
* Get application details evolutions by params
88135
* @param _
@@ -486,6 +533,7 @@ const getAuditRunDetailsByParams = async (
486533
const ApplicationQueries = {
487534
getApplicationDetailsInfoByParams,
488535
getApplicationDetailsAuditReportsByParams,
536+
getApplicationAuditRunsByParams,
489537
getApplicationDetailsEvolutionsByParams,
490538
getApplicationDetailsDependenciesByParams,
491539
getApplicationDetailsKeywordsByParams,

v6y-apps/bff/src/types/application/ApplicationQueriesType.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const ApplicationQueriesType = `
55
getApplicationTotalByParams(keywords: [String], searchText: String): Int
66
getApplicationDetailsInfoByParams(_id: Int!): ApplicationType
77
getApplicationDetailsAuditReportsByParams(_id: Int!): [AuditReportType]
8+
getApplicationAuditRunsByParams(_id: Int!): [AuditRunType]
89
getApplicationDetailsEvolutionsByParams(_id: Int!): [EvolutionType]
910
getApplicationDetailsDependenciesByParams(_id: Int!): [DependencyType]
1011
getApplicationDetailsKeywordsByParams(_id: Int): [KeywordType]

v6y-apps/bff/src/types/audit/AuditRunType.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const AuditRunType = `
1616
analysisTypes: [String!]!
1717
1818
""" Audit reports generated in this run """
19-
audits: [AuditReportType!]!
19+
audits: [AuditReportType]
2020
2121
""" When the audit run was triggered """
2222
triggeredAt: String!

v6y-apps/front/public/locales/en/common.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,35 @@
211211
"title": "All Dependencies Up to Date",
212212
"description": "No outdated dependencies with security or compatibility issues have been found"
213213
}
214+
},
215+
"auditHistory": {
216+
"title": "Audit History",
217+
"description": "Complete list of audit runs with statuses, dates and details",
218+
"emptyMessage": "No audits have been executed for this application",
219+
"table": {
220+
"columns": {
221+
"status": "Status",
222+
"analysisTypes": "Analysis Types",
223+
"triggered": "Triggered",
224+
"duration": "Duration",
225+
"audits": "Audits"
226+
}
227+
},
228+
"statuses": {
229+
"pending": "Pending",
230+
"in_progress": "In Progress",
231+
"completed": "Completed",
232+
"failed": "Failed",
233+
"error": "Error"
234+
},
235+
"mobile": {
236+
"status": "Status",
237+
"date": "Date",
238+
"types": "Types",
239+
"duration": "Duration",
240+
"audits": "Audits",
241+
"error": "Error"
242+
}
214243
}
215244
},
216245
"appStatsPage": {

v6y-apps/front/public/locales/fr/common.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,35 @@
211211
"title": "Toutes les Dépendances sont à Jour",
212212
"description": "Aucune dépendance obsolète avec des problèmes de sécurité ou de compatibilité n'a été trouvée"
213213
}
214+
},
215+
"auditHistory": {
216+
"title": "Historique des audits",
217+
"description": "Liste complète des exécutions d'audit avec statuts, dates et détails",
218+
"emptyMessage": "Aucun audit n'a été exécuté pour cette application",
219+
"table": {
220+
"columns": {
221+
"status": "Statut",
222+
"analysisTypes": "Types d'analyse",
223+
"triggered": "Déclenché",
224+
"duration": "Durée",
225+
"audits": "Audits"
226+
}
227+
},
228+
"statuses": {
229+
"pending": "En attente",
230+
"in_progress": "En cours",
231+
"completed": "Complété",
232+
"failed": "Échoué",
233+
"error": "Erreur"
234+
},
235+
"mobile": {
236+
"status": "Statut",
237+
"date": "Date",
238+
"types": "Types",
239+
"duration": "Durée",
240+
"audits": "Audits",
241+
"error": "Erreur"
242+
}
214243
}
215244
},
216245
"appStatsPage": {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { gql } from 'graphql-request';
2+
3+
const GetApplicationAuditRuns = gql`
4+
query getApplicationAuditRunsByParams($_id: Int!) {
5+
getApplicationAuditRunsByParams(_id: $_id) {
6+
_id
7+
appId
8+
branch
9+
runStatus
10+
analysisTypes
11+
triggeredAt
12+
completedAt
13+
errorMessage
14+
audits {
15+
_id
16+
type
17+
category
18+
}
19+
}
20+
}
21+
`;
22+
23+
export default GetApplicationAuditRuns;

v6y-apps/front/src/features/app-details/components/VitalityAppDetailsView.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ const VitalitySecuritySection = DynamicLoader(
3030

3131
const VitalitySonarQubeView = DynamicLoader(() => import('./sonarqube/VitalitySonarQubeView'));
3232

33+
const VitalityAuditRunHistoryView = DynamicLoader(
34+
() => import('./audit-runs/VitalityAuditRunHistoryView'),
35+
);
36+
3337
const extractProjectKeyFromSonarUrl = (url: string): string | null => {
3438
try {
3539
const urlObj = new URL(url);
@@ -326,6 +330,13 @@ const VitalityAppDetailsView = () => {
326330
</div>
327331

328332
{renderTabContent()}
333+
334+
<div className="mt-12 pt-8 pb-8 border-t border-slate-200">
335+
<h2 className="text-lg font-semibold text-slate-900 mb-6">
336+
{translate('vitality.appDetailsPage.auditHistory.title')}
337+
</h2>
338+
<VitalityAuditRunHistoryView applicationId={parseInt(_id as string, 10)} />
339+
</div>
329340
</div>
330341
</div>
331342
</div>

0 commit comments

Comments
 (0)