portainer/portainer

View on GitHub
api/dataservices/base.go

Summary

Maintainability
A
0 mins
Test Coverage
package dataservices

import (
    portainer "github.com/portainer/portainer/api"

    "golang.org/x/exp/constraints"
)

type BaseCRUD[T any, I constraints.Integer] interface {
    Create(element *T) error
    Read(ID I) (*T, error)
    ReadAll() ([]T, error)
    Update(ID I, element *T) error
    Delete(ID I) error
}

type BaseDataService[T any, I constraints.Integer] struct {
    Bucket     string
    Connection portainer.Connection
}

func (s *BaseDataService[T, I]) BucketName() string {
    return s.Bucket
}

func (service *BaseDataService[T, I]) Tx(tx portainer.Transaction) BaseDataServiceTx[T, I] {
    return BaseDataServiceTx[T, I]{
        Bucket:     service.Bucket,
        Connection: service.Connection,
        Tx:         tx,
    }
}

func (service BaseDataService[T, I]) Read(ID I) (*T, error) {
    var element *T

    return element, service.Connection.ViewTx(func(tx portainer.Transaction) error {
        var err error
        element, err = service.Tx(tx).Read(ID)

        return err
    })
}

func (service BaseDataService[T, I]) ReadAll() ([]T, error) {
    var collection = make([]T, 0)

    return collection, service.Connection.ViewTx(func(tx portainer.Transaction) error {
        var err error
        collection, err = service.Tx(tx).ReadAll()

        return err
    })
}

func (service BaseDataService[T, I]) Update(ID I, element *T) error {
    return service.Connection.UpdateTx(func(tx portainer.Transaction) error {
        return service.Tx(tx).Update(ID, element)
    })
}

func (service BaseDataService[T, I]) Delete(ID I) error {
    return service.Connection.UpdateTx(func(tx portainer.Transaction) error {
        return service.Tx(tx).Delete(ID)
    })
}