Skip to content

Commit

Permalink
feat(audit): add notification on audit report (#1231)
Browse files Browse the repository at this point in the history
  • Loading branch information
Alezco committed Apr 12, 2021
1 parent b1302d8 commit 73f8850
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 85 deletions.
192 changes: 109 additions & 83 deletions src/exporters/audit/audit-report-exporter.ts
Expand Up @@ -40,6 +40,13 @@ import {
import { HashesMap } from "reducers/hashes/hashes-types";
import { getHashesFromStore } from "reducers/hashes/hashes-selectors";
import fs from "fs";
import {
NotificationDuration,
notifyInfo,
notifySuccess,
} from "util/notification/notifications-util";
import translations from "translations/translations";
import { openExternalElement } from "util/file-system/file-system-util";

const ROOT_ID = "";

Expand All @@ -48,102 +55,114 @@ export const computeAuditReportData = (
filesAndFoldersMetadata: FilesAndFoldersMetadataMap,
filesAndFoldersHashes: HashesMap,
elementsToDelete: string[]
): AuditReportData => ({
totalFoldersCount: getFoldersCount(filesAndFolders),
totalFilesCount: getFileCount(filesAndFolders),
totalSize: octet2HumanReadableFormat(
filesAndFoldersMetadata[ROOT_ID].childrenTotalSize
),
oldestDate: formatAuditReportDate(
filesAndFoldersMetadata[ROOT_ID].minLastModified
),
newestDate: formatAuditReportDate(
filesAndFoldersMetadata[ROOT_ID].maxLastModified
),
longestPathLength: getLongestPathFile(filesAndFolders)?.id?.length || 0,
longestPathFileName: getLongestPathFile(filesAndFolders)?.name || "",
longestPathPath:
formatPathForUserSystem(getLongestPathFile(filesAndFolders)?.id) || "",
depth: getMaxDepth(filesAndFolders),
publicationPercent: percentFileTypes(filesAndFolders)[FileType.PUBLICATION],
publicationCount: countFileTypes(filesAndFolders)[FileType.PUBLICATION],
publicationFileTypes: getExtensionsList()[FileType.PUBLICATION],
presentationPercent: percentFileTypes(filesAndFolders)[FileType.PRESENTATION],
presentationCount: countFileTypes(filesAndFolders)[FileType.PRESENTATION],
presentationFileTypes: getExtensionsList()[FileType.PRESENTATION],
spreadsheetPercent: percentFileTypes(filesAndFolders)[FileType.SPREADSHEET],
spreadsheetCount: countFileTypes(filesAndFolders)[FileType.SPREADSHEET],
spreadsheetFileTypes: getExtensionsList()[FileType.SPREADSHEET],
emailPercent: percentFileTypes(filesAndFolders)[FileType.EMAIL],
emailCount: countFileTypes(filesAndFolders)[FileType.EMAIL],
emailFileTypes: getExtensionsList()[FileType.EMAIL],
documentPercent: percentFileTypes(filesAndFolders)[FileType.DOCUMENT],
documentCount: countFileTypes(filesAndFolders)[FileType.DOCUMENT],
documentFileTypes: getExtensionsList()[FileType.DOCUMENT],
imagePercent: percentFileTypes(filesAndFolders)[FileType.IMAGE],
imageCount: countFileTypes(filesAndFolders)[FileType.IMAGE],
imageFileTypes: getExtensionsList()[FileType.IMAGE],
videoPercent: percentFileTypes(filesAndFolders)[FileType.VIDEO],
videoCount: countFileTypes(filesAndFolders)[FileType.VIDEO],
videoFileTypes: getExtensionsList()[FileType.VIDEO],
audioPercent: percentFileTypes(filesAndFolders)[FileType.AUDIO],
audioCount: countFileTypes(filesAndFolders)[FileType.AUDIO],
audioFileTypes: getExtensionsList()[FileType.AUDIO],
otherPercent: percentFileTypes(filesAndFolders)[FileType.OTHER],
otherCount: countFileTypes(filesAndFolders)[FileType.OTHER],
otherFileTypes: "les types restants",
oldestFiles: getOldestFiles(filesAndFolders),
biggestFiles: getBiggestFiles(filesAndFolders),
duplicateFolderCount: countDuplicateFolders(
filesAndFolders,
filesAndFoldersHashes
),
duplicateFolderPercent: getDuplicateFoldersPercent(
filesAndFolders,
filesAndFoldersHashes
),
duplicateFileCount: countDuplicateFiles(
filesAndFolders,
filesAndFoldersHashes
),
duplicateFilePercent: getDuplicateFilesPercent(
filesAndFolders,
filesAndFoldersHashes
),
duplicateTotalSize: getHumanReadableDuplicateTotalSize(
filesAndFolders,
filesAndFoldersHashes
),
duplicates: getDuplicatesWithTheMostCopy(
filesAndFolders,
filesAndFoldersHashes
),
biggestDuplicateFolders: getDuplicatesWithTheBiggestSize(
filesAndFolders,
filesAndFoldersMetadata,
filesAndFoldersHashes
),
elementsToDelete: getElementsToDelete(
filesAndFolders,
filesAndFoldersMetadata,
elementsToDelete
),
});
): AuditReportData => {
const longestPathFile = getLongestPathFile(filesAndFolders);
const fileTypesPercents = percentFileTypes(filesAndFolders);
const fileTypesCounts = countFileTypes(filesAndFolders);
const extensionsList = getExtensionsList();
return {
totalFoldersCount: getFoldersCount(filesAndFolders),
totalFilesCount: getFileCount(filesAndFolders),
totalSize: octet2HumanReadableFormat(
filesAndFoldersMetadata[ROOT_ID].childrenTotalSize
),
oldestDate: formatAuditReportDate(
filesAndFoldersMetadata[ROOT_ID].minLastModified
),
newestDate: formatAuditReportDate(
filesAndFoldersMetadata[ROOT_ID].maxLastModified
),
longestPathLength: longestPathFile?.id?.length || 0,
longestPathFileName: longestPathFile?.name || "",
longestPathPath: formatPathForUserSystem(longestPathFile?.id) || "",
depth: getMaxDepth(filesAndFolders),
publicationPercent: fileTypesPercents[FileType.PUBLICATION],
publicationCount: fileTypesCounts[FileType.PUBLICATION],
publicationFileTypes: extensionsList[FileType.PUBLICATION],
presentationPercent: fileTypesPercents[FileType.PRESENTATION],
presentationCount: fileTypesCounts[FileType.PRESENTATION],
presentationFileTypes: extensionsList[FileType.PRESENTATION],
spreadsheetPercent: fileTypesPercents[FileType.SPREADSHEET],
spreadsheetCount: fileTypesCounts[FileType.SPREADSHEET],
spreadsheetFileTypes: extensionsList[FileType.SPREADSHEET],
emailPercent: fileTypesPercents[FileType.EMAIL],
emailCount: fileTypesCounts[FileType.EMAIL],
emailFileTypes: extensionsList[FileType.EMAIL],
documentPercent: fileTypesPercents[FileType.DOCUMENT],
documentCount: fileTypesCounts[FileType.DOCUMENT],
documentFileTypes: extensionsList[FileType.DOCUMENT],
imagePercent: fileTypesPercents[FileType.IMAGE],
imageCount: fileTypesCounts[FileType.IMAGE],
imageFileTypes: extensionsList[FileType.IMAGE],
videoPercent: fileTypesPercents[FileType.VIDEO],
videoCount: fileTypesCounts[FileType.VIDEO],
videoFileTypes: extensionsList[FileType.VIDEO],
audioPercent: fileTypesPercents[FileType.AUDIO],
audioCount: fileTypesCounts[FileType.AUDIO],
audioFileTypes: extensionsList[FileType.AUDIO],
otherPercent: fileTypesPercents[FileType.OTHER],
otherCount: fileTypesCounts[FileType.OTHER],
otherFileTypes: "les types restants",
oldestFiles: getOldestFiles(filesAndFolders),
biggestFiles: getBiggestFiles(filesAndFolders),
duplicateFolderCount: countDuplicateFolders(
filesAndFolders,
filesAndFoldersHashes
),
duplicateFolderPercent: getDuplicateFoldersPercent(
filesAndFolders,
filesAndFoldersHashes
),
duplicateFileCount: countDuplicateFiles(
filesAndFolders,
filesAndFoldersHashes
),
duplicateFilePercent: getDuplicateFilesPercent(
filesAndFolders,
filesAndFoldersHashes
),
duplicateTotalSize: getHumanReadableDuplicateTotalSize(
filesAndFolders,
filesAndFoldersHashes
),
duplicates: getDuplicatesWithTheMostCopy(
filesAndFolders,
filesAndFoldersHashes
),
biggestDuplicateFolders: getDuplicatesWithTheBiggestSize(
filesAndFolders,
filesAndFoldersMetadata,
filesAndFoldersHashes
),
elementsToDelete: getElementsToDelete(
filesAndFolders,
filesAndFoldersMetadata,
elementsToDelete
),
};
};

/**
* Thunk to export an audit
* @param name - name of the output file
*/
export const auditReportExporterThunk = (
name: string
): ArchifiltreThunkAction => (dispatch, getState): Promise<void> => {
): ArchifiltreThunkAction => async (dispatch, getState): Promise<void> => {
notifyInfo(
translations.t("export.auditReportStarted"),
translations.t("export.auditReportTitle")
);
await new Promise((resolve) => setTimeout(resolve, 500));

const filesAndFolders = getFilesAndFoldersFromStore(getState());
const filesAndFoldersMetadata = getFilesAndFoldersMetadataFromStore(
getState()
);
const hashes = getHashesFromStore(getState());
const elementsToDelete = getElementsToDeleteFromStore(getState());
return fs.promises.writeFile(

await fs.promises.writeFile(
name,
generateAuditReportDocx(
computeAuditReportData(
Expand All @@ -154,4 +173,11 @@ export const auditReportExporterThunk = (
)
)
);

notifySuccess(
translations.t("export.auditReportSuccess"),
translations.t("export.auditReportTitle"),
NotificationDuration.NORMAL,
() => openExternalElement(name)
);
};
5 changes: 4 additions & 1 deletion src/translations/en.json
Expand Up @@ -202,7 +202,10 @@
"treeVisualizing": "File tree visualizing",
"creatingTreeCsvExport": "Creating tree csv export",
"deletionScript": "Deletion script",
"deletionScriptSuccessMessage": "Deletion script has been generated. Click here to access it."
"deletionScriptSuccessMessage": "Deletion script has been generated. Click here to access it.",
"auditReportTitle": "Audit report",
"auditReportStarted": "The audit report export has started",
"auditReportSuccess": "The audit report export has succeeded"
},
"replay": {
"title": "Restore previous session",
Expand Down
5 changes: 4 additions & 1 deletion src/translations/fr.json
Expand Up @@ -202,7 +202,10 @@
"treeVisualizing": "Visualisation de l'arborescence",
"creatingTreeCsvExport": "Création de l'export csv hiérarchisé",
"deletionScript": "Script de suppression",
"deletionScriptSuccessMessage": "Le script de suppression a été généré. Cliquez pour y accéder."
"deletionScriptSuccessMessage": "Le script de suppression a été généré. Cliquez pour y accéder.",
"auditReportTitle": "Rapport d'audit",
"auditReportStarted": "L'export du rapport d'audit a commencé",
"auditReportSuccess": "L'export du rapport d'audit est terminé"
},
"replay": {
"title": "Chargement de la session précédente",
Expand Down

0 comments on commit 73f8850

Please sign in to comment.