github.com/akamai/AkamaiOPEN-edgegrid-golang/v5@v5.0.0/pkg/gtm/geomap.go (about) 1 package gtm 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 ) 8 9 // 10 // Handle Operations on gtm geomaps 11 // Based on 1.4 schema 12 // 13 14 // GeoMaps contains operations available on a GeoMap resource. 15 type GeoMaps interface { 16 // NewGeoMap creates a new GeoMap object. 17 NewGeoMap(context.Context, string) *GeoMap 18 // NewGeoAssignment instantiates new Assignment struct. 19 NewGeoAssignment(context.Context, *GeoMap, int, string) *GeoAssignment 20 // ListGeoMaps retrieves all GeoMaps. 21 // 22 // See: https://techdocs.akamai.com/gtm/reference/get-geographic-maps 23 ListGeoMaps(context.Context, string) ([]*GeoMap, error) 24 // GetGeoMap retrieves a GeoMap with the given name. 25 // 26 // See: https://techdocs.akamai.com/gtm/reference/get-geographic-map 27 GetGeoMap(context.Context, string, string) (*GeoMap, error) 28 // CreateGeoMap creates the datacenter identified by the receiver argument in the specified domain. 29 // 30 // See: https://techdocs.akamai.com/gtm/reference/put-geographic-map 31 CreateGeoMap(context.Context, *GeoMap, string) (*GeoMapResponse, error) 32 // DeleteGeoMap deletes the datacenter identified by the receiver argument from the domain specified. 33 // 34 // See: https://techdocs.akamai.com/gtm/reference/delete-geographic-map 35 DeleteGeoMap(context.Context, *GeoMap, string) (*ResponseStatus, error) 36 // UpdateGeoMap updates the datacenter identified in the receiver argument in the provided domain. 37 // 38 // See: https://techdocs.akamai.com/gtm/reference/put-geographic-map 39 UpdateGeoMap(context.Context, *GeoMap, string) (*ResponseStatus, error) 40 } 41 42 // GeoAssignment represents a GTM geo assignment element 43 type GeoAssignment struct { 44 DatacenterBase 45 Countries []string `json:"countries"` 46 } 47 48 // GeoMap represents a GTM GeoMap 49 type GeoMap struct { 50 DefaultDatacenter *DatacenterBase `json:"defaultDatacenter"` 51 Assignments []*GeoAssignment `json:"assignments,omitempty"` 52 Name string `json:"name"` 53 Links []*Link `json:"links,omitempty"` 54 } 55 56 // GeoMapList represents the returned GTM GeoMap List body 57 type GeoMapList struct { 58 GeoMapItems []*GeoMap `json:"items"` 59 } 60 61 // Validate validates GeoMap 62 func (geo *GeoMap) Validate() error { 63 64 if len(geo.Name) < 1 { 65 return fmt.Errorf("GeoMap is missing Name") 66 } 67 if geo.DefaultDatacenter == nil { 68 return fmt.Errorf("GeoMap is missing DefaultDatacenter") 69 } 70 71 return nil 72 } 73 74 func (p *gtm) NewGeoMap(ctx context.Context, name string) *GeoMap { 75 76 logger := p.Log(ctx) 77 logger.Debug("NewGeoMap") 78 79 geomap := &GeoMap{Name: name} 80 return geomap 81 } 82 83 func (p *gtm) ListGeoMaps(ctx context.Context, domainName string) ([]*GeoMap, error) { 84 85 logger := p.Log(ctx) 86 logger.Debug("ListGeoMaps") 87 88 var geos GeoMapList 89 getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/geographic-maps", domainName) 90 req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil) 91 if err != nil { 92 return nil, fmt.Errorf("failed to create ListGeoMaps request: %w", err) 93 } 94 setVersionHeader(req, schemaVersion) 95 resp, err := p.Exec(req, &geos) 96 if err != nil { 97 return nil, fmt.Errorf("ListGeoMaps request failed: %w", err) 98 } 99 100 if resp.StatusCode != http.StatusOK { 101 return nil, p.Error(resp) 102 } 103 104 return geos.GeoMapItems, nil 105 } 106 107 func (p *gtm) GetGeoMap(ctx context.Context, name, domainName string) (*GeoMap, error) { 108 109 logger := p.Log(ctx) 110 logger.Debug("GetGeoMap") 111 112 var geo GeoMap 113 getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/geographic-maps/%s", domainName, name) 114 req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil) 115 if err != nil { 116 return nil, fmt.Errorf("failed to create GetGeoMap request: %w", err) 117 } 118 setVersionHeader(req, schemaVersion) 119 resp, err := p.Exec(req, &geo) 120 if err != nil { 121 return nil, fmt.Errorf("GetGeoMap request failed: %w", err) 122 } 123 124 if resp.StatusCode != http.StatusOK { 125 return nil, p.Error(resp) 126 } 127 128 return &geo, nil 129 } 130 131 func (p *gtm) NewGeoAssignment(ctx context.Context, _ *GeoMap, dcID int, nickname string) *GeoAssignment { 132 133 logger := p.Log(ctx) 134 logger.Debug("NewGeoAssignment") 135 136 geoAssign := &GeoAssignment{} 137 geoAssign.DatacenterId = dcID 138 geoAssign.Nickname = nickname 139 140 return geoAssign 141 } 142 143 func (p *gtm) CreateGeoMap(ctx context.Context, geo *GeoMap, domainName string) (*GeoMapResponse, error) { 144 145 logger := p.Log(ctx) 146 logger.Debug("CreateGeoMap") 147 148 // Use common code. Any specific validation needed? 149 return geo.save(ctx, p, domainName) 150 } 151 152 func (p *gtm) UpdateGeoMap(ctx context.Context, geo *GeoMap, domainName string) (*ResponseStatus, error) { 153 154 logger := p.Log(ctx) 155 logger.Debug("UpdateGeoMap") 156 157 // common code 158 stat, err := geo.save(ctx, p, domainName) 159 if err != nil { 160 return nil, err 161 } 162 return stat.Status, err 163 } 164 165 // Save GeoMap in given domain. Common path for Create and Update. 166 func (geo *GeoMap) save(ctx context.Context, p *gtm, domainName string) (*GeoMapResponse, error) { 167 168 if err := geo.Validate(); err != nil { 169 return nil, fmt.Errorf("GeoMap validation failed. %w", err) 170 } 171 172 putURL := fmt.Sprintf("/config-gtm/v1/domains/%s/geographic-maps/%s", domainName, geo.Name) 173 req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil) 174 if err != nil { 175 return nil, fmt.Errorf("failed to create GeoMap request: %w", err) 176 } 177 178 var mapresp GeoMapResponse 179 setVersionHeader(req, schemaVersion) 180 resp, err := p.Exec(req, &mapresp, geo) 181 if err != nil { 182 return nil, fmt.Errorf("GeoMap request failed: %w", err) 183 } 184 185 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 186 return nil, p.Error(resp) 187 } 188 189 return &mapresp, nil 190 } 191 192 func (p *gtm) DeleteGeoMap(ctx context.Context, geo *GeoMap, domainName string) (*ResponseStatus, error) { 193 194 logger := p.Log(ctx) 195 logger.Debug("DeleteGeoMap") 196 197 if err := geo.Validate(); err != nil { 198 logger.Errorf("Resource validation failed. %w", err) 199 return nil, fmt.Errorf("GeoMap validation failed. %w", err) 200 } 201 202 delURL := fmt.Sprintf("/config-gtm/v1/domains/%s/geographic-maps/%s", domainName, geo.Name) 203 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, delURL, nil) 204 if err != nil { 205 return nil, fmt.Errorf("failed to create Delete request: %w", err) 206 } 207 208 var mapresp ResponseBody 209 setVersionHeader(req, schemaVersion) 210 resp, err := p.Exec(req, &mapresp) 211 if err != nil { 212 return nil, fmt.Errorf("GeoMap request failed: %w", err) 213 } 214 215 if resp.StatusCode != http.StatusOK { 216 return nil, p.Error(resp) 217 } 218 219 return mapresp.Status, nil 220 }