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 }