|
| 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