@@ -10,72 +10,108 @@ Function Invoke-ListSites {
10
10
[CmdletBinding ()]
11
11
param ($Request , $TriggerMetadata )
12
12
13
- $APIName = $TriggerMetadata.FunctionName
14
- Write-LogMessage - user $request.headers .' x-ms-client-principal' - API $APINAME - message ' Accessed this API' - Sev ' Debug'
13
+ $TenantFilter = $Request.Query.TenantFilter
14
+ $Type = $request.query.Type
15
+ $UserUPN = $request.query.UserUPN
15
16
17
+ if (! $TenantFilter ) {
18
+ Push-OutputBinding - Name Response - Value ([HttpResponseContext ]@ {
19
+ StatusCode = [HttpStatusCode ]::BadRequest
20
+ Body = ' TenantFilter is required'
21
+ })
22
+ return
23
+ }
16
24
17
- # Write to the Azure Functions log stream.
18
- Write-Host ' PowerShell HTTP trigger function processed a request.'
25
+ if (! $Type ) {
26
+ Push-OutputBinding - Name Response - Value ([HttpResponseContext ]@ {
27
+ StatusCode = [HttpStatusCode ]::BadRequest
28
+ Body = ' Type is required'
29
+ })
30
+ return
31
+ }
32
+
33
+ $Tenant = Get-Tenants - TenantFilter $TenantFilter
34
+ $TenantId = $Tenant.customerId
35
+
36
+ if ($Type -eq ' SharePointSiteUsage' ) {
37
+ $Filter = ' isPersonalSite eq false'
38
+ } else {
39
+ $Filter = ' isPersonalSite eq true'
40
+ }
19
41
20
- # Interact with query parameters or the body of the request.
21
- $TenantFilter = $Request.Query.TenantFilter
22
- $type = $request.query.Type
23
- $UserUPN = $request.query.UserUPN
24
42
try {
25
- $Result = New-GraphGetRequest - uri " https://graph.microsoft.com/beta/reports/get$ ( $type ) Detail(period='D7')" - tenantid $TenantFilter | ConvertFrom-Csv
43
+ $BulkRequests = @ (
44
+ @ {
45
+ id = ' listAllSites'
46
+ method = ' GET'
47
+ url = " sites/getAllSites?`$ filter=$ ( $Filter ) &`$ select=id,createdDateTime,description,name,displayName,isPersonalSite,lastModifiedDateTime,webUrl,siteCollection,sharepointIds"
48
+ }
49
+ @ {
50
+ id = ' usage'
51
+ method = ' GET'
52
+ url = " reports/get$ ( $type ) Detail(period='D7')?`$ format=application/json"
53
+ }
54
+ )
26
55
27
- if ($UserUPN ) {
28
- $ParsedRequest = $Result | Where-Object { $_ .' Owner Principal Name' -eq $UserUPN }
29
- } else {
30
- $ParsedRequest = $Result
56
+ $Result = New-GraphBulkRequest - tenantid $TenantFilter - Requests @ ($BulkRequests ) - asapp $true
57
+ $Sites = ($Result | Where-Object { $_.id -eq ' listAllSites' }).body.value
58
+ $UsageBase64 = ($Result | Where-Object { $_.id -eq ' usage' }).body
59
+ $UsageJson = [System.Text.Encoding ]::UTF8.GetString([System.Convert ]::FromBase64String($UsageBase64 ))
60
+ $Usage = ($UsageJson | ConvertFrom-Json ).value
61
+
62
+ $GraphRequest = foreach ($Site in $Sites ) {
63
+ $SiteUsage = $Usage | Where-Object { $_.siteId -eq $Site.sharepointIds.siteId }
64
+ [PSCustomObject ]@ {
65
+ siteId = $Site.sharepointIds.siteId
66
+ webId = $Site.sharepointIds.webId
67
+ createdDateTime = $Site.createdDateTime
68
+ displayName = $Site.displayName
69
+ webUrl = $Site.webUrl
70
+ ownerDisplayName = $SiteUsage.ownerDisplayName
71
+ ownerPrincipalName = $SiteUsage.ownerPrincipalName
72
+ lastActivityDate = $SiteUsage.lastActivityDate
73
+ fileCount = $SiteUsage.fileCount
74
+ storageUsedInGigabytes = [math ]::round($SiteUsage.storageUsedInBytes / 1 GB , 2 )
75
+ storageAllocatedInGigabytes = [math ]::round($SiteUsage.storageAllocatedInBytes / 1 GB , 2 )
76
+ storageUsedInBytes = $SiteUsage.storageUsedInBytes
77
+ storageAllocatedInBytes = $SiteUsage.storageAllocatedInBytes
78
+ rootWebTemplate = $SiteUsage.rootWebTemplate
79
+ reportRefreshDate = $SiteUsage.reportRefreshDate
80
+ AutoMapUrl = ' '
81
+ }
31
82
}
32
- $GraphRequest = $ParsedRequest | Select-Object AutoMapUrl, @ { Name = ' UPN' ; Expression = { $_ .' Owner Principal Name' } },
33
- @ { Name = ' displayName' ; Expression = { $_ .' Owner Display Name' } },
34
- @ { Name = ' LastActive' ; Expression = { $_ .' Last Activity Date' } },
35
- @ { Name = ' FileCount' ; Expression = { [int ]$_ .' File Count' } },
36
- @ { Name = ' UsedGB' ; Expression = { [math ]::round($_ .' Storage Used (Byte)' / 1 GB , 2 ) } },
37
- @ { Name = ' URL' ; Expression = { $_ .' Site URL' } },
38
- @ { Name = ' Allocated' ; Expression = { [math ]::round($_ .' Storage Allocated (Byte)' / 1 GB , 2 ) } },
39
- @ { Name = ' Template' ; Expression = { $_ .' Root Web Template' } },
40
- @ { Name = ' siteid' ; Expression = { $_ .' site Id' } }
41
83
42
- # Temporary workaround for url as report is broken.
43
- # This API is so stupid its great.
44
- $URLs = New-GraphGetRequest - uri ' https://graph.microsoft.com/beta/sites/getAllSites?$select=SharePointIds,name,webUrl,displayName,siteCollection' - asapp $true - tenantid $TenantFilter
45
84
$int = 0
46
85
if ($Type -eq ' SharePointSiteUsage' ) {
47
- $Requests = foreach ($url in $URLs ) {
86
+ $Requests = foreach ($Site in $GraphRequest ) {
48
87
@ {
49
88
id = $int ++
50
89
method = ' GET'
51
- url = " sites/$ ( $url .sharepointIds .siteId ) /lists?`$ select=id,name,list,parentReference"
90
+ url = " sites/$ ( $Site .siteId ) /lists?`$ select=id,name,list,parentReference"
52
91
}
53
92
}
54
93
$Requests = (New-GraphBulkRequest - tenantid $TenantFilter - scope ' https://graph.microsoft.com/.default' - Requests @ ($Requests ) - asapp $true ).body.value | Where-Object { $_.list.template -eq ' DocumentLibrary' }
94
+ $GraphRequest = foreach ($Site in $GraphRequest ) {
95
+ $ListId = ($Requests | Where-Object { $_.parentReference.siteId -like " *$ ( $Site.siteId ) *" }).id
96
+ $site.AutoMapUrl = " tenantId=$ ( $TenantId ) &webId={$ ( $Site.webId ) }&siteid={$ ( $Site.siteId ) }&webUrl=$ ( $Site.webUrl ) &listId={$ ( $ListId ) }"
97
+ $site
98
+ }
55
99
}
56
- $GraphRequest = foreach ($site in $GraphRequest ) {
57
- $SiteURLs = ($URLs.SharePointIds | Where-Object { $_.siteId -eq $site.SiteId })
58
- $site.URL = $SiteURLs.siteUrl
59
- $ListId = ($Requests | Where-Object { $_.parentReference.siteId -like " *$ ( $SiteURLs.siteId ) *" }).id
60
- $site.AutoMapUrl = " tenantId=$ ( $SiteUrls.tenantId ) &webId={$ ( $SiteUrls.webId ) }&siteid={$ ( $SiteURLs.siteId ) }&webUrl=$ ( $SiteURLs.siteUrl ) &listId={$ ( $ListId ) }"
61
- $site
62
- }
63
-
64
100
$StatusCode = [HttpStatusCode ]::OK
65
-
101
+
66
102
} catch {
67
103
$ErrorMessage = Get-NormalizedError - Message $_.Exception.Message
68
104
$StatusCode = [HttpStatusCode ]::Forbidden
69
105
$GraphRequest = $ErrorMessage
70
106
}
71
107
if ($Request.query.URLOnly -eq ' true' ) {
72
- $GraphRequest = $GraphRequest | Where-Object { $null -ne $_.URL }
108
+ $GraphRequest = $GraphRequest | Where-Object { $null -ne $_.webUrl }
73
109
}
74
110
75
111
# Associate values to output bindings by calling 'Push-OutputBinding'.
76
112
Push-OutputBinding - Name Response - Value ([HttpResponseContext ]@ {
77
113
StatusCode = $StatusCode
78
- Body = @ ($GraphRequest | Sort-Object - Property UPN )
114
+ Body = @ ($GraphRequest | Sort-Object - Property displayName )
79
115
})
80
116
81
117
}
0 commit comments