Skip to content

Commit 521e5c0

Browse files
committed
add emergency address resource and datasource
Signed-off-by: kenchan0130 <1155067+kenchan0130@users.noreply.github.com>
1 parent 9d90b23 commit 521e5c0

File tree

10 files changed

+1052
-0
lines changed

10 files changed

+1052
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs with own template
3+
page_title: "zoom_phone_emergency_address Data Source - zoom"
4+
subcategory: "Phone"
5+
description: |-
6+
Fetches information about a specific Zoom Phone emergency address.
7+
API Permissions
8+
The following API permissions are required in order to use this data source.
9+
This data source requires the phone:read:emergency_address:admin.
10+
---
11+
12+
# zoom_phone_emergency_address (Data Source)
13+
14+
Fetches information about a specific Zoom Phone emergency address.
15+
16+
## API Permissions
17+
18+
The following API permissions are required in order to use this data source.
19+
This data source requires the `phone:read:emergency_address:admin`.
20+
21+
22+
23+
<!-- schema generated by tfplugindocs -->
24+
## Schema
25+
26+
### Required
27+
28+
- `id` (String) The emergency address ID.
29+
30+
### Read-Only
31+
32+
- `address_line1` (String) The emergency address line 1.
33+
- `address_line2` (String) The emergency address line 2.
34+
- `city` (String) The emergency address city.
35+
- `country` (String) The two-lettered country code (Alpha-2 code in ISO-3166 format) of the emergency address.
36+
- `is_default` (Boolean) Indicates whether the emergency address is default or not.
37+
- `level` (String) The emergency address owner level.
38+
- `0`: Account/Company-level emergency address.
39+
- `1`: User/Personal-level emergency address.
40+
- `2`: Unknown company/pending emergency address.
41+
- `site_id` (String) The unique identifier of the site to which this emergency address belongs.
42+
- `state_code` (String) The emergency address state code.
43+
- `status` (String) The emergency address verification status.
44+
- `1`: Verification not required.
45+
- `2`: Unverified.
46+
- `3`: Verification requested.
47+
- `4`: Verified.
48+
- `5`: Rejected.
49+
- `6`: Verification failed.
50+
- `user_id` (String) User ID to which the personal emergency address belongs.
51+
- `zip` (String) The emergency address zip code.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs with own template
3+
page_title: "zoom_phone_emergency_address Resource - zoom"
4+
subcategory: "Phone"
5+
description: |-
6+
Manages a emergency address within Zoom Phone.
7+
API Permissions
8+
The following API permissions are required in order to use this resource.
9+
This resource requires the phone:read:emergency_address:admin, phone:write:emergency_address:admin, phone:update:emergency_address:admin, phone:delete:emergency_address:admin.
10+
---
11+
12+
# zoom_phone_emergency_address (Resource)
13+
14+
Manages a emergency address within Zoom Phone.
15+
16+
## API Permissions
17+
18+
The following API permissions are required in order to use this resource.
19+
This resource requires the `phone:read:emergency_address:admin`, `phone:write:emergency_address:admin`, `phone:update:emergency_address:admin`, `phone:delete:emergency_address:admin`.
20+
21+
22+
23+
<!-- schema generated by tfplugindocs -->
24+
## Schema
25+
26+
### Required
27+
28+
- `address_line1` (String) The emergency address line 1.
29+
- `city` (String) The emergency address city.
30+
- `country` (String) The two-lettered country code (Alpha-2 code in ISO-3166 format) of the emergency address.
31+
- `state_code` (String) The emergency address state code.
32+
- `zip` (String) The emergency address zip code.
33+
34+
### Optional
35+
36+
- `address_line2` (String) The emergency address line 2.
37+
- `is_default` (Boolean) Indicates whether the emergency address is default or not.
38+
- `site_id` (String) The unique identifier of the site to which this emergency address belongs. Exactly one of `site_id` or `user_id` must be specified.
39+
- `user_id` (String) User ID to which the personal emergency address belongs. Exactly one of `site_id` or `user_id` must be specified.
40+
41+
### Read-Only
42+
43+
- `id` (String) The emergency address ID.
44+
- `level` (Number) The emergency address owner level.
45+
- `0`: Account/Company-level emergency address.
46+
- `1`: User/Personal-level emergency address.
47+
- `2`: Unknown company/pending emergency address.
48+
- `status` (Number) The emergency address verification status.
49+
- `1`: Verification not required.
50+
- `2`: Unverified.
51+
- `3`: Verification requested.
52+
- `4`: Verified.
53+
- `5`: Rejected.
54+
- `6`: Verification failed.
55+
56+

