@@ -742,6 +742,21 @@ FROM audits WHERE action = 'entity.bulk.delete'`);
742742const getProjectsWithDescriptions = ( ) => ( { all } ) => all ( sql `
743743select id as "projectId", length(trim(description)) as description_length from projects where coalesce(trim(description),'')!=''` ) ;
744744
745+ // Group deleted dataset and properties by project (by tracing actee ID parent)
746+ // Datasets can be deleted and purged so we can't look at their project IDs.
747+ // Projects can be archived but not deleted so this query should be fine.
748+ const countDeletedDatasetAndPropertiesByProject = ( ) => ( { all } ) =>
749+ all ( sql `SELECT
750+ projects.id as "projectId",
751+ SUM(CASE WHEN audits.action = 'dataset.delete' THEN 1 ELSE 0 END) AS dataset_count,
752+ SUM(CASE WHEN audits.action = 'dataset.update.property.delete' THEN 1 ELSE 0 END) AS property_count
753+ FROM audits
754+ JOIN actees ON audits."acteeId" = actees."id"
755+ JOIN projects ON actees."parent" = projects."acteeId"
756+ WHERE audits.action IN ('dataset.delete', 'dataset.update.property.delete')
757+ AND actees.species = 'dataset'
758+ GROUP BY projects.id` ) ;
759+
745760const projectMetrics = ( ) => ( ( { Analytics } ) => runSequentially ( [
746761 Analytics . countUsersPerRole ,
747762 Analytics . countAppUsers ,
@@ -760,14 +775,15 @@ const projectMetrics = () => (({ Analytics }) => runSequentially([
760775 Analytics . countSubmissionsComments ,
761776 Analytics . countSubmissionsByUserType ,
762777 Analytics . getProjectsWithDescriptions ,
778+ Analytics . countDeletedDatasetAndPropertiesByProject ,
763779 Analytics . getDatasets ,
764780 Analytics . getDatasetEvents ,
765781 Analytics . getDatasetProperties ,
766782 Analytics . countEntitiesWithGeometry
767783] ) . then ( ( [ userRoles , appUsers , deviceIds , pubLinks ,
768784 forms , formGeoRepeats , formsEncrypt , formStates , webforms , reusedIds , entityForms ,
769785 subs , subStates , subEdited , subComments , subUsers ,
770- projWithDesc , datasets , datasetEvents , datasetProperties , entitiesWithGeometry ] ) => {
786+ projWithDesc , deletedDatasetCounts , datasets , datasetEvents , datasetProperties , entitiesWithGeometry ] ) => {
771787 const projects = { } ;
772788
773789 // users
@@ -935,6 +951,12 @@ const projectMetrics = () => (({ Analytics }) => runSequentially([
935951 project . other . description_length = row . description_length ;
936952 }
937953
954+ for ( const row of deletedDatasetCounts ) {
955+ const project = _getProject ( projects , row . projectId ) ;
956+ project . other . num_datasets_deleted = row . dataset_count ;
957+ project . other . num_dataset_properties_deleted = row . property_count ;
958+ }
959+
938960 // Order projects by ID
939961 const projArray = Object . entries ( projects ) . sort ( ( a , b ) => a [ 0 ] - b [ 0 ] ) . map ( ( k ) => k [ 1 ] ) ;
940962 return projArray ;
@@ -1115,5 +1137,6 @@ module.exports = {
11151137 countEntitiesWithGeometry,
11161138 countMultiEntityErrors,
11171139 countEntityBulkDeletes,
1118- checkLoginCustomization
1140+ checkLoginCustomization,
1141+ countDeletedDatasetAndPropertiesByProject
11191142} ;
0 commit comments