github.com/aiven/aiven-go-client@v1.36.0/database.go (about)

     1  package aiven
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  type (
     8  	// Database represents a database type on Aiven.
     9  	Database struct {
    10  		DatabaseName string `json:"database_name"`
    11  		LcCollate    string `json:"lc_collate,omitempty"`
    12  		LcType       string `json:"lc_ctype,omitempty"`
    13  	}
    14  
    15  	// DatabasesHandler is the client which interacts with the Aiven database
    16  	// endpoints.
    17  	DatabasesHandler struct {
    18  		client *Client
    19  	}
    20  
    21  	// CreateDatabaseRequest contains the parameters used to create a database.
    22  	CreateDatabaseRequest struct {
    23  		Database  string `json:"database"`
    24  		LcCollate string `json:"lc_collate,omitempty"`
    25  		LcType    string `json:"lc_ctype,omitempty"`
    26  	}
    27  
    28  	// DatabaseListResponse represents the response from Aiven for listing
    29  	// databases.
    30  	DatabaseListResponse struct {
    31  		APIResponse
    32  		Databases []*Database `json:"databases"`
    33  	}
    34  )
    35  
    36  // Create creates a database with the given parameters.
    37  func (h *DatabasesHandler) Create(project, service string, req CreateDatabaseRequest) (*Database, error) {
    38  	path := buildPath("project", project, "service", service, "db")
    39  	bts, err := h.client.doPostRequest(path, req)
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  
    44  	errR := checkAPIResponse(bts, nil)
    45  	if errR != nil {
    46  		return nil, err
    47  	}
    48  
    49  	db := Database{DatabaseName: req.Database, LcCollate: req.LcCollate, LcType: req.LcType}
    50  	return &db, nil
    51  }
    52  
    53  // Get returns a specific database from Aiven.
    54  func (h *DatabasesHandler) Get(projectName, serviceName, databaseName string) (*Database, error) {
    55  	// There's no API for getting database by name. List all databases and pick the correct one
    56  	// instead. (There typically aren't that many databases, 100 is already very large number)
    57  	databases, err := h.List(projectName, serviceName)
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	for _, database := range databases {
    63  		if database.DatabaseName == databaseName {
    64  			return database, nil
    65  		}
    66  	}
    67  
    68  	err = Error{Message: fmt.Sprintf("Database with name %v not found", databaseName), Status: 404}
    69  	return nil, err
    70  }
    71  
    72  // Delete removes the specified database.
    73  func (h *DatabasesHandler) Delete(project, service, database string) error {
    74  	path := buildPath("project", project, "service", service, "db", database)
    75  	bts, err := h.client.doDeleteRequest(path, nil)
    76  	if err != nil {
    77  		return err
    78  	}
    79  
    80  	return checkAPIResponse(bts, nil)
    81  }
    82  
    83  // List will return all the databases for a given service.
    84  func (h *DatabasesHandler) List(project, service string) ([]*Database, error) {
    85  	path := buildPath("project", project, "service", service, "db")
    86  	rsp, err := h.client.doGetRequest(path, nil)
    87  	if err != nil {
    88  		return nil, err
    89  	}
    90  
    91  	var r DatabaseListResponse
    92  	errR := checkAPIResponse(rsp, &r)
    93  
    94  	return r.Databases, errR
    95  }