internal/provider/provider.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/folio-sec/terraform-provider-zoom/internal/services/phone/callqueuemember"
2020
"github.com/folio-sec/terraform-provider-zoom/internal/services/phone/callqueuephonenumber"
2121
"github.com/folio-sec/terraform-provider-zoom/internal/services/phone/callqueuepolicy"
22+
"github.com/folio-sec/terraform-provider-zoom/internal/services/phone/emergencyaddress"
2223
"github.com/folio-sec/terraform-provider-zoom/internal/services/phone/externalcontact"
2324
"github.com/folio-sec/terraform-provider-zoom/internal/services/phone/phonenumbers"
2425
"github.com/folio-sec/terraform-provider-zoom/internal/services/phone/sharedlinegroup"
@@ -229,6 +230,7 @@ func (p *ZoomProvider) Resources(_ context.Context) []func() resource.Resource {
229230
usercallingplans.NewPhoneUserCallingPlansResource,
230231
userphonenumber.NewPhoneUserPhoneNumbersResource,
231232
site.NewPhoneSiteResource,
233+
emergencyaddress.NewEmergencyAddressResource,
232234
}
233235
}
234236

@@ -242,6 +244,7 @@ func (p *ZoomProvider) DataSources(_ context.Context) []func() datasource.DataSo
242244
sharedlinegroup.NewPhoneSharedLineGroupDataSource,
243245
user.NewUsersDataSource,
244246
site.NewPhoneSiteDataSource,
247+
emergencyaddress.NewDataSource,
245248
}
246249
}
247250

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package emergencyaddress
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
8+
"github.com/folio-sec/terraform-provider-zoom/generated/api/zoomphone"
9+
"github.com/folio-sec/terraform-provider-zoom/internal/util"
10+
"github.com/hashicorp/terraform-plugin-framework/types"
11+
)
12+
13+
type crud struct {
14+
client *zoomphone.Client
15+
}
16+
17+
func newCrud(client *zoomphone.Client) *crud {
18+
return &crud{
19+
client: client,
20+
}
21+
}
22+
23+
func (c *crud) create(ctx context.Context, req *createDto) (*readDto, error) {
24+
res, err := c.client.AddEmergencyAddress(ctx, zoomphone.NewOptAddEmergencyAddressReq(
25+
zoomphone.AddEmergencyAddressReq{
26+
AddressLine1: req.addressLine1.ValueString(),
27+
AddressLine2: util.ToPhoneOptString(req.addressLine2),
28+
City: req.city.ValueString(),
29+
Country: req.country.ValueString(),
30+
IsDefault: util.ToPhoneOptBool(req.isDefault),
31+
SiteID: util.ToPhoneOptString(req.siteID),
32+
StateCode: req.state.ValueString(),
33+
Zip: req.zip.ValueString(),
34+
}))
35+
if err != nil {
36+
return nil, err
37+
}
38+
39+
return &readDto{
40+
id: util.FromOptString(res.ID),
41+
addressLine1: util.FromOptString(res.AddressLine1),
42+
addressLine2: util.FromOptString(res.AddressLine2),
43+
city: util.FromOptString(res.City),
44+
country: util.FromOptString(res.Country),
45+
isDefault: util.FromOptBool(res.IsDefault),
46+
level: util.FromOptInt(res.Level),
47+
site: readDtoSite{
48+
ID: util.FromOptString(res.Site.Value.ID),
49+
Name: util.FromOptString(res.Site.Value.Name),
50+
},
51+
owner: readDtoOwner{
52+
ID: util.FromOptString(res.Owner.Value.ID),
53+
ExtensionNumber: util.FromOptInt64(res.Owner.Value.ExtensionNumber),
54+
Name: util.FromOptString(res.Owner.Value.Name),
55+
},
56+
stateCode: util.FromOptString(res.StateCode),
57+
status: util.FromOptInt(res.Status),
58+
zip: util.FromOptString(res.Zip),
59+
}, nil
60+
}
61+
62+
func (c *crud) read(ctx context.Context, emergencyAddressID types.String) (*readDto, error) {
63+
res, err := c.client.GetEmergencyAddress(ctx, zoomphone.GetEmergencyAddressParams{
64+
EmergencyAddressId: emergencyAddressID.ValueString(),
65+
})
66+
if err != nil {
67+
var status *zoomphone.ErrorResponseStatusCode
68+
if errors.As(err, &status) {
69+
if status.StatusCode == 400 && status.Response.Code.Value == 300 {
70+
return nil, nil // already deleted
71+
}
72+
}
73+
return nil, fmt.Errorf("unable to read phone emergency address: %v", err)
74+
}
75+
76+
return &readDto{
77+
id: util.FromOptString(res.ID),
78+
addressLine1: util.FromOptString(res.AddressLine1),
79+
addressLine2: util.FromOptString(res.AddressLine2),
80+
city: util.FromOptString(res.City),
81+
country: util.FromOptString(res.Country),
82+
isDefault: util.FromOptBool(res.IsDefault),
83+
level: util.FromOptInt(res.Level),
84+
site: readDtoSite{
85+
ID: util.FromOptString(res.Site.Value.ID),
86+
Name: util.FromOptString(res.Site.Value.Name),
87+
},
88+
owner: readDtoOwner{
89+
ID: util.FromOptString(res.Owner.Value.ID),
90+
ExtensionNumber: util.FromOptInt64(res.Owner.Value.ExtensionNumber),
91+
Name: util.FromOptString(res.Owner.Value.Name),
92+
},
93+
stateCode: util.FromOptString(res.StateCode),
94+
status: util.FromOptInt(res.Status),
95+
zip: util.FromOptString(res.Zip),
96+
}, nil
97+
}
98+
99+
func (c *crud) update(ctx context.Context, req *updateDto) error {
100+
_, err := c.client.UpdateEmergencyAddress(ctx, zoomphone.NewOptUpdateEmergencyAddressReq(
101+
zoomphone.UpdateEmergencyAddressReq{
102+
AddressLine1: zoomphone.NewOptString(req.addressLine1.ValueString()),
103+
AddressLine2: zoomphone.NewOptString(req.addressLine2.ValueString()),
104+
City: zoomphone.NewOptString(req.city.ValueString()),
105+
Country: zoomphone.NewOptString(req.country.ValueString()),
106+
IsDefault: zoomphone.NewOptBool(req.isDefault.ValueBool()),
107+
StateCode: zoomphone.NewOptString(req.state.ValueString()),
108+
Zip: zoomphone.NewOptString(req.zip.ValueString()),
109+
}), zoomphone.UpdateEmergencyAddressParams{
110+
EmergencyAddressId: req.id.ValueString(),
111+
})
112+
if err != nil {
113+
return fmt.Errorf("error updating phone emergency address: %v", err)
114+
}
115+
116+
return nil
117+
}
118+
119+
func (c *crud) delete(ctx context.Context, emergencyAddressID types.String) error {
120+
err := c.client.DeleteEmergencyAddress(ctx, zoomphone.DeleteEmergencyAddressParams{
121+
EmergencyAddressId: emergencyAddressID.ValueString(),
122+
})
123+
if err != nil {
124+
var status *zoomphone.ErrorResponseStatusCode
125+
if errors.As(err, &status) {
126+
if status.StatusCode == 400 && status.Response.Code.Value == 404 {
127+
return nil // already deleted
128+
}
129+
}
130+
return fmt.Errorf("error deleting phone emergency address: %v", err)
131+
}
132+
133+
return nil
134+
}

0 commit comments

Comments
 (0)