Skip to content

Commit 012e8d1

Browse files
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP-API into dev
2 parents 996e75c + 077c068 commit 012e8d1

6 files changed

Lines changed: 695 additions & 0 deletions

File tree

Config/CIPPDBCacheTypes.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,11 @@
294294
"friendlyName": "SharePoint Site Usage",
295295
"description": "SharePoint site usage statistics"
296296
},
297+
{
298+
"type": "SiteActivity",
299+
"friendlyName": "Site Activity",
300+
"description": "Per-site activity with siteType classification (SharePoint, SharePointAndTeams, OneDrive) and separate workload activity columns"
301+
},
297302
{
298303
"type": "SharePointSharingLinks",
299304
"friendlyName": "SharePoint & OneDrive Sharing Links",
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
function Get-CIPPAlertInactiveSharePointSites {
2+
<#
3+
.FUNCTIONALITY
4+
Entrypoint
5+
#>
6+
[CmdletBinding()]
7+
param (
8+
[Parameter(Mandatory = $false)]
9+
[Alias('input')]
10+
$InputValue,
11+
$TenantFilter
12+
)
13+
14+
$HasSharePoint = Test-CIPPStandardLicense -StandardName 'InactiveSharePointSites' -TenantFilter $TenantFilter -Preset SharePoint
15+
if (-not $HasSharePoint) {
16+
return
17+
}
18+
19+
try {
20+
$DaysSinceActivity = 90
21+
$IncludeNeverActive = $false
22+
23+
if ($InputValue -is [hashtable] -or $InputValue -is [PSCustomObject]) {
24+
if ($null -ne $InputValue.IncludeNeverActive) {
25+
$IncludeNeverActive = [bool]$InputValue.IncludeNeverActive
26+
}
27+
if ($null -ne $InputValue.DaysSinceActivity -and $InputValue.DaysSinceActivity -ne '') {
28+
$ParsedDays = 0
29+
if ([int]::TryParse($InputValue.DaysSinceActivity.ToString(), [ref]$ParsedDays) -and $ParsedDays -gt 0) {
30+
$DaysSinceActivity = $ParsedDays
31+
}
32+
}
33+
} elseif ($InputValue) {
34+
$ParsedDays = 0
35+
if ([int]::TryParse($InputValue.ToString(), [ref]$ParsedDays) -and $ParsedDays -gt 0) {
36+
$DaysSinceActivity = $ParsedDays
37+
}
38+
}
39+
40+
$Lookup = (Get-Date).AddDays(-$DaysSinceActivity).Date
41+
42+
$SiteActivityRows = @(New-CIPPDbRequest -TenantFilter $TenantFilter -Type 'SiteActivity')
43+
if (-not $SiteActivityRows) {
44+
return
45+
}
46+
47+
$AlertData = foreach ($Site in $SiteActivityRows) {
48+
if ($Site.isDeleted -eq $true) { continue }
49+
if ($Site.siteType -ne 'SharePoint') { continue }
50+
51+
$LastActivity = $Site.effectiveLastActivityDate
52+
if (-not $LastActivity) {
53+
if (-not $IncludeNeverActive) { continue }
54+
} elseif ([DateTime]$LastActivity -gt $Lookup) {
55+
continue
56+
}
57+
58+
$SiteUrl = $Site.webUrl
59+
$SiteLabel = $Site.displayName ?? $SiteUrl
60+
if ([string]::IsNullOrWhiteSpace($SiteLabel) -and $Site.ownerDisplayName) {
61+
$SiteLabel = $Site.ownerDisplayName
62+
}
63+
64+
$LastActivityDisplay = if ($LastActivity) { $LastActivity } else { 'Never' }
65+
$DaysSinceActivityValue = if ($LastActivity) {
66+
[Math]::Round(((Get-Date).Date - [DateTime]$LastActivity).TotalDays)
67+
} else {
68+
'N/A'
69+
}
70+
71+
$OwnerPart = if ($Site.ownerPrincipalName) { " Owner: $($Site.ownerPrincipalName)." } else { '' }
72+
$Message = "Site '$SiteLabel' ($SiteUrl) SharePoint last active $LastActivityDisplay.$OwnerPart"
73+
74+
[PSCustomObject]@{
75+
Message = $Message
76+
Id = $Site.siteId
77+
siteId = $Site.siteId
78+
webUrl = $SiteUrl
79+
displayName = $Site.displayName
80+
ownerPrincipalName = $Site.ownerPrincipalName
81+
lastActivityDate = $LastActivityDisplay
82+
DaysSinceActivity = $DaysSinceActivityValue
83+
rootWebTemplate = $Site.rootWebTemplate
84+
cachedAt = $Site.cachedAt
85+
reportPeriod = $Site.reportPeriod
86+
teamLinkResolutionStatus = $Site.teamLinkResolutionStatus
87+
Tenant = $TenantFilter
88+
}
89+
}
90+
91+
if ($AlertData) {
92+
Write-AlertTrace -cmdletName $MyInvocation.MyCommand -tenantFilter $TenantFilter -data $AlertData
93+
}
94+
} catch {
95+
$ErrorMessage = Get-CippException -Exception $_
96+
Write-AlertMessage -message "Inactive SharePoint sites alert failed: $($ErrorMessage.NormalizedError)" -tenant $TenantFilter -LogData $ErrorMessage
97+
}
98+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
function Get-CIPPAlertInactiveTeamsSites {
2+
<#
3+
.FUNCTIONALITY
4+
Entrypoint
5+
#>
6+
[CmdletBinding()]
7+
param (
8+
[Parameter(Mandatory = $false)]
9+
[Alias('input')]
10+
$InputValue,
11+
$TenantFilter
12+
)
13+
14+
$HasTeams = Test-CIPPStandardLicense -StandardName 'InactiveTeamsSites' -TenantFilter $TenantFilter -Preset Teams
15+
if (-not $HasTeams) {
16+
return
17+
}
18+
19+
try {
20+
$DaysSinceActivity = 90
21+
$IncludeNeverActive = $false
22+
23+
if ($InputValue -is [hashtable] -or $InputValue -is [PSCustomObject]) {
24+
if ($null -ne $InputValue.IncludeNeverActive) {
25+
$IncludeNeverActive = [bool]$InputValue.IncludeNeverActive
26+
}
27+
if ($null -ne $InputValue.DaysSinceActivity -and $InputValue.DaysSinceActivity -ne '') {
28+
$ParsedDays = 0
29+
if ([int]::TryParse($InputValue.DaysSinceActivity.ToString(), [ref]$ParsedDays) -and $ParsedDays -gt 0) {
30+
$DaysSinceActivity = $ParsedDays
31+
}
32+
}
33+
} elseif ($InputValue) {
34+
$ParsedDays = 0
35+
if ([int]::TryParse($InputValue.ToString(), [ref]$ParsedDays) -and $ParsedDays -gt 0) {
36+
$DaysSinceActivity = $ParsedDays
37+
}
38+
}
39+
40+
$Lookup = (Get-Date).AddDays(-$DaysSinceActivity).Date
41+
42+
$SiteActivityRows = @(New-CIPPDbRequest -TenantFilter $TenantFilter -Type 'SiteActivity')
43+
if (-not $SiteActivityRows) {
44+
return
45+
}
46+
47+
$AlertData = foreach ($Site in $SiteActivityRows) {
48+
if ($Site.isDeleted -eq $true) { continue }
49+
if ($Site.siteType -ne 'SharePointAndTeams') { continue }
50+
51+
$LastActivity = $Site.effectiveLastActivityDate
52+
if (-not $LastActivity) {
53+
if (-not $IncludeNeverActive) { continue }
54+
} elseif ([datetime]$LastActivity -gt $Lookup) {
55+
continue
56+
}
57+
58+
$TeamsSiteUrl = $Site.webUrl
59+
$TeamsSiteLabel = $Site.teamsTeamName ?? $Site.displayName ?? $TeamsSiteUrl
60+
if ([string]::IsNullOrWhiteSpace($TeamsSiteLabel) -and $Site.ownerDisplayName) {
61+
$TeamsSiteLabel = $Site.ownerDisplayName
62+
}
63+
64+
$LastActivityDisplay = if ($LastActivity) { $LastActivity } else { 'Never' }
65+
$DaysSinceActivityValue = if ($LastActivity) {
66+
[Math]::Round(((Get-Date).Date - [datetime]$LastActivity).TotalDays)
67+
} else {
68+
'N/A'
69+
}
70+
71+
$OwnerPart = if ($Site.ownerPrincipalName) { " Owner: $($Site.ownerPrincipalName)." } else { '' }
72+
$Message = "TeamsSite '$TeamsSiteLabel' ($TeamsSiteUrl) Teams last active $LastActivityDisplay.$OwnerPart"
73+
74+
[PSCustomObject]@{
75+
Message = $Message
76+
Id = $Site.siteId
77+
siteId = $Site.siteId
78+
teamsSiteName = $TeamsSiteLabel
79+
teamsSiteUrl = $TeamsSiteUrl
80+
teamsTeamId = $Site.teamsTeamId
81+
teamsTeamName = $Site.teamsTeamName
82+
teamsLastActivityDate = $LastActivityDisplay
83+
DaysSinceActivity = $DaysSinceActivityValue
84+
sharePointLastActivityDate = $Site.sharePointLastActivityDate
85+
effectiveLastActivityDate = $Site.effectiveLastActivityDate
86+
ownerPrincipalName = $Site.ownerPrincipalName
87+
teamLinkResolutionStatus = $Site.teamLinkResolutionStatus
88+
cachedAt = $Site.cachedAt
89+
reportPeriod = $Site.reportPeriod
90+
Tenant = $TenantFilter
91+
}
92+
}
93+
94+
if ($AlertData) {
95+
Write-AlertTrace -cmdletName $MyInvocation.MyCommand -tenantFilter $TenantFilter -data $AlertData
96+
}
97+
} catch {
98+
$ErrorMessage = Get-CippException -Exception $_
99+
Write-AlertMessage -message "Inactive TeamsSite alert failed: $($ErrorMessage.NormalizedError)" -tenant $TenantFilter -LogData $ErrorMessage
100+
}
101+
}

Modules/CIPPCore/Public/Invoke-CIPPDBCacheCollection.ps1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ function Invoke-CIPPDBCacheCollection {
142142
'SPOTenant'
143143
'SPOTenantSyncClientRestriction'
144144
'SharePointSiteUsage'
145+
'SiteActivity'
145146
'OneDriveUsage'
146147
)
147148
Teams = @(

0 commit comments

Comments
 (0)