krystal/go-katapult

View on GitHub
core/file_storage_volumes.go

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
package core

import (
    "context"
    "net/url"

    "github.com/krystal/go-katapult"
)

type FileStorageVolume struct {
    ID           string                 `json:"id,omitempty"`
    Name         string                 `json:"name,omitempty"`
    DataCenter   *DataCenter            `json:"data_center,omitempty"`
    Associations []string               `json:"associations,omitempty"`
    State        FileStorageVolumeState `json:"state,omitempty"`
    NFSLocation  string                 `json:"nfs_location,omitempty"`
    Size         int64                  `json:"size,omitempty"`
}

func (fsv *FileStorageVolume) Ref() FileStorageVolumeRef {
    return FileStorageVolumeRef{ID: fsv.ID}
}

type FileStorageVolumeRef struct {
    ID string `json:"id"`
}

func (fsr FileStorageVolumeRef) queryValues() *url.Values {
    return &url.Values{"file_storage_volume[id]": []string{fsr.ID}}
}

type FileStorageVolumeState string

const (
    FileStorageVolumePending     FileStorageVolumeState = "pending"
    FileStorageVolumeFailed      FileStorageVolumeState = "failed"
    FileStorageVolumeReady       FileStorageVolumeState = "ready"
    FileStorageVolumeConfiguring FileStorageVolumeState = "configuring"
)

type FileStorageVolumesClient struct {
    client   RequestMaker
    basePath *url.URL
}

func NewFileStorageVolumesClient(rm RequestMaker) *FileStorageVolumesClient {
    return &FileStorageVolumesClient{
        client:   rm,
        basePath: &url.URL{Path: "/core/v1/"},
    }
}

func (fsvc *FileStorageVolumesClient) List(
    ctx context.Context,
    org OrganizationRef,
    opts *ListOptions,
    reqOpts ...katapult.RequestOption,
) ([]*FileStorageVolume, *katapult.Response, error) {
    qs := queryValues(org, opts)
    u := &url.URL{
        Path:     "organizations/_/file_storage_volumes",
        RawQuery: qs.Encode(),
    }

    body, resp, err := fsvc.doRequest(ctx, "GET", u, nil, reqOpts...)
    resp.Pagination = body.Pagination

    return body.FileStorageVolumes, resp, err
}

func (fsvc *FileStorageVolumesClient) Get(
    ctx context.Context,
    ref FileStorageVolumeRef,
    reqOpts ...katapult.RequestOption,
) (*FileStorageVolume, *katapult.Response, error) {
    u := &url.URL{
        Path:     "file_storage_volumes/_",
        RawQuery: ref.queryValues().Encode(),
    }
    body, resp, err := fsvc.doRequest(ctx, "GET", u, nil, reqOpts...)

    return body.FileStorageVolume, resp, err
}

func (fsvc *FileStorageVolumesClient) GetByID(
    ctx context.Context,
    id string,
    reqOpts ...katapult.RequestOption,
) (*FileStorageVolume, *katapult.Response, error) {
    return fsvc.Get(ctx, FileStorageVolumeRef{ID: id}, reqOpts...)
}

type FileStorageVolumeCreateArguments struct {
    Name         string        `json:"name,omitempty"`
    DataCenter   DataCenterRef `json:"data_center,omitempty"`
    Associations []string      `json:"associations,omitempty"`
}

type fileStorageVolumeCreateRequest struct {
    Organization OrganizationRef                   `json:"organization"`
    Properties   *FileStorageVolumeCreateArguments `json:"properties,omitempty"`
}

func (fsvc *FileStorageVolumesClient) Create(
    ctx context.Context,
    org OrganizationRef,
    args *FileStorageVolumeCreateArguments,
    reqOpts ...katapult.RequestOption,
) (*FileStorageVolume, *katapult.Response, error) {
    u := &url.URL{Path: "organizations/_/file_storage_volumes"}
    reqBody := &fileStorageVolumeCreateRequest{
        Organization: org,
        Properties:   args,
    }

    body, resp, err := fsvc.doRequest(ctx, "POST", u, reqBody, reqOpts...)

    return body.FileStorageVolume, resp, err
}

type FileStorageVolumeUpdateArguments struct {
    Name         string    `json:"name,omitempty"`
    Associations *[]string `json:"associations,omitempty"`
}

type fileStorageVolumeUpdateRequest struct {
    FileStorageVolume FileStorageVolumeRef              `json:"file_storage_volume"`
    Properties        *FileStorageVolumeUpdateArguments `json:"properties,omitempty"`
}

func (fsvc *FileStorageVolumesClient) Update(
    ctx context.Context,
    ref FileStorageVolumeRef,
    args *FileStorageVolumeUpdateArguments,
    reqOpts ...katapult.RequestOption,
) (*FileStorageVolume, *katapult.Response, error) {
    u := &url.URL{Path: "file_storage_volumes/_"}
    reqBody := &fileStorageVolumeUpdateRequest{
        FileStorageVolume: ref,
        Properties:        args,
    }

    body, resp, err := fsvc.doRequest(ctx, "PATCH", u, reqBody, reqOpts...)

    return body.FileStorageVolume, resp, err
}

func (fsvc *FileStorageVolumesClient) Delete(
    ctx context.Context,
    ref FileStorageVolumeRef,
    reqOpts ...katapult.RequestOption,
) (*FileStorageVolume, *TrashObject, *katapult.Response, error) {
    u := &url.URL{
        Path:     "file_storage_volumes/_",
        RawQuery: ref.queryValues().Encode(),
    }
    body, resp, err := fsvc.doRequest(ctx, "DELETE", u, nil, reqOpts...)

    return body.FileStorageVolume, body.TrashObject, resp, err
}

type fileStorageVolumesResponseBody struct {
    Pagination         *katapult.Pagination `json:"pagination,omitempty"`
    TrashObject        *TrashObject         `json:"trash_object,omitempty"`
    FileStorageVolumes []*FileStorageVolume `json:"file_storage_volumes,omitempty"`
    FileStorageVolume  *FileStorageVolume   `json:"file_storage_volume,omitempty"`
}

func (fsvc *FileStorageVolumesClient) doRequest(
    ctx context.Context,
    method string,
    u *url.URL,
    body interface{},
    reqOpts ...katapult.RequestOption,
) (*fileStorageVolumesResponseBody, *katapult.Response, error) {
    u = fsvc.basePath.ResolveReference(u)
    respBody := &fileStorageVolumesResponseBody{}

    req := katapult.NewRequest(method, u, body, reqOpts...)
    resp, err := fsvc.client.Do(ctx, req, respBody)
    if resp == nil {
        resp = katapult.NewResponse(nil)
    }

    return respBody, resp, handleResponseError(err)
}