diff --git a/visualization_tool/package-lock.json b/visualization_tool/package-lock.json index 8dab83d1..a4274f3e 100644 --- a/visualization_tool/package-lock.json +++ b/visualization_tool/package-lock.json @@ -1,12 +1,12 @@ { - "name": "gcp-scanner", - "version": "0.0.0", + "name": "gcp-scanner-visualizer", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "gcp-scanner", - "version": "0.0.0", + "name": "gcp-scanner-visualizer", + "version": "1.0.0", "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", diff --git a/visualization_tool/src/components/ControlMenu/Controller.ts b/visualization_tool/src/components/ControlMenu/Controller.ts index afcf29b0..2e64c9d7 100644 --- a/visualization_tool/src/components/ControlMenu/Controller.ts +++ b/visualization_tool/src/components/ControlMenu/Controller.ts @@ -17,47 +17,48 @@ const titleCase = (str: string) => { const parseData = (data: OutputFile, fileName: string) => { const resources = []; - for (const [projectId, projectData] of Object.entries(data.projects)) { - for (const [resourceType, resourceList] of Object.entries(projectData)) { - let type = titleCase(resourceType.slice(0, -1)); - if (type === 'Dns Policie') type = 'Dns Policy'; - if ( - resourceList instanceof Array && - availableResourceTypes.includes(type as ResourceType) - ) { - const currentResources = []; - for (const resource of resourceList) { - const resourceData: Record = {}; - resourceData['file'] = fileName; - resourceData['projectId'] = projectId; + const projectId = data.project_info.projectId; + console.log(Object.entries(data)); + for (const [resourceType, resourceList] of Object.entries(data)) { + console.log(resourceType); + let type = titleCase(resourceType.slice(0, -1)); + if (type === 'Dns Policie') type = 'Dns Policy'; + if ( + resourceList instanceof Array && + availableResourceTypes.includes(type as ResourceType) + ) { + const currentResources = []; + for (const resource of resourceList) { + const resourceData: Record = {}; + resourceData['file'] = fileName; + resourceData['projectId'] = projectId; - for (const [key, value] of Object.entries(resource)) { - switch (typeof value) { - case 'string': - // if this attribute is a link, get the last part of the link - if (value.split('/').length > 1) { - resourceData[key] = value.split('/').at(-1) || 'unknown'; - } else { - resourceData[key] = value; - } - break; - case 'number': + for (const [key, value] of Object.entries(resource)) { + switch (typeof value) { + case 'string': + // if this attribute is a link, get the last part of the link + if (value.split('/').length > 1) { + resourceData[key] = value.split('/').at(-1) || 'unknown'; + } else { resourceData[key] = value; - break; - default: - break; - } + } + break; + case 'number': + resourceData[key] = value; + break; + default: + break; } - - resourceData['name'] = resourceData['name'] || 'unknown'; - resourceData['status'] = resourceData['status'] || 'READY'; - resourceData['type'] = type; - - currentResources.push(resourceData as Resource); } - resources.push(...currentResources); + resourceData['name'] = resourceData['name'] || 'unknown'; + resourceData['status'] = resourceData['status'] || 'READY'; + resourceData['type'] = type; + + currentResources.push(resourceData as Resource); } + + resources.push(...currentResources); } } @@ -66,27 +67,25 @@ const parseData = (data: OutputFile, fileName: string) => { const parseIAMData = (data: OutputFile, fileName: string) => { const roles: IAMRole[] = []; - for (const [projectId, projectData] of Object.entries(data.projects)) { - const currentRoles = projectData?.iam_policy as IMAPolicyField[]; + const projectId = data.project_info.projectId; + const currentRoles = data.iam_policy as IMAPolicyField[]; - if (roles instanceof Array) { - for (const role of currentRoles) { - roles.push({ - file: fileName, - projectId, - role: `${projectId}__${role.role.split('/')[1]}`, - members: role.members.map(member => { - return { - memberType: member.split(':')[0], - email: member.split(':')[1], - }; - }), - }); - } + if (roles instanceof Array) { + for (const role of currentRoles) { + roles.push({ + file: fileName, + projectId, + role: `${projectId}__${role.role.split('/')[1]}`, + members: role.members.map(member => { + return { + memberType: member.split(':')[0], + email: member.split(':')[1], + }; + }), + }); } } - // console.log(roles); return roles; }; export {parseData, parseIAMData}; diff --git a/visualization_tool/src/components/ControlMenu/partials/UploadMenu.tsx b/visualization_tool/src/components/ControlMenu/partials/UploadMenu.tsx index b67155e3..0a2157da 100644 --- a/visualization_tool/src/components/ControlMenu/partials/UploadMenu.tsx +++ b/visualization_tool/src/components/ControlMenu/partials/UploadMenu.tsx @@ -2,7 +2,7 @@ import {useState, useRef} from 'react'; import AddIcon from '@mui/icons-material/Add'; import CloseIcon from '@mui/icons-material/Close'; -import {Resource} from '../../../types/resources'; +import {Resource, OutputFile} from '../../../types/resources'; import {IAMRole} from '../../../types/IAMPolicy'; import {parseData, parseIAMData} from '../Controller'; @@ -58,14 +58,14 @@ const UploadMenu = ({ const result = e.target?.result as string; try { - const data = JSON.parse(result); + const data = JSON.parse(result) as OutputFile; setProjects(prevProjects => [ ...prevProjects, - ...Object.keys(data.projects), + data.project_info.projectId, ]); setAllowedProjects(prevProjects => [ ...prevProjects, - ...Object.keys(data.projects), + data.project_info.projectId, ]); const resources = parseData(data, file.name); setResources((prevResources: Resource[]) => [ @@ -78,7 +78,7 @@ const UploadMenu = ({ setFiles([ ...files, - {name: file.name, projects: Object.keys(data.projects)}, + {name: file.name, projects: [data.project_info.projectId]}, ]); } catch (err) { setError('Invalid file'); diff --git a/visualization_tool/src/types/resources.ts b/visualization_tool/src/types/resources.ts index f243fdd7..c8427931 100644 --- a/visualization_tool/src/types/resources.ts +++ b/visualization_tool/src/types/resources.ts @@ -37,16 +37,17 @@ type Resource = { status: ResourceStatus; }; -type Project = { - [key: string]: Resource[] | IMAPolicyField[]; +type ProjectInfo = { + projectId: string; + name: string; }; type OutputFile = { - projects: { - [key: string]: Project; - }; + project_info: ProjectInfo; + iam_policy: IMAPolicyField[]; + // [key: string]: Resource[] | IMAPolicyField[] | ProjectInfo; }; -export type {ResourceType, ResourceStatus, Resource, Project, OutputFile}; +export type {ResourceType, ResourceStatus, Resource, OutputFile}; export {availableResourceTypes};