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  }