Skip to content

Commit 0d60695

Browse files
Merge pull request KelvinTegelaar#1479 from kris6673/equipment
Feat: Equipment pages add/edit/list
2 parents 3c574aa + b13f6d3 commit 0d60695

File tree

6 files changed

+326
-46
lines changed

6 files changed

+326
-46
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using namespace System.Net
2+
3+
Function Invoke-AddEquipmentMailbox {
4+
<#
5+
.FUNCTIONALITY
6+
Entrypoint
7+
.ROLE
8+
Exchange.Equipment.ReadWrite
9+
#>
10+
[CmdletBinding()]
11+
param($Request, $TriggerMetadata)
12+
13+
$APIName = $Request.Params.CIPPEndpoint
14+
$Headers = $Request.Headers
15+
Write-LogMessage -headers $Headers -API $APIName -message 'Accessed this API' -Sev 'Debug'
16+
17+
$Tenant = $Request.Body.tenantID
18+
19+
$Results = [System.Collections.Generic.List[Object]]::new()
20+
$MailboxObject = $Request.Body
21+
22+
# Create the equipment mailbox
23+
$NewMailboxParams = @{
24+
Name = $MailboxObject.username
25+
DisplayName = $MailboxObject.displayName
26+
Equipment = $true
27+
PrimarySmtpAddress = $MailboxObject.userPrincipalName
28+
}
29+
30+
try {
31+
# Create the equipment mailbox
32+
$AddEquipmentRequest = New-ExoRequest -tenantid $Tenant -cmdlet 'New-Mailbox' -cmdParams $NewMailboxParams
33+
$Results.Add("Successfully created equipment mailbox: $($MailboxObject.displayName)")
34+
35+
# Block sign-in for the mailbox
36+
try {
37+
$BlockSignInRequest = Set-CIPPSignInState -userid $AddEquipmentRequest.ExternalDirectoryObjectId -TenantFilter $Tenant -APIName $APINAME -Headers $Headers -AccountEnabled $false
38+
if ($BlockSignInRequest -like 'Could not disable*') { throw $BlockSignInRequest }
39+
$Results.Add("Blocked sign-in for Equipment mailbox; $($MailboxObject.userPrincipalName)")
40+
} catch {
41+
$ErrorMessage = Get-CippException -Exception $_
42+
$Results.Add("Failed to block sign-in for Equipment mailbox: $($MailboxObject.userPrincipalName). Error: $($ErrorMessage.NormalizedError)")
43+
}
44+
Write-LogMessage -headers $Headers -API $APIName -tenant $Tenant -message "Created equipment mailbox $($MailboxObject.displayName)" -Sev 'Info'
45+
$StatusCode = [HttpStatusCode]::OK
46+
47+
} catch {
48+
$ErrorMessage = Get-CippException -Exception $_
49+
$Message = "Failed to create equipment mailbox: $($MailboxObject.displayName). Error: $($ErrorMessage.NormalizedError)"
50+
Write-LogMessage -headers $Headers -API $APIName -tenant $Tenant -message $Message -Sev 'Error' -LogData $ErrorMessage
51+
$Results.Add($Message)
52+
$StatusCode = [HttpStatusCode]::Forbidden
53+
}
54+
55+
$Body = [pscustomobject]@{ 'Results' = @($Results) }
56+
57+
# Associate values to output bindings by calling 'Push-OutputBinding'.
58+
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
59+
StatusCode = $StatusCode
60+
Body = $Body
61+
})
62+
}

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Resources/Invoke-AddRoomMailbox.ps1

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ Function Invoke-AddRoomMailbox {
3232

3333
# Block sign-in for the mailbox
3434
try {
35-
$Request = Set-CIPPSignInState -userid $AddRoomRequest.ExternalDirectoryObjectId -TenantFilter $Tenant -APIName $APINAME -Headers $Headers -AccountEnabled $false
35+
$BlockSignInRequest = Set-CIPPSignInState -userid $AddRoomRequest.ExternalDirectoryObjectId -TenantFilter $Tenant -APIName $APINAME -Headers $Headers -AccountEnabled $false
36+
if ($BlockSignInRequest -like 'Could not disable*') { throw $BlockSignInRequest }
3637
$Results.Add("Blocked sign-in for Room mailbox; $($MailboxObject.userPrincipalName)")
3738
} catch {
3839
$ErrorMessage = Get-CippException -Exception $_
@@ -41,8 +42,9 @@ Function Invoke-AddRoomMailbox {
4142
$StatusCode = [HttpStatusCode]::OK
4243
} catch {
4344
$ErrorMessage = Get-CippException -Exception $_
44-
Write-LogMessage -Headers $Headers -API $APIName -tenant $Tenant -message "Failed to create room: $($MailboxObject.DisplayName). Error: $($ErrorMessage.NormalizedError)" -Sev 'Error' -LogData $ErrorMessage
45-
$Results.Add("Failed to create Room mailbox $($MailboxObject.userPrincipalName). $($ErrorMessage.NormalizedError)")
45+
$Message = "Failed to create room mailbox: $($MailboxObject.DisplayName). Error: $($ErrorMessage.NormalizedError)"
46+
Write-LogMessage -Headers $Headers -API $APIName -tenant $Tenant -message $Message -Sev 'Error' -LogData $ErrorMessage
47+
$Results.Add($Message)
4648
$StatusCode = [HttpStatusCode]::InternalServerError
4749
}
4850

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
using namespace System.Net
2+
3+
Function Invoke-EditEquipmentMailbox {
4+
<#
5+
.FUNCTIONALITY
6+
Entrypoint
7+
.ROLE
8+
Exchange.Equipment.ReadWrite
9+
#>
10+
[CmdletBinding()]
11+
param($Request, $TriggerMetadata)
12+
13+
$APIName = $Request.Params.CIPPEndpoint
14+
$Headers = $Request.Headers
15+
Write-LogMessage -headers $Headers -API $APIName -message 'Accessed this API' -Sev 'Debug'
16+
$Tenant = $Request.Body.tenantID
17+
18+
$Results = [System.Collections.Generic.List[Object]]::new()
19+
$MailboxObject = $Request.Body
20+
21+
# First update the mailbox properties
22+
$UpdateMailboxParams = @{
23+
Identity = $MailboxObject.equipmentId
24+
DisplayName = $MailboxObject.displayName
25+
}
26+
27+
if (![string]::IsNullOrWhiteSpace($MailboxObject.hiddenFromAddressListsEnabled)) {
28+
$UpdateMailboxParams.Add('HiddenFromAddressListsEnabled', $MailboxObject.hiddenFromAddressListsEnabled)
29+
}
30+
31+
# Then update the user properties
32+
$UpdateUserParams = @{
33+
Identity = $MailboxObject.equipmentId
34+
}
35+
36+
# Add optional parameters if they exist
37+
$UserProperties = @(
38+
'Location', 'Department', 'Company',
39+
'Phone', 'Tags',
40+
'StreetAddress', 'City', 'StateOrProvince', 'CountryOrRegion',
41+
'PostalCode'
42+
)
43+
44+
foreach ($prop in $UserProperties) {
45+
if (![string]::IsNullOrWhiteSpace($MailboxObject.$prop)) {
46+
$UpdateUserParams[$prop] = $MailboxObject.$prop
47+
}
48+
}
49+
50+
# Then update the calendar properties
51+
$UpdateCalendarParams = @{
52+
Identity = $MailboxObject.equipmentId
53+
}
54+
55+
$CalendarProperties = @(
56+
'AllowConflicts', 'AllowRecurringMeetings', 'BookingWindowInDays',
57+
'MaximumDurationInMinutes', 'ProcessExternalMeetingMessages',
58+
'ForwardRequestsToDelegates', 'ScheduleOnlyDuringWorkHours', 'AutomateProcessing'
59+
)
60+
61+
foreach ($prop in $CalendarProperties) {
62+
if (![string]::IsNullOrWhiteSpace($MailboxObject.$prop)) {
63+
$UpdateCalendarParams[$prop] = $MailboxObject.$prop
64+
}
65+
}
66+
67+
# Then update the calendar configuration
68+
$UpdateCalendarConfigParams = @{
69+
Identity = $MailboxObject.equipmentId
70+
}
71+
72+
$CalendarConfiguration = @(
73+
'WorkDays', 'WorkHoursStartTime', 'WorkHoursEndTime', 'WorkingHoursTimeZone'
74+
)
75+
76+
foreach ($prop in $CalendarConfiguration) {
77+
if (![string]::IsNullOrWhiteSpace($MailboxObject.$prop)) {
78+
$UpdateCalendarConfigParams[$prop] = $MailboxObject.$prop
79+
}
80+
}
81+
82+
try {
83+
# Update mailbox properties
84+
$null = New-ExoRequest -tenantid $Tenant -cmdlet 'Set-Mailbox' -cmdParams $UpdateMailboxParams
85+
86+
# Update user properties
87+
$null = New-ExoRequest -tenantid $Tenant -cmdlet 'Set-User' -cmdParams $UpdateUserParams
88+
$Results.Add("Successfully updated equipment: $($MailboxObject.DisplayName) (User Properties)")
89+
90+
# Update calendar properties
91+
$null = New-ExoRequest -tenantid $Tenant -cmdlet 'Set-CalendarProcessing' -cmdParams $UpdateCalendarParams
92+
$Results.Add("Successfully updated equipment: $($MailboxObject.DisplayName) (Calendar Properties)")
93+
94+
# Update calendar configuration properties
95+
$null = New-ExoRequest -tenantid $Tenant -cmdlet 'Set-MailboxCalendarConfiguration' -cmdParams $UpdateCalendarConfigParams
96+
$Results.Add("Successfully updated equipment: $($MailboxObject.DisplayName) (Calendar Configuration)")
97+
98+
Write-LogMessage -headers $Headers -API $APIName -tenant $Tenant -message "Updated equipment $($MailboxObject.DisplayName)" -Sev 'Info'
99+
$StatusCode = [HttpStatusCode]::OK
100+
101+
} catch {
102+
$ErrorMessage = Get-CippException -Exception $_
103+
Write-LogMessage -headers $Headers -API $APIName -tenant $Tenant -message "Failed to update equipment: $($MailboxObject.DisplayName). Error: $($ErrorMessage.NormalizedError)" -Sev 'Error' -LogData $ErrorMessage
104+
$Results.Add("Failed to update Equipment mailbox $($MailboxObject.userPrincipalName). $($ErrorMessage.NormalizedError)")
105+
$StatusCode = [HttpStatusCode]::Forbidden
106+
}
107+
108+
$Body = [pscustomobject]@{ 'Results' = @($Results) }
109+
110+
# Associate values to output bindings by calling 'Push-OutputBinding'.
111+
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
112+
StatusCode = $StatusCode
113+
Body = $Body
114+
})
115+
}

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Resources/Invoke-EditRoomMailbox.ps1

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ Function Invoke-EditRoomMailbox {
1010
[CmdletBinding()]
1111
param($Request, $TriggerMetadata)
1212

13-
$APIName = $TriggerMetadata.FunctionName
14-
$Tenant = $Request.body.tenantid
15-
Write-LogMessage -headers $Request.Headers -API $APIName -message 'Accessed this API' -Sev 'Debug'
13+
$APIName = $Request.Params.CIPPEndpoint
14+
$Headers = $Request.Headers
15+
Write-LogMessage -headers $Headers -API $APIName -message 'Accessed this API' -Sev 'Debug'
16+
17+
$Tenant = $Request.Body.tenantID
1618

1719

1820
$Results = [System.Collections.Generic.List[Object]]::new()
19-
$MailboxObject = $Request.body
21+
$MailboxObject = $Request.Body
2022

2123
# First update the mailbox properties
2224
$UpdateMailboxParams = @{
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
using namespace System.Net
2+
3+
Function Invoke-ListEquipment {
4+
<#
5+
.FUNCTIONALITY
6+
Entrypoint
7+
.ROLE
8+
Exchange.Equipment.ReadWrite
9+
#>
10+
[CmdletBinding()]
11+
param($Request, $TriggerMetadata)
12+
13+
$APIName = $Request.Params.CIPPEndpoint
14+
$Headers = $Request.Headers
15+
Write-LogMessage -headers $Headers -API $APIName -message 'Accessed this API' -Sev 'Debug'
16+
17+
$EquipmentId = $Request.Query.EquipmentId
18+
$Tenant = $Request.Query.TenantFilter
19+
20+
try {
21+
if ($EquipmentId) {
22+
# Get specific equipment details
23+
$Equipment = New-ExoRequest -tenantid $Tenant -cmdlet 'Get-Mailbox' -cmdParams @{
24+
Identity = $EquipmentId
25+
RecipientTypeDetails = 'EquipmentMailbox'
26+
}
27+
28+
$UserDetails = New-ExoRequest -tenantid $Tenant -cmdlet 'Get-User' -cmdParams @{
29+
Identity = $EquipmentId
30+
}
31+
32+
$CalendarProcessing = New-ExoRequest -tenantid $Tenant -cmdlet 'Get-CalendarProcessing' -cmdParams @{
33+
Identity = $EquipmentId
34+
}
35+
36+
$CalendarConfig = New-ExoRequest -tenantid $Tenant -cmdlet 'Get-MailboxCalendarConfiguration' -cmdParams @{
37+
Identity = $EquipmentId
38+
}
39+
40+
$Results = [PSCustomObject]@{
41+
# Core mailbox properties
42+
displayName = $Equipment.DisplayName
43+
hiddenFromAddressListsEnabled = $Equipment.HiddenFromAddressListsEnabled
44+
userPrincipalName = $Equipment.UserPrincipalName
45+
primarySmtpAddress = $Equipment.PrimarySmtpAddress
46+
47+
# Equipment details from Get-User
48+
department = $UserDetails.Department
49+
company = $UserDetails.Company
50+
51+
# Location information from Get-User
52+
street = $UserDetails.Street
53+
city = $UserDetails.City
54+
state = $UserDetails.State
55+
postalCode = $UserDetails.PostalCode
56+
countryOrRegion = $UserDetails.CountryOrRegion
57+
58+
# Equipment features
59+
phone = $UserDetails.Phone
60+
tags = $UserDetails.Tags
61+
62+
# Calendar properties from Get-CalendarProcessing
63+
allowConflicts = $CalendarProcessing.AllowConflicts
64+
allowRecurringMeetings = $CalendarProcessing.AllowRecurringMeetings
65+
bookingWindowInDays = $CalendarProcessing.BookingWindowInDays
66+
maximumDurationInMinutes = $CalendarProcessing.MaximumDurationInMinutes
67+
processExternalMeetingMessages = $CalendarProcessing.ProcessExternalMeetingMessages
68+
forwardRequestsToDelegates = $CalendarProcessing.ForwardRequestsToDelegates
69+
scheduleOnlyDuringWorkHours = $CalendarProcessing.ScheduleOnlyDuringWorkHours
70+
automateProcessing = $CalendarProcessing.AutomateProcessing
71+
72+
# Calendar configuration from Get-MailboxCalendarConfiguration
73+
workDays = $CalendarConfig.WorkDays
74+
workHoursStartTime = $CalendarConfig.WorkHoursStartTime
75+
workHoursEndTime = $CalendarConfig.WorkHoursEndTime
76+
workingHoursTimeZone = $CalendarConfig.WorkingHoursTimeZone
77+
}
78+
} else {
79+
# List all equipment mailboxes
80+
$Results = New-ExoRequest -tenantid $Tenant -cmdlet 'Get-Mailbox' -cmdParams @{
81+
RecipientTypeDetails = 'EquipmentMailbox'
82+
ResultSize = 'Unlimited'
83+
} | Select-Object -ExcludeProperty *data.type*
84+
}
85+
$StatusCode = [HttpStatusCode]::OK
86+
87+
} catch {
88+
$ErrorMessage = Get-NormalizedError -Message $_.Exception.Message
89+
$StatusCode = [HttpStatusCode]::Forbidden
90+
$Results = $ErrorMessage
91+
}
92+
93+
94+
# Associate values to output bindings by calling 'Push-OutputBinding'.
95+
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
96+
StatusCode = $StatusCode
97+
Body = @($Results | Sort-Object displayName)
98+
})
99+
}

0 commit comments

Comments
 (0)