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