diff --git a/database.go b/database.go index ba740a6..ccc1e38 100644 --- a/database.go +++ b/database.go @@ -70,11 +70,12 @@ type SupportedSoftwareVersion struct { // RestoreDatabaseRequest is the request body for restoring a database type RestoreDatabaseRequest struct { - Name string `json:"name"` - Software string `json:"software"` - NetworkID string `json:"network_id"` - Backup string `json:"backup"` - Region string `json:"region"` + // Name is the name of the database restore + Name string `json:"name"` + // Backup is the name of the database backup + Backup string `json:"backup"` + // Region is the name of the region + Region string `json:"region"` } // ListDatabases returns a list of all databases diff --git a/database_backup.go b/database_backup.go index 8d65a5c..2ab9cfe 100644 --- a/database_backup.go +++ b/database_backup.go @@ -4,19 +4,21 @@ import ( "bytes" "encoding/json" "fmt" + "strings" + "time" ) // DatabaseBackup represents a backup type DatabaseBackup struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - Software string `json:"software,omitempty"` - Status string `json:"status,omitempty"` - Schedule string `json:"schedule,omitempty"` - DatabaseName string `json:"database_name,omitempty"` - DatabaseID string `json:"database_id,omitempty"` - Backup string `json:"backup,omitempty"` - IsScheduled bool `json:"is_scheduled,omitempty"` + ID string `json:"id,omitempty"` + Name string `json:"name,omitempty"` + Software string `json:"software,omitempty"` + Status string `json:"status,omitempty"` + Schedule string `json:"schedule,omitempty"` + DatabaseName string `json:"database_name,omitempty"` + DatabaseID string `json:"database_id,omitempty"` + IsScheduled bool `json:"is_scheduled,omitempty"` + CreatedAt time.Time `json:"created_at"` } // PaginatedDatabaseBackup is the structure for list response from DB endpoint @@ -29,19 +31,24 @@ type PaginatedDatabaseBackup struct { // DatabaseBackupCreateRequest represents a backup create request type DatabaseBackupCreateRequest struct { - Name string `json:"name"` + // Name is the name of the database backup to be created + Name string `json:"name"` + // Schedule is used for scheduled backup Schedule string `json:"schedule"` - Count int32 `json:"count"` - Type string `json:"type"` - Region string `json:"region"` + // Types is used for manual backup + Type string `json:"type"` + // Region is name of the region + Region string `json:"region"` } // DatabaseBackupUpdateRequest represents a backup update request type DatabaseBackupUpdateRequest struct { - Name string `json:"name"` + // Name is name name of the backup + Name string `json:"name"` + // Schedule is schedule for scheduled backup Schedule string `json:"schedule"` - Count int32 `json:"count"` - Region string `json:"region"` + // Region is name of the region + Region string `json:"region"` } // ListDatabaseBackup lists backups for database @@ -88,3 +95,62 @@ func (c *Client) CreateDatabaseBackup(did string, v *DatabaseBackupCreateRequest return result, nil } + +// DeleteDatabaseBackup deletes a database backup +func (c *Client) DeleteDatabaseBackup(dbid, id string) (*SimpleResponse, error) { + resp, err := c.SendDeleteRequest(fmt.Sprintf("/v2/databases/%s/backups/%s", dbid, id)) + if err != nil { + return nil, decodeError(err) + } + + return c.DecodeSimpleResponse(resp) +} + +// GetDatabaseBackup finds a database by the database UUID +func (c *Client) GetDatabaseBackup(dbid, id string) (*DatabaseBackup, error) { + resp, err := c.SendGetRequest(fmt.Sprintf("/v2/databases/%s/backups/%s", dbid, id)) + if err != nil { + return nil, decodeError(err) + } + + bk := &DatabaseBackup{} + if err := json.NewDecoder(bytes.NewReader(resp)).Decode(bk); err != nil { + return nil, err + } + + return bk, nil +} + +// FindDatabaseBackup finds a database by either part of the ID or part of the name +func (c *Client) FindDatabaseBackup(dbid, search string) (*DatabaseBackup, error) { + backups, err := c.ListDatabaseBackup(dbid) + if err != nil { + return nil, decodeError(err) + } + + exactMatch := false + partialMatchesCount := 0 + result := DatabaseBackup{} + + for _, value := range backups.Items { + if strings.EqualFold(value.Name, search) || value.ID == search { + exactMatch = true + result = value + } else if strings.Contains(strings.ToUpper(value.Name), strings.ToUpper(search)) || strings.Contains(value.ID, search) { + if !exactMatch { + result = value + partialMatchesCount++ + } + } + } + + if exactMatch || partialMatchesCount == 1 { + return &result, nil + } else if partialMatchesCount > 1 { + err := fmt.Errorf("unable to find %s because there were multiple matches", search) + return nil, MultipleMatchesError.wrap(err) + } else { + err := fmt.Errorf("unable to find %s, zero matches", search) + return nil, ZeroMatchesError.wrap(err) + } +}